diff options
| author | Brandon Low <lostlogic@rockbox.org> | 2007-11-03 06:21:32 +0000 |
|---|---|---|
| committer | Brandon Low <lostlogic@rockbox.org> | 2007-11-03 06:21:32 +0000 |
| commit | 11a3661d73884f627c804fbcc0e5be820511cbfa (patch) | |
| tree | 53dfa0de2d5beb78d51981859f67db96a5b0db1d | |
| parent | fe2f1af0d3374b1a87ba958b67cb92729bf76071 (diff) | |
| download | rockbox-11a3661d73884f627c804fbcc0e5be820511cbfa.zip rockbox-11a3661d73884f627c804fbcc0e5be820511cbfa.tar.gz rockbox-11a3661d73884f627c804fbcc0e5be820511cbfa.tar.bz2 rockbox-11a3661d73884f627c804fbcc0e5be820511cbfa.tar.xz | |
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
| -rw-r--r-- | apps/buffering.c | 44 | ||||
| -rw-r--r-- | apps/playback.c | 57 |
2 files changed, 56 insertions, 45 deletions
diff --git a/apps/buffering.c b/apps/buffering.c index d6dc84c..5a6500c 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 0a929e6..d9e55b7 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; + } + 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: + 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: - logf("Loading atomic %d",track_id3->codectype); - type = TYPE_ATOMIC_AUDIO; - break; - } + 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: |