diff --git a/apps/buffering.c b/apps/buffering.c index d6dc84caa8..5a6500cfd8 100644 --- a/apps/buffering.c +++ b/apps/buffering.c @@ -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(); + } } } diff --git a/apps/playback.c b/apps/playback.c index 0a929e634a..d9e55b762f 100644 --- a/apps/playback.c +++ b/apps/playback.c @@ -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: