summaryrefslogtreecommitdiff
path: root/apps/codecs/mpa.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/mpa.c')
-rw-r--r--apps/codecs/mpa.c35
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
75void 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 */
76enum codec_status codec_start(struct codec_api *api) 92enum 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 */