aboutsummaryrefslogtreecommitdiffstats
path: root/src/audioOutputs/audioOutput_oss.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_oss.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_oss.c')
-rw-r--r--src/audioOutputs/audioOutput_oss.c48
1 files changed, 23 insertions, 25 deletions
diff --git a/src/audioOutputs/audioOutput_oss.c b/src/audioOutputs/audioOutput_oss.c
index d2041faa1..f5195ab44 100644
--- a/src/audioOutputs/audioOutput_oss.c
+++ b/src/audioOutputs/audioOutput_oss.c
@@ -333,8 +333,7 @@ static int oss_testDefault(void)
return -1;
}
-static int oss_open_default(mpd_unused struct audio_output *ao,
- ConfigParam *param, OssData *od)
+static void *oss_open_default(ConfigParam *param)
{
int i;
int err[ARRAY_SIZE(default_devices)];
@@ -343,6 +342,7 @@ static int oss_open_default(mpd_unused struct audio_output *ao,
for (i = ARRAY_SIZE(default_devices); --i >= 0; ) {
ret[i] = oss_statDevice(default_devices[i], &err[i]);
if (ret[i] == 0) {
+ OssData *od = newOssData();
od->device = default_devices[i];
return 0;
}
@@ -371,28 +371,27 @@ static int oss_open_default(mpd_unused struct audio_output *ao,
}
}
exit(EXIT_FAILURE);
- return 0; /* some compilers can be dumb... */
+ return NULL; /* some compilers can be dumb... */
}
-static int oss_initDriver(struct audio_output *audioOutput,
- mpd_unused const struct audio_format *audio_format,
- ConfigParam * param)
+static void *oss_initDriver(mpd_unused struct audio_output *audioOutput,
+ mpd_unused const struct audio_format *audio_format,
+ ConfigParam * param)
{
- OssData *od = newOssData();
- audioOutput->data = od;
if (param) {
BlockParam *bp = getBlockParam(param, "device");
if (bp) {
+ OssData *od = newOssData();
od->device = bp->value;
- return 0;
+ return od;
}
}
- return oss_open_default(audioOutput, param, od);
+ return oss_open_default(param);
}
-static void oss_finishDriver(struct audio_output *audioOutput)
+static void oss_finishDriver(void *data)
{
- OssData *od = audioOutput->data;
+ OssData *od = data;
freeOssData(od);
}
@@ -434,10 +433,9 @@ static void oss_close(OssData * od)
od->fd = -1;
}
-static int oss_open(struct audio_output *audioOutput)
+static int oss_open(OssData *od)
{
int tmp;
- OssData *od = audioOutput->data;
if ((od->fd = open(od->device, O_WRONLY)) < 0) {
ERROR("Error opening OSS device \"%s\": %s\n", od->device,
@@ -478,17 +476,17 @@ fail:
return -1;
}
-static int oss_openDevice(struct audio_output *audioOutput,
+static int oss_openDevice(void *data,
struct audio_format *audioFormat)
{
int ret;
- OssData *od = audioOutput->data;
+ OssData *od = data;
od->channels = (mpd_sint8)audioFormat->channels;
od->sampleRate = audioFormat->sampleRate;
od->bits = (mpd_sint8)audioFormat->bits;
- if ((ret = oss_open(audioOutput)) < 0)
+ if ((ret = oss_open(od)) < 0)
return ret;
audioFormat->channels = od->channels;
@@ -501,16 +499,16 @@ static int oss_openDevice(struct audio_output *audioOutput,
return ret;
}
-static void oss_closeDevice(struct audio_output *audioOutput)
+static void oss_closeDevice(void *data)
{
- OssData *od = audioOutput->data;
+ OssData *od = data;
oss_close(od);
}
-static void oss_dropBufferedAudio(struct audio_output *audioOutput)
+static void oss_dropBufferedAudio(void *data)
{
- OssData *od = audioOutput->data;
+ OssData *od = data;
if (od->fd >= 0) {
ioctl(od->fd, SNDCTL_DSP_RESET, 0);
@@ -518,14 +516,14 @@ static void oss_dropBufferedAudio(struct audio_output *audioOutput)
}
}
-static int oss_playAudio(struct audio_output *audioOutput,
+static int oss_playAudio(void *data,
const char *playChunk, size_t size)
{
- OssData *od = audioOutput->data;
+ OssData *od = data;
ssize_t ret;
/* reopen the device since it was closed by dropBufferedAudio */
- if (od->fd < 0 && oss_open(audioOutput) < 0)
+ if (od->fd < 0 && oss_open(od) < 0)
return -1;
while (size > 0) {
@@ -535,7 +533,7 @@ static int oss_playAudio(struct audio_output *audioOutput,
continue;
ERROR("closing oss device \"%s\" due to write error: "
"%s\n", od->device, strerror(errno));
- oss_closeDevice(audioOutput);
+ oss_closeDevice(od);
return -1;
}
playChunk += ret;