diff options
Diffstat (limited to 'apps')
-rw-r--r-- | apps/codecs.c | 3 | ||||
-rw-r--r-- | apps/codecs/mpa.c | 20 | ||||
-rw-r--r-- | apps/playback.c | 49 |
3 files changed, 39 insertions, 33 deletions
diff --git a/apps/codecs.c b/apps/codecs.c index d3a9d9e9c1..400e7fbfcf 100644 --- a/apps/codecs.c +++ b/apps/codecs.c | |||
@@ -277,6 +277,9 @@ int codec_load_file(const char *plugin) | |||
277 | int fd; | 277 | int fd; |
278 | int rc; | 278 | int rc; |
279 | 279 | ||
280 | /* zero out codec buffer to ensure a properly zeroed bss area */ | ||
281 | memset(codecbuf, 0, CODEC_SIZE); | ||
282 | |||
280 | fd = open(plugin, O_RDONLY); | 283 | fd = open(plugin, O_RDONLY); |
281 | if (fd < 0) { | 284 | if (fd < 0) { |
282 | snprintf(msgbuf, sizeof(msgbuf)-1, "Couldn't load codec: %s", plugin); | 285 | snprintf(msgbuf, sizeof(msgbuf)-1, "Couldn't load codec: %s", plugin); |
diff --git a/apps/codecs/mpa.c b/apps/codecs/mpa.c index 5cf4eb8730..5d6f7d29ad 100644 --- a/apps/codecs/mpa.c +++ b/apps/codecs/mpa.c | |||
@@ -39,12 +39,6 @@ void abort(void) { | |||
39 | 39 | ||
40 | 40 | ||
41 | #define INPUT_CHUNK_SIZE 8192 | 41 | #define INPUT_CHUNK_SIZE 8192 |
42 | #define OUTPUT_BUFFER_SIZE 65536 /* Must be an integer multiple of 4. */ | ||
43 | |||
44 | unsigned char OutputBuffer[OUTPUT_BUFFER_SIZE]; | ||
45 | unsigned char *OutputPtr; | ||
46 | unsigned char *GuardPtr = NULL; | ||
47 | const unsigned char *OutputBufferEnd = OutputBuffer + OUTPUT_BUFFER_SIZE; | ||
48 | 42 | ||
49 | mad_fixed_t mad_frame_overlap[2][32][18] IDATA_ATTR; | 43 | mad_fixed_t mad_frame_overlap[2][32][18] IDATA_ATTR; |
50 | unsigned char mad_main_data[MAD_BUFFER_MDLEN] IDATA_ATTR; | 44 | unsigned char mad_main_data[MAD_BUFFER_MDLEN] IDATA_ATTR; |
@@ -115,7 +109,6 @@ enum codec_status codec_start(struct codec_api* api) | |||
115 | 109 | ||
116 | first_frame = false; | 110 | first_frame = false; |
117 | file_end = 0; | 111 | file_end = 0; |
118 | OutputPtr = OutputBuffer; | ||
119 | 112 | ||
120 | while (!*ci->taginfo_ready) | 113 | while (!*ci->taginfo_ready) |
121 | ci->yield(); | 114 | ci->yield(); |
@@ -195,7 +188,7 @@ enum codec_status codec_start(struct codec_api* api) | |||
195 | } | 188 | } |
196 | else if(MAD_RECOVERABLE(Stream.error)) | 189 | else if(MAD_RECOVERABLE(Stream.error)) |
197 | { | 190 | { |
198 | if(Stream.error!=MAD_ERROR_LOSTSYNC || Stream.this_frame!=GuardPtr) | 191 | if(Stream.error!=MAD_ERROR_LOSTSYNC) |
199 | { | 192 | { |
200 | // rb->splash(HZ*1, true, "Recoverable...!"); | 193 | // rb->splash(HZ*1, true, "Recoverable...!"); |
201 | } | 194 | } |
@@ -209,9 +202,9 @@ enum codec_status codec_start(struct codec_api* api) | |||
209 | Status=1; | 202 | Status=1; |
210 | break; | 203 | break; |
211 | } | 204 | } |
205 | break ; | ||
212 | } | 206 | } |
213 | if (Stream.next_frame) | 207 | |
214 | ci->advance_buffer_loc((void *)Stream.next_frame); | ||
215 | file_end = false; | 208 | file_end = false; |
216 | /* ?? Do we need the timer module? */ | 209 | /* ?? Do we need the timer module? */ |
217 | // mad_timer_add(&Timer,Frame.header.duration); | 210 | // mad_timer_add(&Timer,Frame.header.duration); |
@@ -222,7 +215,7 @@ enum codec_status codec_start(struct codec_api* api) | |||
222 | /* We skip start_skip number of samples here, this should only happen for | 215 | /* We skip start_skip number of samples here, this should only happen for |
223 | very first frame in the stream. */ | 216 | very first frame in the stream. */ |
224 | /* TODO: possible for start_skip to exceed one frames worth of samples? */ | 217 | /* TODO: possible for start_skip to exceed one frames worth of samples? */ |
225 | 218 | ||
226 | if (MAD_NCHANNELS(&Frame.header) == 2) { | 219 | if (MAD_NCHANNELS(&Frame.header) == 2) { |
227 | if (current_stereo_mode != STEREO_NONINTERLEAVED) { | 220 | if (current_stereo_mode != STEREO_NONINTERLEAVED) { |
228 | ci->configure(DSP_SET_STEREO_MODE, (int *)STEREO_NONINTERLEAVED); | 221 | ci->configure(DSP_SET_STEREO_MODE, (int *)STEREO_NONINTERLEAVED); |
@@ -241,6 +234,11 @@ enum codec_status codec_start(struct codec_api* api) | |||
241 | } | 234 | } |
242 | start_skip = 0; /* not very elegant, and might want to keep this value */ | 235 | start_skip = 0; /* not very elegant, and might want to keep this value */ |
243 | 236 | ||
237 | if (Stream.next_frame) | ||
238 | ci->advance_buffer_loc((void *)Stream.next_frame); | ||
239 | else | ||
240 | ci->advance_buffer(size); | ||
241 | |||
244 | samplesdone += Synth.pcm.length; | 242 | samplesdone += Synth.pcm.length; |
245 | samplecount -= Synth.pcm.length; | 243 | samplecount -= Synth.pcm.length; |
246 | ci->set_elapsed(samplesdone / (frequency_divider / 10)); | 244 | ci->set_elapsed(samplesdone / (frequency_divider / 10)); |
diff --git a/apps/playback.c b/apps/playback.c index 13c66a43b5..f9caff1c4f 100644 --- a/apps/playback.c +++ b/apps/playback.c | |||
@@ -659,12 +659,12 @@ void audio_fill_file_buffer(void) | |||
659 | buf_widx -= codecbuflen; | 659 | buf_widx -= codecbuflen; |
660 | i += rc; | 660 | i += rc; |
661 | tracks[track_widx].available += rc; | 661 | tracks[track_widx].available += rc; |
662 | tracks[track_widx].filerem -= rc; | ||
663 | tracks[track_widx].filepos += rc; | ||
662 | codecbufused += rc; | 664 | codecbufused += rc; |
663 | fill_bytesleft -= rc; | 665 | fill_bytesleft -= rc; |
664 | } | 666 | } |
665 | 667 | ||
666 | tracks[track_widx].filerem -= i; | ||
667 | tracks[track_widx].filepos += i; | ||
668 | /*logf("Filled:%d/%d", tracks[track_widx].available, | 668 | /*logf("Filled:%d/%d", tracks[track_widx].available, |
669 | tracks[track_widx].filerem);*/ | 669 | tracks[track_widx].filerem);*/ |
670 | } | 670 | } |
@@ -890,26 +890,29 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) | |||
890 | 890 | ||
891 | /* Starting playback from an offset is only support in MPA at the moment */ | 891 | /* Starting playback from an offset is only support in MPA at the moment */ |
892 | if (offset > 0) { | 892 | if (offset > 0) { |
893 | if ((tracks[track_widx].id3.codectype==AFMT_MPA_L2) || | 893 | switch (tracks[track_widx].id3.codectype) { |
894 | (tracks[track_widx].id3.codectype==AFMT_MPA_L3)) { | 894 | case AFMT_MPA_L2: |
895 | lseek(fd, offset, SEEK_SET); | 895 | case AFMT_MPA_L3: |
896 | tracks[track_widx].id3.offset = offset; | 896 | lseek(fd, offset, SEEK_SET); |
897 | mp3_set_elapsed(&tracks[track_widx].id3); | 897 | tracks[track_widx].id3.offset = offset; |
898 | tracks[track_widx].filepos = offset; | 898 | mp3_set_elapsed(&tracks[track_widx].id3); |
899 | tracks[track_widx].filerem = tracks[track_widx].filesize - offset; | 899 | tracks[track_widx].filepos = offset; |
900 | ci.curpos = offset; | 900 | tracks[track_widx].filerem = tracks[track_widx].filesize - offset; |
901 | tracks[track_widx].start_pos = offset; | 901 | ci.curpos = offset; |
902 | } | 902 | tracks[track_widx].start_pos = offset; |
903 | else if (tracks[track_widx].id3.codectype==AFMT_WAVPACK) { | 903 | break; |
904 | lseek(fd, offset, SEEK_SET); | 904 | |
905 | tracks[track_widx].id3.offset = offset; | 905 | case AFMT_WAVPACK: |
906 | tracks[track_widx].id3.elapsed = tracks[track_widx].id3.length / 2; | 906 | lseek(fd, offset, SEEK_SET); |
907 | tracks[track_widx].filepos = offset; | 907 | tracks[track_widx].id3.offset = offset; |
908 | tracks[track_widx].filerem = tracks[track_widx].filesize - offset; | 908 | tracks[track_widx].id3.elapsed = tracks[track_widx].id3.length / 2; |
909 | ci.curpos = offset; | 909 | tracks[track_widx].filepos = offset; |
910 | tracks[track_widx].start_pos = offset; | 910 | tracks[track_widx].filerem = tracks[track_widx].filesize - offset; |
911 | } | 911 | ci.curpos = offset; |
912 | } | 912 | tracks[track_widx].start_pos = offset; |
913 | break; | ||
914 | } | ||
915 | } | ||
913 | 916 | ||
914 | if (start_play) { | 917 | if (start_play) { |
915 | track_count++; | 918 | track_count++; |
@@ -1795,6 +1798,8 @@ void audio_init(void) | |||
1795 | track_buffer_callback = NULL; | 1798 | track_buffer_callback = NULL; |
1796 | track_unbuffer_callback = NULL; | 1799 | track_unbuffer_callback = NULL; |
1797 | track_changed_callback = NULL; | 1800 | track_changed_callback = NULL; |
1801 | /* Just to prevent cur_ti never be anything random. */ | ||
1802 | cur_ti = &tracks[0]; | ||
1798 | 1803 | ||
1799 | logf("abuf:%0x", PCMBUF_SIZE); | 1804 | logf("abuf:%0x", PCMBUF_SIZE); |
1800 | logf("fbuf:%0x", codecbuflen); | 1805 | logf("fbuf:%0x", codecbuflen); |