Commit 936449c6 authored by Max Kellermann's avatar Max Kellermann

mixer_api: removed struct mixer_data

The mixer plugins should re-use the mixer struct and incorporate it in their object class.
parent dc575106
......@@ -26,6 +26,9 @@
#define VOLUME_MIXER_ALSA_CONTROL_DEFAULT "PCM"
struct alsa_mixer {
/** the base mixer class */
struct mixer base;
char *device;
char *control;
snd_mixer_t *handle;
......@@ -35,10 +38,12 @@ struct alsa_mixer {
int volume_set;
};
static struct mixer_data *
static struct mixer *
alsa_mixer_init(const struct config_param *param)
{
struct alsa_mixer *am = g_malloc(sizeof(struct alsa_mixer));
struct alsa_mixer *am = g_new(struct alsa_mixer, 1);
mixer_init(&am->base, &alsa_mixer);
am->device = config_dup_block_string(param, "mixer_device", NULL);
am->control = config_dup_block_string(param, "mixer_control", NULL);
......@@ -49,11 +54,11 @@ alsa_mixer_init(const struct config_param *param)
am->volume_max = 0;
am->volume_set = -1;
return (struct mixer_data *)am;
return &am->base;
}
static void
alsa_mixer_finish(struct mixer_data *data)
alsa_mixer_finish(struct mixer *data)
{
struct alsa_mixer *am = (struct alsa_mixer *)data;
......@@ -63,7 +68,7 @@ alsa_mixer_finish(struct mixer_data *data)
}
static void
alsa_mixer_close(struct mixer_data *data)
alsa_mixer_close(struct mixer *data)
{
struct alsa_mixer *am = (struct alsa_mixer *)data;
if (am->handle) snd_mixer_close(am->handle);
......@@ -71,7 +76,7 @@ alsa_mixer_close(struct mixer_data *data)
}
static bool
alsa_mixer_open(struct mixer_data *data)
alsa_mixer_open(struct mixer *data)
{
struct alsa_mixer *am = (struct alsa_mixer *)data;
int err;
......@@ -142,7 +147,7 @@ alsa_mixer_open(struct mixer_data *data)
}
static bool
alsa_mixer_control(struct mixer_data *data, int cmd, void *arg)
alsa_mixer_control(struct mixer *data, int cmd, void *arg)
{
struct alsa_mixer *am = (struct alsa_mixer *)data;
switch (cmd) {
......
......@@ -36,16 +36,21 @@
#define VOLUME_MIXER_OSS_DEFAULT "/dev/mixer"
struct oss_mixer {
/** the base mixer class */
struct mixer base;
char *device;
char *control;
int device_fd;
int volume_control;
};
static struct mixer_data *
static struct mixer *
oss_mixer_init(const struct config_param *param)
{
struct oss_mixer *om = g_malloc(sizeof(struct oss_mixer));
struct oss_mixer *om = g_new(struct oss_mixer, 1);
mixer_init(&om->base, &oss_mixer);
om->device = config_dup_block_string(param, "mixer_device", NULL);
om->control = config_dup_block_string(param, "mixer_control", NULL);
......@@ -53,11 +58,11 @@ oss_mixer_init(const struct config_param *param)
om->device_fd = -1;
om->volume_control = SOUND_MIXER_PCM;
return (struct mixer_data *)om;
return &om->base;
}
static void
oss_mixer_finish(struct mixer_data *data)
oss_mixer_finish(struct mixer *data)
{
struct oss_mixer *om = (struct oss_mixer *) data;
......@@ -67,7 +72,7 @@ oss_mixer_finish(struct mixer_data *data)
}
static void
oss_mixer_close(struct mixer_data *data)
oss_mixer_close(struct mixer *data)
{
struct oss_mixer *om = (struct oss_mixer *) data;
if (om->device_fd != -1)
......@@ -91,7 +96,7 @@ oss_find_mixer(const char *name)
}
static bool
oss_mixer_open(struct mixer_data *data)
oss_mixer_open(struct mixer *data)
{
struct oss_mixer *om = (struct oss_mixer *) data;
const char *device = VOLUME_MIXER_OSS_DEFAULT;
......@@ -133,7 +138,7 @@ oss_mixer_open(struct mixer_data *data)
}
static bool
oss_mixer_control(struct mixer_data *data, int cmd, void *arg)
oss_mixer_control(struct mixer *data, int cmd, void *arg)
{
struct oss_mixer *om = (struct oss_mixer *) data;
switch (cmd) {
......
......@@ -21,14 +21,6 @@
#include "mixer_api.h"
void mixer_finish(struct mixer *mixer)
{
assert(mixer != NULL && mixer->plugin != NULL);
mixer->plugin->finish(mixer->data);
mixer->data = NULL;
mixer->plugin = NULL;
}
struct mixer *
mixer_new(const struct mixer_plugin *plugin, const struct config_param *param)
{
......@@ -36,33 +28,36 @@ mixer_new(const struct mixer_plugin *plugin, const struct config_param *param)
assert(plugin != NULL);
mixer = g_new(struct mixer, 1);
mixer->plugin = plugin;
mixer->data = mixer->plugin->init(param);
mixer = plugin->init(param);
assert(mixer->plugin == plugin);
return mixer;
}
void
mixer_free(struct mixer *mixer)
{
mixer_finish(mixer);
g_free(mixer);
assert(mixer != NULL);
assert(mixer->plugin != NULL);
mixer->plugin->finish(mixer);
}
bool mixer_open(struct mixer *mixer)
{
assert(mixer != NULL && mixer->plugin != NULL);
return mixer->plugin->open(mixer->data);
return mixer->plugin->open(mixer);
}
bool mixer_control(struct mixer *mixer, int cmd, void *arg)
{
assert(mixer != NULL && mixer->plugin != NULL);
return mixer->plugin->control(mixer->data, cmd, arg);
return mixer->plugin->control(mixer, cmd, arg);
}
void mixer_close(struct mixer *mixer)
{
assert(mixer != NULL && mixer->plugin != NULL);
mixer->plugin->close(mixer->data);
mixer->plugin->close(mixer);
}
......@@ -28,41 +28,42 @@
extern const struct mixer_plugin alsa_mixer;
extern const struct mixer_plugin oss_mixer;
struct mixer_data;
struct mixer_plugin {
/**
* Alocates and configures a mixer device.
*/
struct mixer_data *(*init)(const struct config_param *param);
struct mixer *(*init)(const struct config_param *param);
/**
* Finish and free mixer data
*/
void (*finish)(struct mixer_data *data);
void (*finish)(struct mixer *data);
/**
* Open mixer device
*/
bool (*open)(struct mixer_data *data);
bool (*open)(struct mixer *data);
/**
* Control mixer device.
*/
bool (*control)(struct mixer_data *data, int cmd, void *arg);
bool (*control)(struct mixer *data, int cmd, void *arg);
/**
* Close mixer device
*/
void (*close)(struct mixer_data *data);
void (*close)(struct mixer *data);
};
struct mixer {
const struct mixer_plugin *plugin;
struct mixer_data *data;
};
void mixer_finish(struct mixer *mixer);
static inline void
mixer_init(struct mixer *mixer, const struct mixer_plugin *plugin)
{
mixer->plugin = plugin;
}
struct mixer *
mixer_new(const struct mixer_plugin *plugin, const struct config_param *param);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment