summaryrefslogtreecommitdiffstats
path: root/apps/codecs/atrac3_rm.c
diff options
context:
space:
mode:
authorMohamed Tarek <mt@rockbox.org>2009-10-03 00:18:42 +0000
committerMohamed Tarek <mt@rockbox.org>2009-10-03 00:18:42 +0000
commitf0c6c88f6d6afef6fa8bba311ce1bcf1873f8a90 (patch)
treec05bc252e50563196cc453de3b024f3ac5dde365 /apps/codecs/atrac3_rm.c
parent8d5acd64c9d0c3610ec595c7f61deb7f4eec417f (diff)
downloadrockbox-f0c6c88f6d6afef6fa8bba311ce1bcf1873f8a90.tar.gz
rockbox-f0c6c88f6d6afef6fa8bba311ce1bcf1873f8a90.zip
Smarter check for failed packet parsing in RM. Also fixes a bug in playback where sometimes "codec failure" is splashed at the end of playback.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22880 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/codecs/atrac3_rm.c')
-rw-r--r--apps/codecs/atrac3_rm.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/apps/codecs/atrac3_rm.c b/apps/codecs/atrac3_rm.c
index f3bfa2f801..75c0d1581b 100644
--- a/apps/codecs/atrac3_rm.c
+++ b/apps/codecs/atrac3_rm.c
@@ -44,6 +44,7 @@ enum codec_status codec_main(void)
uint16_t fs,sps,h;
uint32_t packet_count;
int scrambling_unit_size, num_units, elapsed = 0;
+ int playback_on = -1;
next_track:
if (codec_init()) {
@@ -88,9 +89,14 @@ seek_start :
{
bit_buffer = (uint8_t *) ci->request_buffer(&buff_size, scrambling_unit_size);
consumed = rm_get_packet(&bit_buffer, &rmctx, &pkt);
- if(consumed < 0) {
- DEBUGF("rm_get_packet failed\n");
- return CODEC_ERROR;
+ if(consumed < 0 && playback_on != 0) {
+ if(playback_on == -1) {
+ /* Error only if packet-parsing failed and playback hadn't started */
+ DEBUGF("rm_get_packet failed\n");
+ return CODEC_ERROR;
+ }
+ else
+ goto done;
}
for(i = 0; i < rmctx.audio_pkt_cnt*(fs/sps) ; i++)
@@ -123,10 +129,16 @@ seek_start :
ci->seek_buffer(rmctx.data_offset + DATA_HEADER_SIZE + consumed * num_units);
bit_buffer = (uint8_t *) ci->request_buffer(&buff_size, scrambling_unit_size);
consumed = rm_get_packet(&bit_buffer, &rmctx, &pkt);
- if(consumed < 0) {
- DEBUGF("rm_get_packet failed\n");
- return CODEC_ERROR;
- }
+ if(consumed < 0 && playback_on != 0) {
+ if(playback_on == -1) {
+ /* Error only if packet-parsing failed and playback hadn't started */
+ DEBUGF("rm_get_packet failed\n");
+ return CODEC_ERROR;
+ }
+ else
+ goto done;
+ }
+
packet_count = rmctx.nb_packets - rmctx.audio_pkt_cnt * num_units;
rmctx.frame_number = ((ci->seek_time)/(sps*1000*8/rmctx.bit_rate));
while(rmctx.audiotimestamp > (unsigned) ci->seek_time) {
@@ -155,6 +167,7 @@ seek_start :
if(datasize)
ci->pcmbuf_insert(q.outSamples, q.outSamples + 1024, q.samples_per_frame / rmctx.nb_channels);
+ playback_on = 1;
elapsed = rmctx.audiotimestamp+(1000*8*sps/rmctx.bit_rate)*i;
ci->set_elapsed(elapsed);
rmctx.frame_number++;