diff options
author | Mohamed Tarek <mt@rockbox.org> | 2009-10-03 00:18:42 +0000 |
---|---|---|
committer | Mohamed Tarek <mt@rockbox.org> | 2009-10-03 00:18:42 +0000 |
commit | f0c6c88f6d6afef6fa8bba311ce1bcf1873f8a90 (patch) | |
tree | c05bc252e50563196cc453de3b024f3ac5dde365 /apps/codecs/atrac3_rm.c | |
parent | 8d5acd64c9d0c3610ec595c7f61deb7f4eec417f (diff) | |
download | rockbox-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.c | 27 |
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++; |