diff options
Diffstat (limited to 'lib/rbcodec/codecs/alac.c')
-rw-r--r-- | lib/rbcodec/codecs/alac.c | 29 |
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, |