output_plugin: replaced method "control()" with "mixer()"

The output plugin shouldn't know any specifics of the mixer API.  Make
it return the mixer object, and let the caller deal with it.
This commit is contained in:
Max Kellermann 2009-02-16 01:39:00 +01:00
parent 79b50b7d9c
commit 37bc31d161
4 changed files with 45 additions and 28 deletions

View File

@ -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;
}

View File

@ -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
};

View File

@ -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,
};

View File

@ -63,6 +63,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
@ -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)