diff options
Diffstat (limited to 'apps/codecs/mpa.c')
-rw-r--r-- | apps/codecs/mpa.c | 35 |
1 files changed, 18 insertions, 17 deletions
diff --git a/apps/codecs/mpa.c b/apps/codecs/mpa.c index 2c946f3f0d..1be6222ccf 100644 --- a/apps/codecs/mpa.c +++ b/apps/codecs/mpa.c | |||
@@ -72,6 +72,22 @@ void recalc_samplecount(void) | |||
72 | samplecount -= start_skip + stop_skip; | 72 | samplecount -= start_skip + stop_skip; |
73 | } | 73 | } |
74 | 74 | ||
75 | void init_mad(void) | ||
76 | { | ||
77 | ci->memset(&stream, 0, sizeof(struct mad_stream)); | ||
78 | ci->memset(&frame, 0, sizeof(struct mad_frame)); | ||
79 | ci->memset(&synth, 0, sizeof(struct mad_synth)); | ||
80 | |||
81 | mad_stream_init(&stream); | ||
82 | mad_frame_init(&frame); | ||
83 | mad_synth_init(&synth); | ||
84 | |||
85 | /* We do this so libmad doesn't try to call codec_calloc() */ | ||
86 | ci->memset(mad_frame_overlap, 0, sizeof(mad_frame_overlap)); | ||
87 | frame.overlap = &mad_frame_overlap; | ||
88 | stream.main_data = &mad_main_data; | ||
89 | } | ||
90 | |||
75 | /* this is the codec entry point */ | 91 | /* this is the codec entry point */ |
76 | enum codec_status codec_start(struct codec_api *api) | 92 | enum codec_status codec_start(struct codec_api *api) |
77 | { | 93 | { |
@@ -107,18 +123,7 @@ enum codec_status codec_start(struct codec_api *api) | |||
107 | * Reinitializing seems to be necessary to avoid playback quircks when seeking. */ | 123 | * Reinitializing seems to be necessary to avoid playback quircks when seeking. */ |
108 | next_track: | 124 | next_track: |
109 | 125 | ||
110 | ci->memset(&stream, 0, sizeof(struct mad_stream)); | 126 | init_mad(); |
111 | ci->memset(&frame, 0, sizeof(struct mad_frame)); | ||
112 | ci->memset(&synth, 0, sizeof(struct mad_synth)); | ||
113 | |||
114 | mad_stream_init(&stream); | ||
115 | mad_frame_init(&frame); | ||
116 | mad_synth_init(&synth); | ||
117 | |||
118 | /* We do this so libmad doesn't try to call codec_calloc() */ | ||
119 | ci->memset(mad_frame_overlap, 0, sizeof(mad_frame_overlap)); | ||
120 | frame.overlap = &mad_frame_overlap; | ||
121 | stream.main_data = &mad_main_data; | ||
122 | 127 | ||
123 | file_end = 0; | 128 | file_end = 0; |
124 | while (!*ci->taginfo_ready && !ci->stop_codec) | 129 | while (!*ci->taginfo_ready && !ci->stop_codec) |
@@ -168,11 +173,7 @@ enum codec_status codec_start(struct codec_api *api) | |||
168 | if (!ci->seek_buffer(newpos)) | 173 | if (!ci->seek_buffer(newpos)) |
169 | goto next_track; | 174 | goto next_track; |
170 | ci->seek_complete(); | 175 | ci->seek_complete(); |
171 | if (newpos == 0) | 176 | init_mad(); |
172 | { | ||
173 | ci->id3->elapsed = 0; | ||
174 | goto next_track; | ||
175 | } | ||
176 | } | 177 | } |
177 | 178 | ||
178 | /* Lock buffers */ | 179 | /* Lock buffers */ |