1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2010 Yoshihisa Uchida
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
23 #include "codecs/libtta/ttalib.h"
28 * TTA (True Audio) codec:
31 * [1] TRUE AUDIO CODEC SOFTWARE http://true-audio.com/
34 static int32_t samples
[PCM_BUFFER_LENGTH
* 2] IBSS_ATTR
;
36 /* this is the codec entry point */
37 enum codec_status
codec_main(void)
40 int status
= CODEC_OK
;
41 unsigned int decodedsamples
;
46 /* Generic codec initialisation */
47 ci
->configure(DSP_SET_SAMPLE_DEPTH
, TTA_OUTPUT_DEPTH
- 1);
52 DEBUGF("codec_init() error\n");
57 while (!*ci
->taginfo_ready
&& !ci
->stop_codec
)
60 if (set_tta_info(&info
) < 0 || player_init(&info
) < 0)
66 codec_set_replaygain(ci
->id3
);
68 ci
->configure(DSP_SWITCH_FREQUENCY
, ci
->id3
->frequency
);
70 ci
->configure(DSP_SET_STEREO_MODE
, STEREO_INTERLEAVED
);
71 } else if (info
.NCH
== 1) {
72 ci
->configure(DSP_SET_STEREO_MODE
, STEREO_MONO
);
74 DEBUGF("CODEC_ERROR: more than 2 channels\n");
79 /* The main decoder loop */
83 if (ci
->id3
->offset
> 0)
85 /* Need to save offset for later use (cleared indirectly by advance_buffer) */
86 new_pos
= set_position(ci
->id3
->offset
, TTA_SEEK_POS
);
88 decodedsamples
= new_pos
;
95 if (ci
->stop_codec
|| ci
->new_track
)
100 new_pos
= set_position(ci
->seek_time
/ SEEK_STEP
, TTA_SEEK_TIME
);
103 decodedsamples
= new_pos
;
108 sample_count
= get_samples(samples
);
109 if (sample_count
< 0)
111 status
= CODEC_ERROR
;
114 ci
->pcmbuf_insert(samples
, NULL
, sample_count
);
115 decodedsamples
+= sample_count
;
116 if (decodedsamples
>= info
.DATALENGTH
)
118 ci
->set_elapsed((uint64_t)info
.LENGTH
* 1000 * decodedsamples
/ info
.DATALENGTH
);
123 if (ci
->request_next_track())