summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndree Buschmann <AndreeBuschmann@t-online.de>2010-03-14 16:05:12 +0000
committerAndree Buschmann <AndreeBuschmann@t-online.de>2010-03-14 16:05:12 +0000
commitc18e80e1276f3d54d97ff79564f5bfc09fe20957 (patch)
treef826e1db4c789951c3371c1819f1c24c62f2c205
parent5de615132dd634a3ee7a7bdfa2a06ca0515b2771 (diff)
downloadrockbox-c18e80e1276f3d54d97ff79564f5bfc09fe20957.tar.gz
rockbox-c18e80e1276f3d54d97ff79564f5bfc09fe20957.zip
Implement resume for alac codec.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25169 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/codecs/alac.c21
-rw-r--r--apps/playback.c1
2 files changed, 17 insertions, 5 deletions
diff --git a/apps/codecs/alac.c b/apps/codecs/alac.c
index fdc6748a95..1de127db28 100644
--- a/apps/codecs/alac.c
+++ b/apps/codecs/alac.c
@@ -63,6 +63,10 @@ enum codec_status codec_main(void)
63 63
64 stream_create(&input_stream,ci); 64 stream_create(&input_stream,ci);
65 65
66 /* Read from ci->id3->offset before calling qtmovie_read. */
67 samplesdone = (uint32_t)(((uint64_t)(ci->id3->offset) * ci->id3->frequency) /
68 (ci->id3->bitrate*128));
69
66 /* if qtmovie_read returns successfully, the stream is up to 70 /* if qtmovie_read returns successfully, the stream is up to
67 * the movie data, which can be used directly by the decoder */ 71 * the movie data, which can be used directly by the decoder */
68 if (!qtmovie_read(&input_stream, &demux_res)) { 72 if (!qtmovie_read(&input_stream, &demux_res)) {
@@ -74,9 +78,19 @@ enum codec_status codec_main(void)
74 /* initialise the sound converter */ 78 /* initialise the sound converter */
75 create_alac(demux_res.sound_sample_size, demux_res.num_channels,&alac); 79 create_alac(demux_res.sound_sample_size, demux_res.num_channels,&alac);
76 alac_set_info(&alac, demux_res.codecdata); 80 alac_set_info(&alac, demux_res.codecdata);
77 81
82 /* Set i for first frame, seek to desired sample position for resuming. */
78 i=0; 83 i=0;
79 samplesdone=0; 84 if (samplesdone > 0) {
85 if (alac_seek(&demux_res, &input_stream, samplesdone,
86 &samplesdone, (int*) &i)) {
87 elapsedtime = (samplesdone * 10) / (ci->id3->frequency / 100);
88 ci->set_elapsed(elapsedtime);
89 } else {
90 samplesdone = 0;
91 }
92 }
93
80 /* The main decoding loop */ 94 /* The main decoding loop */
81 while (i < demux_res.num_sample_byte_sizes) { 95 while (i < demux_res.num_sample_byte_sizes) {
82 ci->yield(); 96 ci->yield();
@@ -127,9 +141,6 @@ enum codec_status codec_main(void)
127 elapsedtime=(samplesdone*10)/(ci->id3->frequency/100); 141 elapsedtime=(samplesdone*10)/(ci->id3->frequency/100);
128 ci->set_elapsed(elapsedtime); 142 ci->set_elapsed(elapsedtime);
129 143
130 /* Keep track of current position - for resuming */
131 ci->set_offset(elapsedtime);
132
133 i++; 144 i++;
134 } 145 }
135 retval = CODEC_OK; 146 retval = CODEC_OK;
diff --git a/apps/playback.c b/apps/playback.c
index 536fd614ca..81cd31ec23 100644
--- a/apps/playback.c
+++ b/apps/playback.c
@@ -1370,6 +1370,7 @@ static void audio_finish_load_track(void)
1370 case AFMT_PCM_WAV: 1370 case AFMT_PCM_WAV:
1371 case AFMT_A52: 1371 case AFMT_A52:
1372 case AFMT_MP4_AAC: 1372 case AFMT_MP4_AAC:
1373 case AFMT_MP4_ALAC:
1373 case AFMT_MPC: 1374 case AFMT_MPC:
1374 case AFMT_APE: 1375 case AFMT_APE:
1375 case AFMT_WMA: 1376 case AFMT_WMA: