diff options
author | Andree Buschmann <AndreeBuschmann@t-online.de> | 2010-03-14 16:05:12 +0000 |
---|---|---|
committer | Andree Buschmann <AndreeBuschmann@t-online.de> | 2010-03-14 16:05:12 +0000 |
commit | c18e80e1276f3d54d97ff79564f5bfc09fe20957 (patch) | |
tree | f826e1db4c789951c3371c1819f1c24c62f2c205 /apps/codecs | |
parent | 5de615132dd634a3ee7a7bdfa2a06ca0515b2771 (diff) | |
download | rockbox-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
Diffstat (limited to 'apps/codecs')
-rw-r--r-- | apps/codecs/alac.c | 21 |
1 files changed, 16 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; |