aboutsummaryrefslogtreecommitdiffstats
path: root/src/audioOutputs/audioOutput_shout.c
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2008-09-24 07:20:55 +0200
committerMax Kellermann <max@duempel.org>2008-09-24 07:20:55 +0200
commitacc4a0ba2dd0be3f28c4ca009e08d1cc1bbc534a (patch)
tree7d4ea0359c85f67d0366fb58ae80c8aa35f3a473 /src/audioOutputs/audioOutput_shout.c
parent63fb1efb5cd6665b73ced155ba89a5c7f094d9ab (diff)
downloadmpd-acc4a0ba2dd0be3f28c4ca009e08d1cc1bbc534a.tar.gz
mpd-acc4a0ba2dd0be3f28c4ca009e08d1cc1bbc534a.tar.xz
mpd-acc4a0ba2dd0be3f28c4ca009e08d1cc1bbc534a.zip
output: make "struct audio_output" opaque for output plugins
We have eliminated direct accesses to the audio_output struct from the all output plugins. Make it opaque for them, and move its real declaration to output_internal.h, similar to decoder_internal.h. Pass the opaque structure to plugin.init() only, which will return the plugin's data pointer on success, and NULL on failure. This data pointer will be passed to all other methods instead of the audio_output struct.
Diffstat (limited to 'src/audioOutputs/audioOutput_shout.c')
-rw-r--r--src/audioOutputs/audioOutput_shout.c50
1 files changed, 26 insertions, 24 deletions
diff --git a/src/audioOutputs/audioOutput_shout.c b/src/audioOutputs/audioOutput_shout.c
index 8612cde2f..feb4b4d8f 100644
--- a/src/audioOutputs/audioOutput_shout.c
+++ b/src/audioOutputs/audioOutput_shout.c
@@ -87,9 +87,9 @@ static void free_shout_data(struct shout_data *sd)
} \
}
-static int my_shout_init_driver(struct audio_output *audio_output,
- const struct audio_format *audio_format,
- ConfigParam * param)
+static void *my_shout_init_driver(mpd_unused struct audio_output *audio_output,
+ const struct audio_format *audio_format,
+ ConfigParam *param)
{
struct shout_data *sd;
char *test;
@@ -263,9 +263,11 @@ static int my_shout_init_driver(struct audio_output *audio_output,
}
}
- audio_output->data = sd;
+ if (sd->encoder->init_func(sd) != 0)
+ FATAL("shout: encoder plugin '%s' failed to initialize\n",
+ sd->encoder->name);
- return sd->encoder->init_func(sd);
+ return sd;
}
static int handle_shout_error(struct shout_data *sd, int err)
@@ -325,9 +327,9 @@ static void close_shout_conn(struct shout_data * sd)
sd->opened = 0;
}
-static void my_shout_finish_driver(struct audio_output *audio_output)
+static void my_shout_finish_driver(void *data)
{
- struct shout_data *sd = (struct shout_data *) audio_output->data;
+ struct shout_data *sd = (struct shout_data *)data;
close_shout_conn(sd);
@@ -340,17 +342,17 @@ static void my_shout_finish_driver(struct audio_output *audio_output)
shout_shutdown();
}
-static void my_shout_drop_buffered_audio(struct audio_output *audio_output)
+static void my_shout_drop_buffered_audio(void *data)
{
- struct shout_data *sd = (struct shout_data *)audio_output->data;
+ struct shout_data *sd = (struct shout_data *)data;
timer_reset(sd->timer);
/* needs to be implemented for shout */
}
-static void my_shout_close_device(struct audio_output *audio_output)
+static void my_shout_close_device(void *data)
{
- struct shout_data *sd = (struct shout_data *) audio_output->data;
+ struct shout_data *sd = (struct shout_data *)data;
close_shout_conn(sd);
@@ -416,9 +418,9 @@ static int shout_connect(struct shout_data *sd)
}
}
-static int open_shout_conn(struct audio_output *audio_output)
+static int open_shout_conn(void *data)
{
- struct shout_data *sd = (struct shout_data *) audio_output->data;
+ struct shout_data *sd = (struct shout_data *)data;
int status;
status = shout_connect(sd);
@@ -440,12 +442,12 @@ static int open_shout_conn(struct audio_output *audio_output)
return 0;
}
-static int my_shout_open_device(struct audio_output *audio_output,
+static int my_shout_open_device(void *data,
struct audio_format *audio_format)
{
- struct shout_data *sd = (struct shout_data *) audio_output->data;
+ struct shout_data *sd = (struct shout_data *)data;
- if (!sd->opened && open_shout_conn(audio_output) < 0)
+ if (!sd->opened && open_shout_conn(sd) < 0)
return -1;
if (sd->timer)
@@ -476,10 +478,10 @@ static void send_metadata(struct shout_data * sd)
sd->tag_to_send = 0;
}
-static int my_shout_play(struct audio_output *audio_output,
+static int my_shout_play(void *data,
const char *chunk, size_t size)
{
- struct shout_data *sd = (struct shout_data *) audio_output->data;
+ struct shout_data *sd = (struct shout_data *)data;
int status;
if (!sd->timer->started)
@@ -491,9 +493,9 @@ static int my_shout_play(struct audio_output *audio_output,
send_metadata(sd);
if (!sd->opened) {
- status = open_shout_conn(audio_output);
+ status = open_shout_conn(sd);
if (status < 0) {
- my_shout_close_device(audio_output);
+ my_shout_close_device(sd);
return -1;
} else if (status > 0) {
timer_sync(sd->timer);
@@ -502,22 +504,22 @@ static int my_shout_play(struct audio_output *audio_output,
}
if (sd->encoder->encode_func(sd, chunk, size)) {
- my_shout_close_device(audio_output);
+ my_shout_close_device(sd);
return -1;
}
if (write_page(sd) < 0) {
- my_shout_close_device(audio_output);
+ my_shout_close_device(sd);
return -1;
}
return 0;
}
-static void my_shout_set_tag(struct audio_output *audio_output,
+static void my_shout_set_tag(void *data,
const struct tag *tag)
{
- struct shout_data *sd = (struct shout_data *) audio_output->data;
+ struct shout_data *sd = (struct shout_data *)data;
if (sd->tag)
tag_free(sd->tag);