forked from len0rd/rockbox
Make atomic type work for even first track. Rework low buffer handling... uses a stateful variable because I'm a bitter old man and it works this way
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15425 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
fe2f1af0d3
commit
11a3661d73
2 changed files with 57 additions and 46 deletions
|
|
@ -733,8 +733,9 @@ static void shrink_handle(struct memory_handle *h)
|
|||
}
|
||||
|
||||
/* Fill the buffer by buffering as much data as possible for handles that still
|
||||
have data left to buffer */
|
||||
static void fill_buffer(void)
|
||||
have data left to buffer
|
||||
Return whether or not to continue filling after this */
|
||||
static bool fill_buffer(void)
|
||||
{
|
||||
logf("fill_buffer()");
|
||||
struct memory_handle *m = first_handle;
|
||||
|
|
@ -745,13 +746,18 @@ static void fill_buffer(void)
|
|||
m = m->next;
|
||||
}
|
||||
|
||||
if (m) {
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifndef SIMULATOR
|
||||
if (queue_empty(&buffering_queue)) {
|
||||
/* only spin the disk down if the filling wasn't interrupted by an
|
||||
event arriving in the queue. */
|
||||
ata_sleep();
|
||||
}
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void update_data_counters(void)
|
||||
|
|
@ -1165,6 +1171,7 @@ static void shrink_buffer(struct memory_handle *h) {
|
|||
|
||||
void buffering_thread(void)
|
||||
{
|
||||
bool filling = false;
|
||||
struct queue_event ev;
|
||||
|
||||
while (true)
|
||||
|
|
@ -1227,40 +1234,39 @@ void buffering_thread(void)
|
|||
|
||||
/* If the buffer is low, call the callbacks to get new data */
|
||||
if (num_handles > 0 && data_counters.useful <= conf_watermark)
|
||||
{
|
||||
call_buffer_low_callbacks();
|
||||
}
|
||||
|
||||
#if MEM > 8
|
||||
/* If the disk is spinning, take advantage by filling the buffer */
|
||||
if ((ata_disk_is_active() || ev.id == Q_BUFFER_HANDLE) &&
|
||||
queue_empty(&buffering_queue))
|
||||
else if (ata_disk_is_active() && queue_empty(&buffering_queue))
|
||||
{
|
||||
if (data_counters.remaining > 0 &&
|
||||
data_counters.buffered <= high_watermark)
|
||||
{
|
||||
fill_buffer();
|
||||
update_data_counters();
|
||||
}
|
||||
|
||||
if (num_handles > 0 && data_counters.useful <= high_watermark)
|
||||
{
|
||||
call_buffer_low_callbacks();
|
||||
|
||||
if (data_counters.remaining > 0 && BUF_USED <= high_watermark)
|
||||
{
|
||||
filling = fill_buffer();
|
||||
update_data_counters();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if ((ev.id == SYS_TIMEOUT || ev.id == Q_BUFFER_HANDLE) &&
|
||||
queue_empty(&buffering_queue))
|
||||
if (ev.id == SYS_TIMEOUT && queue_empty(&buffering_queue))
|
||||
{
|
||||
if (data_counters.remaining > 0 &&
|
||||
data_counters.useful <= conf_watermark)
|
||||
{
|
||||
/* Recursively shrink the buffer, depth first */
|
||||
shrink_buffer(first_handle);
|
||||
fill_buffer();
|
||||
filling = fill_buffer();
|
||||
}
|
||||
}
|
||||
|
||||
if (filling && queue_empty(&buffering_queue))
|
||||
{
|
||||
if (data_counters.remaining > 0 && BUF_USED < buffer_len)
|
||||
filling = fill_buffer();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2387,7 +2387,6 @@ static bool audio_load_track(int offset, bool start_play)
|
|||
}
|
||||
|
||||
struct mp3entry *track_id3;
|
||||
enum data_type type = TYPE_PACKET_AUDIO;
|
||||
|
||||
if (track_widx == track_ridx)
|
||||
track_id3 = &curtrack_id3;
|
||||
|
|
@ -2399,41 +2398,47 @@ static bool audio_load_track(int offset, bool start_play)
|
|||
set_filebuf_watermark(buffer_margin, 0);
|
||||
track_id3->elapsed = 0;
|
||||
|
||||
if (offset > 0)
|
||||
{
|
||||
switch (track_id3->codectype) {
|
||||
case AFMT_MPA_L1:
|
||||
case AFMT_MPA_L2:
|
||||
case AFMT_MPA_L3:
|
||||
enum data_type type = TYPE_PACKET_AUDIO;
|
||||
|
||||
switch (track_id3->codectype) {
|
||||
case AFMT_MPA_L1:
|
||||
case AFMT_MPA_L2:
|
||||
case AFMT_MPA_L3:
|
||||
if (offset > 0) {
|
||||
file_offset = offset;
|
||||
track_id3->offset = offset;
|
||||
audio_set_elapsed(track_id3);
|
||||
ci.curpos = offset;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case AFMT_WAVPACK:
|
||||
case AFMT_WAVPACK:
|
||||
if (offset > 0) {
|
||||
file_offset = offset;
|
||||
track_id3->offset = offset;
|
||||
track_id3->elapsed = track_id3->length / 2;
|
||||
ci.curpos = offset;
|
||||
break;
|
||||
|
||||
case AFMT_OGG_VORBIS:
|
||||
case AFMT_SPEEX:
|
||||
case AFMT_FLAC:
|
||||
case AFMT_PCM_WAV:
|
||||
case AFMT_A52:
|
||||
case AFMT_AAC:
|
||||
case AFMT_MPC:
|
||||
case AFMT_APE:
|
||||
track_id3->offset = offset;
|
||||
break;
|
||||
case AFMT_NSF:
|
||||
case AFMT_SPC:
|
||||
logf("Loading atomic %d",track_id3->codectype);
|
||||
type = TYPE_ATOMIC_AUDIO;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case AFMT_OGG_VORBIS:
|
||||
case AFMT_SPEEX:
|
||||
case AFMT_FLAC:
|
||||
case AFMT_PCM_WAV:
|
||||
case AFMT_A52:
|
||||
case AFMT_AAC:
|
||||
case AFMT_MPC:
|
||||
case AFMT_APE:
|
||||
if (offset > 0)
|
||||
track_id3->offset = offset;
|
||||
break;
|
||||
|
||||
case AFMT_NSF:
|
||||
case AFMT_SPC:
|
||||
case AFMT_SID:
|
||||
logf("Loading atomic %d",track_id3->codectype);
|
||||
type = TYPE_ATOMIC_AUDIO;
|
||||
break;
|
||||
}
|
||||
|
||||
logf("alt:%s", trackname);
|
||||
|
|
@ -2625,7 +2630,6 @@ static int audio_check_new_track(void)
|
|||
track_ridx &= MAX_TRACK_MASK;
|
||||
|
||||
buf_set_base_handle(CUR_TI->audio_hid);
|
||||
register_buffer_low_callback(low_buffer_callback);
|
||||
|
||||
if (automatic_skip)
|
||||
{
|
||||
|
|
@ -3036,6 +3040,7 @@ static void audio_thread(void)
|
|||
if (!playing || playlist_end || ci.stop_codec)
|
||||
break;
|
||||
audio_fill_file_buffer(false, 0);
|
||||
register_buffer_low_callback(low_buffer_callback);
|
||||
break;
|
||||
|
||||
case Q_AUDIO_PLAY:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue