summaryrefslogtreecommitdiff
path: root/lib/rbcodec/codecs/alac.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rbcodec/codecs/alac.c')
-rw-r--r--lib/rbcodec/codecs/alac.c29
1 files changed, 17 insertions, 12 deletions
diff --git a/lib/rbcodec/codecs/alac.c b/lib/rbcodec/codecs/alac.c
index 5eb6e001f7..a3a5ad43b8 100644
--- a/lib/rbcodec/codecs/alac.c
+++ b/lib/rbcodec/codecs/alac.c
@@ -50,7 +50,7 @@ enum codec_status codec_run(void)
50 demux_res_t demux_res; 50 demux_res_t demux_res;
51 stream_t input_stream; 51 stream_t input_stream;
52 uint32_t samplesdone; 52 uint32_t samplesdone;
53 uint32_t elapsedtime = 0; 53 uint32_t elapsedtime;
54 int samplesdecoded; 54 int samplesdecoded;
55 unsigned int i; 55 unsigned int i;
56 unsigned char* buffer; 56 unsigned char* buffer;
@@ -71,9 +71,9 @@ enum codec_status codec_run(void)
71 71
72 stream_create(&input_stream,ci); 72 stream_create(&input_stream,ci);
73 73
74 /* Read from ci->id3->offset before calling qtmovie_read. */ 74 /* Read resume info before calling qtmovie_read. */
75 samplesdone = (uint32_t)(((uint64_t)(ci->id3->offset) * ci->id3->frequency) / 75 elapsedtime = ci->id3->elapsed;
76 (ci->id3->bitrate*128)); 76 samplesdone = ci->id3->offset;
77 77
78 /* if qtmovie_read returns successfully, the stream is up to 78 /* if qtmovie_read returns successfully, the stream is up to
79 * the movie data, which can be used directly by the decoder */ 79 * the movie data, which can be used directly by the decoder */
@@ -87,16 +87,24 @@ enum codec_status codec_run(void)
87 87
88 /* Set i for first frame, seek to desired sample position for resuming. */ 88 /* Set i for first frame, seek to desired sample position for resuming. */
89 i=0; 89 i=0;
90 if (samplesdone > 0) { 90
91 if (m4a_seek(&demux_res, &input_stream, samplesdone, 91 if (elapsedtime || samplesdone) {
92 if (samplesdone) {
93 samplesdone =
94 (uint32_t)((uint64_t)samplesdone*ci->id3->frequency /
95 (ci->id3->bitrate*128));
96 }
97 else {
98 samplesdone = (elapsedtime/10) * (ci->id3->frequency/100);
99 }
100
101 if (!m4a_seek(&demux_res, &input_stream, samplesdone,
92 &samplesdone, (int*) &i)) { 102 &samplesdone, (int*) &i)) {
93 elapsedtime = (samplesdone * 10) / (ci->id3->frequency / 100);
94 ci->set_elapsed(elapsedtime);
95 } else {
96 samplesdone = 0; 103 samplesdone = 0;
97 } 104 }
98 } 105 }
99 106
107 elapsedtime = (samplesdone*10)/(ci->id3->frequency/100);
100 ci->set_elapsed(elapsedtime); 108 ci->set_elapsed(elapsedtime);
101 109
102 /* The main decoding loop */ 110 /* The main decoding loop */
@@ -106,9 +114,6 @@ enum codec_status codec_run(void)
106 if (action == CODEC_ACTION_HALT) 114 if (action == CODEC_ACTION_HALT)
107 break; 115 break;
108 116
109 /* Request the required number of bytes from the input buffer */
110 buffer=ci->request_buffer(&n, ALAC_BYTE_BUFFER_SIZE);
111
112 /* Deal with any pending seek requests */ 117 /* Deal with any pending seek requests */
113 if (action == CODEC_ACTION_SEEK_TIME) { 118 if (action == CODEC_ACTION_SEEK_TIME) {
114 if (m4a_seek(&demux_res, &input_stream, 119 if (m4a_seek(&demux_res, &input_stream,