summaryrefslogtreecommitdiff
path: root/apps/codecs/alac.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/alac.c')
-rw-r--r--apps/codecs/alac.c21
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;