summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndree Buschmann <AndreeBuschmann@t-online.de>2009-04-20 19:16:48 +0000
committerAndree Buschmann <AndreeBuschmann@t-online.de>2009-04-20 19:16:48 +0000
commitf4ac75752e7b76b8aa24208a8d344b427351af6d (patch)
tree2075bcdfb0eb0a2126ebbfd5c325d02f52a6cfb7
parentf7a91257813a31e9616dc1da0f7a4a0a909db105 (diff)
downloadrockbox-f4ac75752e7b76b8aa24208a8d344b427351af6d.tar.gz
rockbox-f4ac75752e7b76b8aa24208a8d344b427351af6d.zip
Allow higher precision in calculation of seek position and elapsed time for mpc codec.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@20756 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/codecs/mpc.c27
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]
72enum codec_status codec_main(void) 72enum 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);