summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorBrandon Low <lostlogic@rockbox.org>2006-04-14 14:03:43 +0000
committerBrandon Low <lostlogic@rockbox.org>2006-04-14 14:03:43 +0000
commit0291a6e200a982ba82fed8b1c80da2ea4f131f47 (patch)
tree553d05abf9713f4b8c3da2eb2727fbb506e16d53 /apps
parentfd08424694a0e3cdac04652a32ac8817b9880dcd (diff)
downloadrockbox-0291a6e200a982ba82fed8b1c80da2ea4f131f47.zip
rockbox-0291a6e200a982ba82fed8b1c80da2ea4f131f47.tar.gz
rockbox-0291a6e200a982ba82fed8b1c80da2ea4f131f47.tar.bz2
rockbox-0291a6e200a982ba82fed8b1c80da2ea4f131f47.tar.xz
Fix the queue implementation
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@9660 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r--apps/playback.c59
1 files changed, 41 insertions, 18 deletions
diff --git a/apps/playback.c b/apps/playback.c
index 167adbe..34b1e5b 100644
--- a/apps/playback.c
+++ b/apps/playback.c
@@ -119,6 +119,7 @@ enum {
Q_AUDIO_FILL_BUFFER,
Q_CODEC_REQUEST_COMPLETE,
+ Q_CODEC_REQUEST_FAILED,
Q_CODEC_LOAD,
Q_CODEC_LOAD_DISK,
@@ -788,17 +789,11 @@ static void audio_check_new_track(bool require_codec)
if (!playlist_check(new_track))
{
if (new_track >= 0)
- {
- ci.stop_codec = true;
- queue_post(&codec_callback_queue, Q_CODEC_REQUEST_COMPLETE, 0);
- }
+ queue_post(&codec_callback_queue, Q_CODEC_REQUEST_FAILED, 0);
/* Find the beginning backward if the user over-skips it */
while (!playlist_check(++new_track))
if (new_track >= 0)
- {
- ci.stop_codec = true;
- queue_post(&codec_callback_queue, Q_CODEC_REQUEST_COMPLETE, 0);
- }
+ queue_post(&codec_callback_queue, Q_CODEC_REQUEST_FAILED, 0);
}
/* Update the playlist */
last_peek_offset -= new_track;
@@ -885,7 +880,7 @@ static void rebuffer_and_seek(size_t newpos)
fd = open(trackname, O_RDONLY);
if (fd < 0) {
logf("Open failed!");
- queue_post(&codec_callback_queue, Q_CODEC_REQUEST_COMPLETE, 0);
+ queue_post(&codec_callback_queue, Q_CODEC_REQUEST_FAILED, 0);
return;
}
if (current_fd >= 0)
@@ -940,7 +935,17 @@ void codec_advance_buffer_callback(size_t amount)
queue_post(&audio_queue,
Q_AUDIO_REBUFFER_SEEK, (void *)(ci.curpos + amount));
queue_wait(&codec_callback_queue, &ev);
- return ;
+ switch (ev.id)
+ {
+ case Q_CODEC_REQUEST_FAILED:
+ ci.stop_codec = true;
+ case Q_CODEC_REQUEST_COMPLETE:
+ return;
+ default:
+ logf("Bad event on ccq");
+ ci.stop_codec = true;
+ return;
+ }
}
advance_buffer_counters(amount);
@@ -1011,7 +1016,17 @@ bool codec_seek_buffer_callback(size_t newpos)
struct event ev;
queue_post(&audio_queue, Q_AUDIO_REBUFFER_SEEK, (void *)newpos);
queue_wait(&codec_callback_queue, &ev);
- return true;
+ switch (ev.id)
+ {
+ case Q_CODEC_REQUEST_COMPLETE:
+ return true;
+ case Q_CODEC_REQUEST_FAILED:
+ ci.stop_codec = true;
+ return false;
+ default:
+ logf("Bad event on ccq");
+ return false;
+ }
}
/* Seeking inside buffer space. */
@@ -1817,12 +1832,19 @@ static bool load_next_track(bool require_codec) {
queue_post(&audio_queue, Q_AUDIO_CHECK_NEW_TRACK, (void *)require_codec);
queue_wait(&codec_callback_queue, &ev);
cpu_boost(false);
- if (ci.stop_codec)
- return false;
-
- track_skip_done(manual_skip);
-
- return true;
+ switch (ev.id)
+ {
+ case Q_CODEC_REQUEST_COMPLETE:
+ track_skip_done(manual_skip);
+ return true;
+ case Q_CODEC_REQUEST_FAILED:
+ ci.stop_codec = true;
+ return false;
+ default:
+ logf("Bad event on ccq");
+ ci.stop_codec = true;
+ return false;
+ }
}
static bool codec_request_next_track_callback(void)
@@ -2640,7 +2662,8 @@ void audio_preinit(void)
queue_init(&audio_queue);
queue_init(&codec_queue);
queue_init(&voice_codec_queue);
- queue_init(&codec_callback_queue);
+ /* clear, not init to create a private queue */
+ queue_clear(&codec_callback_queue);
create_thread(audio_thread, audio_stack, sizeof(audio_stack),
audio_thread_name);