aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/audio.c16
-rw-r--r--src/output/alsa_plugin.c17
-rw-r--r--src/output/oss_plugin.c17
-rw-r--r--src/output_plugin.h23
4 files changed, 45 insertions, 28 deletions
diff --git a/src/audio.c b/src/audio.c
index 47916a5f..e5b04396 100644
--- a/src/audio.c
+++ b/src/audio.c
@@ -62,15 +62,17 @@ void finishAudioConfig(void)
bool mixer_control_setvol(unsigned int device, int volume, int rel)
{
struct audio_output *output;
+ struct mixer *mixer;
if (device >= audio_output_count())
return false;
output = audio_output_get(device);
- if (output->plugin && output->plugin->control) {
+ mixer = ao_plugin_get_mixer(output->plugin, output->data);
+ if (mixer != NULL) {
if (rel) {
int cur_volume;
- if (!output->plugin->control(output->data, AC_MIXER_GETVOL, &cur_volume)) {
+ if (!mixer_control(mixer, AC_MIXER_GETVOL, &cur_volume)) {
return false;
}
volume = volume + cur_volume;
@@ -80,7 +82,7 @@ bool mixer_control_setvol(unsigned int device, int volume, int rel)
else if (volume < 0)
volume = 0;
- return output->plugin->control(output->data, AC_MIXER_SETVOL, &volume);
+ return mixer_control(mixer, AC_MIXER_SETVOL, &volume);
}
return false;
}
@@ -88,13 +90,15 @@ bool mixer_control_setvol(unsigned int device, int volume, int rel)
bool mixer_control_getvol(unsigned int device, int *volume)
{
struct audio_output *output;
+ struct mixer *mixer;
if (device >= audio_output_count())
return false;
output = audio_output_get(device);
- if (output->plugin && output->plugin->control) {
- return output->plugin->control(output->data, AC_MIXER_GETVOL, volume);
- }
+ mixer = ao_plugin_get_mixer(output->plugin, output->data);
+ if (mixer != NULL)
+ return mixer_control(mixer, AC_MIXER_GETVOL, volume);
+
return false;
}
diff --git a/src/output/alsa_plugin.c b/src/output/alsa_plugin.c
index c26fcdf0..bbb03e80 100644
--- a/src/output/alsa_plugin.c
+++ b/src/output/alsa_plugin.c
@@ -156,6 +156,14 @@ alsa_finish(void *data)
alsa_data_free(ad);
}
+static struct mixer *
+alsa_get_mixer(void *data)
+{
+ struct alsa_data *ad = data;
+
+ return ad->mixer;
+}
+
static bool
alsa_test_default_device(void)
{
@@ -465,21 +473,14 @@ alsa_play(void *data, const char *chunk, size_t size)
return true;
}
-static bool
-alsa_control(void *data, int cmd, void *arg)
-{
- struct alsa_data *ad = data;
- return mixer_control(ad->mixer, cmd, arg);
-}
-
const struct audio_output_plugin alsaPlugin = {
.name = "alsa",
.test_default_device = alsa_test_default_device,
.init = alsa_init,
.finish = alsa_finish,
+ .get_mixer = alsa_get_mixer,
.open = alsa_open,
.play = alsa_play,
.cancel = alsa_cancel,
.close = alsa_close,
- .control = alsa_control
};
diff --git a/src/output/oss_plugin.c b/src/output/oss_plugin.c
index c4b4698e..007d5bc8 100644
--- a/src/output/oss_plugin.c
+++ b/src/output/oss_plugin.c
@@ -410,6 +410,14 @@ static void oss_finishDriver(void *data)
freeOssData(od);
}
+static struct mixer *
+oss_get_mixer(void *data)
+{
+ OssData *od = data;
+
+ return od->mixer;
+}
+
static int setParam(OssData * od, unsigned param, int *value)
{
int val = *value;
@@ -571,21 +579,14 @@ oss_playAudio(void *data, const char *playChunk, size_t size)
return true;
}
-static bool
-oss_control(void *data, int cmd, void *arg)
-{
- OssData *od = data;
- return mixer_control(od->mixer, cmd, arg);
-}
-
const struct audio_output_plugin ossPlugin = {
.name = "oss",
.test_default_device = oss_testDefault,
.init = oss_initDriver,
.finish = oss_finishDriver,
+ .get_mixer = oss_get_mixer,
.open = oss_openDevice,
.play = oss_playAudio,
.cancel = oss_dropBufferedAudio,
.close = oss_closeDevice,
- .control = oss_control,
};
diff --git a/src/output_plugin.h b/src/output_plugin.h
index 0166322f..b652dc44 100644
--- a/src/output_plugin.h
+++ b/src/output_plugin.h
@@ -64,6 +64,15 @@ struct audio_output_plugin {
void (*finish)(void *data);
/**
+ * Returns the mixer device associated with this audio output.
+ * This does not actually open the mixer device yet.
+ *
+ * @return the mixer object, or NULL if there is no mixer
+ * attached to this audio output
+ */
+ struct mixer *(*get_mixer)(void *data);
+
+ /**
* Really open the device.
* @param audio_format the audio format in which data is going
* to be delivered; may be modified by the plugin
@@ -104,12 +113,6 @@ struct audio_output_plugin {
* for continue to pause
*/
bool (*pause)(void *data);
-
- /**
- * Control the device. Usualy used for implementing
- * set and get mixer levels
- */
- bool (*control)(void *data, int cmd, void *arg);
};
static inline bool
@@ -135,6 +138,14 @@ ao_plugin_finish(const struct audio_output_plugin *plugin, void *data)
plugin->finish(data);
}
+static inline struct mixer *
+ao_plugin_get_mixer(const struct audio_output_plugin *plugin, void *data)
+{
+ return plugin->get_mixer != NULL
+ ? plugin->get_mixer(data)
+ : NULL;
+}
+
static inline bool
ao_plugin_open(const struct audio_output_plugin *plugin,
void *data, struct audio_format *audio_format)