decoder_control: store GCond object, not a player_control

Remove the decoder dependency on player_control.  All player_control
was needed for is to signal the player thread, and we can do that with
a simple GCond as well.
This commit is contained in:
Max Kellermann 2011-01-10 21:27:43 +01:00
parent 39c5af5dbc
commit a0ad96a787
7 changed files with 20 additions and 28 deletions

View File

@ -21,7 +21,6 @@
#include "decoder_api.h" #include "decoder_api.h"
#include "decoder_internal.h" #include "decoder_internal.h"
#include "decoder_control.h" #include "decoder_control.h"
#include "player_control.h"
#include "audio.h" #include "audio.h"
#include "song.h" #include "song.h"
#include "buffer.h" #include "buffer.h"
@ -63,10 +62,9 @@ decoder_initialized(struct decoder *decoder,
decoder_lock(dc); decoder_lock(dc);
dc->state = DECODE_STATE_DECODE; dc->state = DECODE_STATE_DECODE;
g_cond_signal(dc->client_cond);
decoder_unlock(dc); decoder_unlock(dc);
player_lock_signal(dc->player_control);
g_debug("audio_format=%s, seekable=%s", g_debug("audio_format=%s, seekable=%s",
audio_format_to_string(&dc->in_audio_format, &af_string), audio_format_to_string(&dc->in_audio_format, &af_string),
seekable ? "true" : "false"); seekable ? "true" : "false");
@ -115,9 +113,8 @@ decoder_command_finished(struct decoder *decoder)
} }
dc->command = DECODE_COMMAND_NONE; dc->command = DECODE_COMMAND_NONE;
g_cond_signal(dc->client_cond);
decoder_unlock(dc); decoder_unlock(dc);
player_lock_signal(dc->player_control);
} }
double decoder_seek_where(G_GNUC_UNUSED struct decoder * decoder) double decoder_seek_where(G_GNUC_UNUSED struct decoder * decoder)
@ -214,7 +211,7 @@ do_send_tag(struct decoder *decoder, struct input_stream *is,
/* there is a partial chunk - flush it, we want the /* there is a partial chunk - flush it, we want the
tag in a new chunk */ tag in a new chunk */
decoder_flush_chunk(decoder); decoder_flush_chunk(decoder);
player_lock_signal(decoder->dc->player_control); g_cond_signal(decoder->dc->client_cond);
} }
assert(decoder->chunk == NULL); assert(decoder->chunk == NULL);
@ -329,7 +326,7 @@ decoder_data(struct decoder *decoder,
if (dest == NULL) { if (dest == NULL) {
/* the chunk is full, flush it */ /* the chunk is full, flush it */
decoder_flush_chunk(decoder); decoder_flush_chunk(decoder);
player_lock_signal(dc->player_control); g_cond_signal(dc->client_cond);
continue; continue;
} }
@ -348,7 +345,7 @@ decoder_data(struct decoder *decoder,
if (full) { if (full) {
/* the chunk is full, flush it */ /* the chunk is full, flush it */
decoder_flush_chunk(decoder); decoder_flush_chunk(decoder);
player_lock_signal(dc->player_control); g_cond_signal(dc->client_cond);
} }
data += nbytes; data += nbytes;
@ -432,7 +429,7 @@ decoder_replay_gain(struct decoder *decoder,
replay gain values affect the following replay gain values affect the following
samples */ samples */
decoder_flush_chunk(decoder); decoder_flush_chunk(decoder);
player_lock_signal(decoder->dc->player_control); g_cond_signal(decoder->dc->client_cond);
} }
} else } else
decoder->replay_gain_serial = 0; decoder->replay_gain_serial = 0;

View File

@ -19,7 +19,6 @@
#include "config.h" #include "config.h"
#include "decoder_control.h" #include "decoder_control.h"
#include "player_control.h"
#include "pipe.h" #include "pipe.h"
#include <assert.h> #include <assert.h>
@ -28,15 +27,15 @@
#define G_LOG_DOMAIN "decoder_control" #define G_LOG_DOMAIN "decoder_control"
struct decoder_control * struct decoder_control *
dc_new(struct player_control *pc) dc_new(GCond *client_cond)
{ {
struct decoder_control *dc = g_new(struct decoder_control, 1); struct decoder_control *dc = g_new(struct decoder_control, 1);
dc->player_control = pc;
dc->thread = NULL; dc->thread = NULL;
dc->mutex = g_mutex_new(); dc->mutex = g_mutex_new();
dc->cond = g_cond_new(); dc->cond = g_cond_new();
dc->client_cond = client_cond;
dc->state = DECODE_STATE_STOP; dc->state = DECODE_STATE_STOP;
dc->command = DECODE_COMMAND_NONE; dc->command = DECODE_COMMAND_NONE;
@ -65,7 +64,7 @@ static void
dc_command_wait_locked(struct decoder_control *dc) dc_command_wait_locked(struct decoder_control *dc)
{ {
while (dc->command != DECODE_COMMAND_NONE) while (dc->command != DECODE_COMMAND_NONE)
player_wait_decoder(dc->player_control, dc); g_cond_wait(dc->client_cond, dc->mutex);
} }
static void static void

View File

@ -27,8 +27,6 @@
#include <assert.h> #include <assert.h>
struct player_control;
enum decoder_state { enum decoder_state {
DECODE_STATE_STOP = 0, DECODE_STATE_STOP = 0,
DECODE_STATE_START, DECODE_STATE_START,
@ -44,12 +42,6 @@ enum decoder_state {
}; };
struct decoder_control { struct decoder_control {
/**
* The player thread which calls us. This pointer is used to
* signal command completion.
*/
struct player_control *player_control;
/** the handle of the decoder thread, or NULL if the decoder /** the handle of the decoder thread, or NULL if the decoder
thread isn't running */ thread isn't running */
GThread *thread; GThread *thread;
@ -66,6 +58,12 @@ struct decoder_control {
*/ */
GCond *cond; GCond *cond;
/**
* The trigger of this object's client. It is signalled
* whenever an event occurs.
*/
GCond *client_cond;
enum decoder_state state; enum decoder_state state;
enum decoder_command command; enum decoder_command command;
@ -107,7 +105,7 @@ struct decoder_control {
G_GNUC_MALLOC G_GNUC_MALLOC
struct decoder_control * struct decoder_control *
dc_new(struct player_control *pc); dc_new(GCond *client_cond);
void void
dc_free(struct decoder_control *dc); dc_free(struct decoder_control *dc);

View File

@ -20,7 +20,6 @@
#include "config.h" #include "config.h"
#include "decoder_internal.h" #include "decoder_internal.h"
#include "decoder_control.h" #include "decoder_control.h"
#include "player_control.h"
#include "pipe.h" #include "pipe.h"
#include "input_stream.h" #include "input_stream.h"
#include "buffer.h" #include "buffer.h"
@ -65,7 +64,7 @@ need_chunks(struct decoder_control *dc, struct input_stream *is, bool do_wait)
if ((is == NULL || !decoder_input_buffer(dc, is)) && do_wait) { if ((is == NULL || !decoder_input_buffer(dc, is)) && do_wait) {
decoder_wait(dc); decoder_wait(dc);
player_signal(dc->player_control); g_cond_signal(dc->client_cond);
return dc->command; return dc->command;
} }

View File

@ -26,7 +26,6 @@
#include "decoder_api.h" #include "decoder_api.h"
#include "replay_gain_ape.h" #include "replay_gain_ape.h"
#include "input_stream.h" #include "input_stream.h"
#include "player_control.h"
#include "pipe.h" #include "pipe.h"
#include "song.h" #include "song.h"
#include "tag.h" #include "tag.h"
@ -67,7 +66,7 @@ decoder_command_finished_locked(struct decoder_control *dc)
dc->command = DECODE_COMMAND_NONE; dc->command = DECODE_COMMAND_NONE;
player_signal(dc->player_control); g_cond_signal(dc->client_cond);
} }
/** /**

View File

@ -69,7 +69,7 @@ player_wait_decoder(struct player_control *pc, struct decoder_control *dc)
{ {
assert(pc != NULL); assert(pc != NULL);
assert(dc != NULL); assert(dc != NULL);
assert(dc->player_control == pc); assert(dc->client_cond == pc->cond);
/* during this function, the decoder lock is held, because /* during this function, the decoder lock is held, because
we're waiting for the decoder thread */ we're waiting for the decoder thread */

View File

@ -1024,7 +1024,7 @@ player_task(gpointer arg)
{ {
struct player_control *pc = arg; struct player_control *pc = arg;
struct decoder_control *dc = dc_new(pc); struct decoder_control *dc = dc_new(pc->cond);
decoder_thread_start(dc); decoder_thread_start(dc);
player_buffer = music_buffer_new(pc->buffer_chunks); player_buffer = music_buffer_new(pc->buffer_chunks);