summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrandon Low <lostlogic@rockbox.org>2007-11-03 06:21:32 +0000
committerBrandon Low <lostlogic@rockbox.org>2007-11-03 06:21:32 +0000
commit11a3661d73884f627c804fbcc0e5be820511cbfa (patch)
tree53dfa0de2d5beb78d51981859f67db96a5b0db1d
parentfe2f1af0d3374b1a87ba958b67cb92729bf76071 (diff)
downloadrockbox-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.c44
-rw-r--r--apps/playback.c57
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: