diff options
-rw-r--r-- | apps/codecs/mpc.c | 27 |
1 files changed, 9 insertions, 18 deletions
diff --git a/apps/codecs/mpc.c b/apps/codecs/mpc.c index a227fb81cf..250a03fbfd 100644 --- a/apps/codecs/mpc.c +++ b/apps/codecs/mpc.c | |||
@@ -72,7 +72,8 @@ MPC_SAMPLE_FORMAT sample_buffer[MPC_DECODER_BUFFER_LENGTH] | |||
72 | enum codec_status codec_main(void) | 72 | enum codec_status codec_main(void) |
73 | { | 73 | { |
74 | mpc_int64_t samplesdone; | 74 | mpc_int64_t samplesdone; |
75 | unsigned long frequency; | 75 | uint32_t frequency; /* 0.1 kHz accuracy */ |
76 | uint32_t elapsed_time; /* milliseconds */ | ||
76 | unsigned status; | 77 | unsigned status; |
77 | mpc_reader reader; | 78 | mpc_reader reader; |
78 | mpc_streaminfo info; | 79 | mpc_streaminfo info; |
@@ -107,7 +108,7 @@ next_track: | |||
107 | retval = CODEC_ERROR; | 108 | retval = CODEC_ERROR; |
108 | goto done; | 109 | goto done; |
109 | } | 110 | } |
110 | frequency = info.sample_freq / 1000; | 111 | frequency = info.sample_freq / 100; /* 0.1 kHz accuracy */ |
111 | ci->configure(DSP_SWITCH_FREQUENCY, info.sample_freq); | 112 | ci->configure(DSP_SWITCH_FREQUENCY, info.sample_freq); |
112 | 113 | ||
113 | /* set playback engine up for correct number of channels */ | 114 | /* set playback engine up for correct number of channels */ |
@@ -131,10 +132,11 @@ next_track: | |||
131 | } | 132 | } |
132 | 133 | ||
133 | /* Resume to saved sample offset. */ | 134 | /* Resume to saved sample offset. */ |
134 | if(samplesdone > 0) { | 135 | if (samplesdone > 0) { |
135 | /* hack to improve seek time if filebuf goes empty */ | 136 | /* hack to improve seek time if filebuf goes empty */ |
136 | if (mpc_decoder_seek_sample(&decoder, samplesdone)) { | 137 | if (mpc_decoder_seek_sample(&decoder, samplesdone)) { |
137 | ci->set_elapsed(samplesdone/frequency); | 138 | elapsed_time = (samplesdone*10)/frequency; |
139 | ci->set_elapsed(elapsed_time); | ||
138 | } else { | 140 | } else { |
139 | samplesdone = 0; | 141 | samplesdone = 0; |
140 | } | 142 | } |
@@ -143,29 +145,17 @@ next_track: | |||
143 | 145 | ||
144 | /* This is the decoding loop. */ | 146 | /* This is the decoding loop. */ |
145 | do { | 147 | do { |
146 | #if 1 | ||
147 | /* Complete seek handler. */ | 148 | /* Complete seek handler. */ |
148 | if (ci->seek_time) { | 149 | if (ci->seek_time) { |
149 | /* hack to improve seek time if filebuf goes empty */ | 150 | /* hack to improve seek time if filebuf goes empty */ |
150 | mpc_int64_t new_offset = (ci->seek_time - 1)*frequency; | 151 | mpc_int64_t new_offset = ((ci->seek_time - 1)/10)*frequency; |
151 | if (mpc_decoder_seek_sample(&decoder, new_offset)) { | 152 | if (mpc_decoder_seek_sample(&decoder, new_offset)) { |
152 | samplesdone = new_offset; | 153 | samplesdone = new_offset; |
153 | ci->set_elapsed(ci->seek_time); | 154 | ci->set_elapsed(ci->seek_time); |
154 | } | 155 | } |
155 | ci->seek_complete(); | 156 | ci->seek_complete(); |
156 | /* reset chunksize */ | 157 | /* reset chunksize */ |
157 | |||
158 | } | ||
159 | #else | ||
160 | /* Seek to start of track handler. */ | ||
161 | if (ci->seek_time) { | ||
162 | if (ci->seek_time == 1 && mpc_decoder_seek_sample(&decoder, 0)) { | ||
163 | samplesdone = 0; | ||
164 | ci->set_elapsed(0); | ||
165 | } | ||
166 | ci->seek_complete(); | ||
167 | } | 158 | } |
168 | #endif | ||
169 | if (ci->stop_codec || ci->new_track) | 159 | if (ci->stop_codec || ci->new_track) |
170 | break; | 160 | break; |
171 | 161 | ||
@@ -181,7 +171,8 @@ next_track: | |||
181 | sample_buffer + MPC_FRAME_LENGTH, | 171 | sample_buffer + MPC_FRAME_LENGTH, |
182 | status); | 172 | status); |
183 | samplesdone += status; | 173 | samplesdone += status; |
184 | ci->set_elapsed(samplesdone/frequency); | 174 | elapsed_time = (samplesdone*10)/frequency; |
175 | ci->set_elapsed(elapsed_time); | ||
185 | ci->set_offset(samplesdone); | 176 | ci->set_offset(samplesdone); |
186 | } | 177 | } |
187 | } while (status != 0); | 178 | } while (status != 0); |