output_plugin: the plugin allocates the audio_output object

Pass audio_output objects around instead of void pointers.  This will
give some more control to the plugin, and prepares for non-blocking
audio outputs.
This commit is contained in:
Max Kellermann
2011-09-16 23:31:48 +02:00
parent b4a8b8c0d4
commit 74617389c8
32 changed files with 835 additions and 557 deletions

View File

@@ -46,6 +46,8 @@
#endif
struct pulse_output {
struct audio_output base;
const char *name;
const char *server;
const char *sink;
@@ -342,16 +344,19 @@ pulse_output_setup_context(struct pulse_output *po, GError **error_r)
return true;
}
static void *
pulse_output_init(G_GNUC_UNUSED const struct audio_format *audio_format,
const struct config_param *param,
G_GNUC_UNUSED GError **error_r)
static struct audio_output *
pulse_output_init(const struct config_param *param, GError **error_r)
{
struct pulse_output *po;
g_setenv("PULSE_PROP_media.role", "music", true);
po = g_new(struct pulse_output, 1);
if (!ao_base_init(&po->base, &pulse_output_plugin, param, error_r)) {
g_free(po);
return NULL;
}
po->name = config_get_block_string(param, "name", "mpd_pulse");
po->server = config_get_block_string(param, "server", NULL);
po->sink = config_get_block_string(param, "sink", NULL);
@@ -361,21 +366,22 @@ pulse_output_init(G_GNUC_UNUSED const struct audio_format *audio_format,
po->context = NULL;
po->stream = NULL;
return po;
return &po->base;
}
static void
pulse_output_finish(void *data)
pulse_output_finish(struct audio_output *ao)
{
struct pulse_output *po = data;
struct pulse_output *po = (struct pulse_output *)ao;
ao_base_finish(&po->base);
g_free(po);
}
static bool
pulse_output_enable(void *data, GError **error_r)
pulse_output_enable(struct audio_output *ao, GError **error_r)
{
struct pulse_output *po = data;
struct pulse_output *po = (struct pulse_output *)ao;
assert(po->mainloop == NULL);
assert(po->context == NULL);
@@ -419,9 +425,9 @@ pulse_output_enable(void *data, GError **error_r)
}
static void
pulse_output_disable(void *data)
pulse_output_disable(struct audio_output *ao)
{
struct pulse_output *po = data;
struct pulse_output *po = (struct pulse_output *)ao;
assert(po->mainloop != NULL);
@@ -573,10 +579,10 @@ pulse_output_setup_stream(struct pulse_output *po, const pa_sample_spec *ss,
}
static bool
pulse_output_open(void *data, struct audio_format *audio_format,
pulse_output_open(struct audio_output *ao, struct audio_format *audio_format,
GError **error_r)
{
struct pulse_output *po = data;
struct pulse_output *po = (struct pulse_output *)ao;
pa_sample_spec ss;
int error;
@@ -647,9 +653,9 @@ pulse_output_open(void *data, struct audio_format *audio_format,
}
static void
pulse_output_close(void *data)
pulse_output_close(struct audio_output *ao)
{
struct pulse_output *po = data;
struct pulse_output *po = (struct pulse_output *)ao;
pa_operation *o;
assert(po->mainloop != NULL);
@@ -796,9 +802,10 @@ pulse_output_stream_pause(struct pulse_output *po, bool pause,
}
static size_t
pulse_output_play(void *data, const void *chunk, size_t size, GError **error_r)
pulse_output_play(struct audio_output *ao, const void *chunk, size_t size,
GError **error_r)
{
struct pulse_output *po = data;
struct pulse_output *po = (struct pulse_output *)ao;
int error;
assert(po->mainloop != NULL);
@@ -866,9 +873,9 @@ pulse_output_play(void *data, const void *chunk, size_t size, GError **error_r)
}
static void
pulse_output_cancel(void *data)
pulse_output_cancel(struct audio_output *ao)
{
struct pulse_output *po = data;
struct pulse_output *po = (struct pulse_output *)ao;
pa_operation *o;
assert(po->mainloop != NULL);
@@ -898,9 +905,9 @@ pulse_output_cancel(void *data)
}
static bool
pulse_output_pause(void *data)
pulse_output_pause(struct audio_output *ao)
{
struct pulse_output *po = data;
struct pulse_output *po = (struct pulse_output *)ao;
GError *error = NULL;
assert(po->mainloop != NULL);
@@ -945,12 +952,12 @@ pulse_output_test_default_device(void)
struct pulse_output *po;
bool success;
po = pulse_output_init(NULL, NULL, NULL);
po = (struct pulse_output *)pulse_output_init(NULL, NULL);
if (po == NULL)
return false;
success = pulse_output_wait_connection(po, NULL);
pulse_output_finish(po);
pulse_output_finish(&po->base);
return success;
}