1
0
Fork 0
forked from len0rd/rockbox

Add resume support to AAC files.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@10720 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Magnus Holmgren 2006-08-23 13:10:48 +00:00
parent a04cef7ade
commit 9f09a39436
4 changed files with 81 additions and 3 deletions

View file

@ -75,9 +75,11 @@ next_track:
goto exit;
}
while (!rb->taginfo_ready)
rb->yield();
while (!*ci->taginfo_ready && !ci->stop_codec)
ci->sleep(1);
samplesdone = ci->id3->offset;
ci->configure(DSP_SET_FREQUENCY, (long *)(rb->id3->frequency));
stream_create(&input_stream,ci);
@ -117,7 +119,17 @@ next_track:
ci->id3->frequency=s;
i=0;
samplesdone=0;
if (samplesdone > 0) {
if (alac_seek_raw(&demux_res, &input_stream, samplesdone,
&samplesdone, (int *)&i)) {
elapsedtime=(samplesdone*10)/(ci->id3->frequency/100);
ci->set_elapsed(elapsedtime);
} else {
samplesdone=0;
}
}
/* The main decoding loop */
while (i < demux_res.num_sample_byte_sizes) {
rb->yield();

View file

@ -230,3 +230,64 @@ unsigned int alac_seek (demux_res_t* demux_res,
return 0;
}
}
/* Seek to file_loc (or close to it). Return 1 on success (and
modify samplesdone and currentblock), 0 if failed
Seeking uses the following array:
the sample_byte_size array contains the length in bytes of
each block ("sample" in Applespeak).
So we just find the last block before (or at) the requested position.
Each ALAC block seems to be independent of all the others.
*/
unsigned int alac_seek_raw (demux_res_t* demux_res,
stream_t* stream,
unsigned int file_loc,
uint32_t* samplesdone, int* currentblock)
{
unsigned int i;
unsigned int j;
unsigned int newblock;
unsigned int newsample;
unsigned int newpos;
/* First check we have the appropriate metadata - we should always
have it. */
if ((demux_res->num_time_to_samples==0) ||
(demux_res->num_sample_byte_sizes==0)) { return 0; }
/* Find the destination block from the sample_byte_size array. */
newpos=demux_res->mdat_offset;
for (i=0;(i<demux_res->num_sample_byte_sizes) &&
(newpos+demux_res->sample_byte_size[i]<=file_loc);i++) {
newpos+=demux_res->sample_byte_size[i];
}
newblock=i;
newsample=0;
/* Get the sample offset of the block */
for (i=0,j=0;(i<demux_res->num_time_to_samples) && (j<newblock);
i++,j+=demux_res->time_to_sample[i].sample_count) {
if (newblock-j < demux_res->time_to_sample[i].sample_count) {
newsample+=(newblock-j)*demux_res->time_to_sample[i].sample_duration;
break;
} else {
newsample+=(demux_res->time_to_sample[i].sample_duration
* demux_res->time_to_sample[i].sample_count);
}
}
/* We know the new file position, so let's try to seek to it */
if (stream->ci->seek_buffer(newpos)) {
*samplesdone=newsample;
*currentblock=newblock;
return 1;
} else {
return 0;
}
}

View file

@ -100,5 +100,9 @@ unsigned int alac_seek (demux_res_t* demux_res,
stream_t* stream,
unsigned int sample_loc,
uint32_t* samplesdone, int* currentblock);
unsigned int alac_seek_raw (demux_res_t* demux_res,
stream_t* stream,
unsigned int file_loc,
uint32_t* samplesdone, int* currentblock);
#endif /* STREAM_H */

View file

@ -1876,6 +1876,7 @@ static bool audio_load_track(int offset, bool start_play, bool rebuffer)
case AFMT_FLAC:
case AFMT_PCM_WAV:
case AFMT_A52:
case AFMT_AAC:
tracks[track_widx].id3.offset = offset;
break;
}