1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2005 Mark Arigo
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/libffmpegFLAC/shndec.h>
27 #ifndef IBSS_ATTR_SHORTEN_DECODED0
28 #define IBSS_ATTR_SHORTEN_DECODED0 IBSS_ATTR
31 int32_t decoded0
[MAX_DECODE_SIZE
] IBSS_ATTR_SHORTEN_DECODED0
;
32 int32_t decoded1
[MAX_DECODE_SIZE
] IBSS_ATTR
;
34 int32_t offset0
[MAX_OFFSET_SIZE
] IBSS_ATTR
;
35 int32_t offset1
[MAX_OFFSET_SIZE
] IBSS_ATTR
;
37 int8_t ibuf
[MAX_BUFFER_SIZE
] IBSS_ATTR
;
39 /* this is the codec entry point */
40 enum codec_status
codec_main(void)
46 int consumed
, res
, nsamples
;
49 /* Generic codec initialisation */
50 ci
->configure(DSP_SET_STEREO_MODE
, STEREO_NONINTERLEAVED
);
51 ci
->configure(DSP_SET_SAMPLE_DEPTH
, SHN_OUTPUT_DEPTH
-1);
54 /* Codec initialization */
56 LOGF("Shorten: codec_init error\n");
60 while (!*ci
->taginfo_ready
)
63 codec_set_replaygain(ci
->id3
);
65 /* Shorten decoder initialization */
66 ci
->memset(&sc
, 0, sizeof(ShortenContext
));
69 ci
->seek_buffer(ci
->id3
->first_frame_offset
);
71 /* Read the shorten & wave headers */
72 buf
= ci
->request_buffer(&bytesleft
, MAX_HEADER_SIZE
);
73 res
= shorten_init(&sc
, (unsigned char *)buf
, bytesleft
);
75 LOGF("Shorten: shorten_init error: %d\n", res
);
79 ci
->id3
->frequency
= sc
.sample_rate
;
80 ci
->configure(DSP_SWITCH_FREQUENCY
, sc
.sample_rate
);
83 ci
->id3
->length
= (sc
.totalsamples
/ sc
.sample_rate
) * 1000;
88 if (ci
->id3
->length
) {
89 ci
->id3
->bitrate
= (ci
->id3
->filesize
* 8) / ci
->id3
->length
;
92 consumed
= sc
.gb
.index
/8;
93 ci
->advance_buffer(consumed
);
94 sc
.bitindex
= sc
.gb
.index
- 8*consumed
;
97 /* The main decoding loop */
98 ci
->memset(&decoded0
, 0, sizeof(int32_t)*MAX_DECODE_SIZE
);
99 ci
->memset(&decoded1
, 0, sizeof(int32_t)*MAX_DECODE_SIZE
);
100 ci
->memset(&offset0
, 0, sizeof(int32_t)*MAX_OFFSET_SIZE
);
101 ci
->memset(&offset1
, 0, sizeof(int32_t)*MAX_OFFSET_SIZE
);
104 buf
= ci
->request_buffer(&bytesleft
, MAX_BUFFER_SIZE
);
107 if (ci
->stop_codec
|| ci
->new_track
) {
111 /* Seek to start of track */
112 if (ci
->seek_time
== 1) {
113 if (ci
->seek_buffer(sc
.header_bits
/8 + ci
->id3
->first_frame_offset
)) {
114 sc
.bitindex
= sc
.header_bits
- 8*(sc
.header_bits
/8);
123 ci
->memcpy(ibuf
, buf
, bytesleft
); /* copy buf to iram */
124 res
= shorten_decode_frames(&sc
, &nsamples
, decoded0
, decoded1
,
125 offset0
, offset1
, (unsigned char *)ibuf
,
126 bytesleft
, ci
->yield
);
128 if (res
== FN_ERROR
) {
129 LOGF("Shorten: shorten_decode_frames error (%lu)\n",
130 (unsigned long)samplesdone
);
133 /* Insert decoded samples in pcmbuf */
136 ci
->pcmbuf_insert(decoded0
+ sc
.nwrap
, decoded1
+ sc
.nwrap
,
139 /* Update the elapsed-time indicator */
140 samplesdone
+= nsamples
;
141 elapsedtime
= (samplesdone
*10) / (sc
.sample_rate
/100);
142 ci
->set_elapsed(elapsedtime
);
145 /* End of shorten stream...go to next track */
150 consumed
= sc
.gb
.index
/8;
151 ci
->advance_buffer(consumed
);
152 buf
= ci
->request_buffer(&bytesleft
, MAX_BUFFER_SIZE
);
153 sc
.bitindex
= sc
.gb
.index
- 8*consumed
;
156 if (ci
->request_next_track())