From 2054627caa7f71c564ce35b4525b6281fcd2cc39 Mon Sep 17 00:00:00 2001 From: Michael Sevakis Date: Mon, 5 Jan 2009 10:31:19 +0000 Subject: Have the codec thread do callbacks instead of messing with the stack which is much simpler and safer. Remove threads array from plugin API since it now serves no purpose. Up minimum API version and sort. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19684 a1c6a512-1295-4272-9138-f99709370657 --- apps/playback.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'apps/playback.c') diff --git a/apps/playback.c b/apps/playback.c index 0f76666c1e..91f85f9408 100644 --- a/apps/playback.c +++ b/apps/playback.c @@ -150,6 +150,8 @@ enum { Q_ENCODER_LOAD_DISK, Q_ENCODER_RECORD, #endif + + Q_CODEC_DO_CALLBACK, }; enum filling_state { @@ -1303,6 +1305,13 @@ static void codec_thread(void) status = codec_load_buf(CUR_TI->codec_hid, &ci); break; + case Q_CODEC_DO_CALLBACK: + LOGFQUEUE("codec < Q_CODEC_DO_CALLBACK"); + queue_reply(&codec_queue, 1); + if ((void*)ev.data != NULL) + ((void (*)(void))ev.data)(); + break; + #ifdef AUDIO_HAVE_RECORDING case Q_ENCODER_LOAD_DISK: LOGFQUEUE("codec < Q_ENCODER_LOAD_DISK"); @@ -1419,6 +1428,18 @@ static void codec_thread(void) } } +/* Borrow the codec thread and return the ID */ +void codec_thread_do_callback(void (*fn)(void), unsigned int *id) +{ + /* Set id before telling thread to call something; it may be + * needed before this function returns. */ + if (id != NULL) + *id = codec_thread_id; + + /* Codec thread will signal just before entering callback */ + LOGFQUEUE("codec >| Q_CODEC_DO_CALLBACK"); + queue_send(&codec_queue, Q_CODEC_DO_CALLBACK, (intptr_t)fn); +} /* --- Buffering callbacks --- */ -- cgit v1.2.3