From d06f9512e22093cab3b6c956cfdfa83adc7d0c32 Mon Sep 17 00:00:00 2001 From: Buschel Date: Sun, 14 Mar 2010 16:05:12 +0000 Subject: [PATCH] Implement resume for alac codec. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25169 a1c6a512-1295-4272-9138-f99709370657 --- apps/codecs/alac.c | 21 ++++++++++++++++----- apps/playback.c | 1 + 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/apps/codecs/alac.c b/apps/codecs/alac.c index fdc6748a9..1de127db2 100644 --- a/apps/codecs/alac.c +++ b/apps/codecs/alac.c @@ -63,6 +63,10 @@ enum codec_status codec_main(void) stream_create(&input_stream,ci); + /* Read from ci->id3->offset before calling qtmovie_read. */ + samplesdone = (uint32_t)(((uint64_t)(ci->id3->offset) * ci->id3->frequency) / + (ci->id3->bitrate*128)); + /* if qtmovie_read returns successfully, the stream is up to * the movie data, which can be used directly by the decoder */ if (!qtmovie_read(&input_stream, &demux_res)) { @@ -74,9 +78,19 @@ enum codec_status codec_main(void) /* initialise the sound converter */ create_alac(demux_res.sound_sample_size, demux_res.num_channels,&alac); alac_set_info(&alac, demux_res.codecdata); - + + /* Set i for first frame, seek to desired sample position for resuming. */ i=0; - samplesdone=0; + if (samplesdone > 0) { + if (alac_seek(&demux_res, &input_stream, samplesdone, + &samplesdone, (int*) &i)) { + elapsedtime = (samplesdone * 10) / (ci->id3->frequency / 100); + ci->set_elapsed(elapsedtime); + } else { + samplesdone = 0; + } + } + /* The main decoding loop */ while (i < demux_res.num_sample_byte_sizes) { ci->yield(); @@ -127,9 +141,6 @@ enum codec_status codec_main(void) elapsedtime=(samplesdone*10)/(ci->id3->frequency/100); ci->set_elapsed(elapsedtime); - /* Keep track of current position - for resuming */ - ci->set_offset(elapsedtime); - i++; } retval = CODEC_OK; diff --git a/apps/playback.c b/apps/playback.c index 536fd614c..81cd31ec2 100644 --- a/apps/playback.c +++ b/apps/playback.c @@ -1370,6 +1370,7 @@ static void audio_finish_load_track(void) case AFMT_PCM_WAV: case AFMT_A52: case AFMT_MP4_AAC: + case AFMT_MP4_ALAC: case AFMT_MPC: case AFMT_APE: case AFMT_WMA: -- 2.11.4.GIT