mixer: return a mixer struct pointer

Don't use statically allocated mixer objects.
This commit is contained in:
Max Kellermann 2009-01-25 17:37:55 +01:00
parent ad8561bfdc
commit 763dd8c1dd
4 changed files with 40 additions and 15 deletions

View File

@ -37,6 +37,22 @@ void mixer_finish(struct mixer *mixer)
mixer->plugin = NULL; mixer->plugin = NULL;
} }
struct mixer *
mixer_new(const struct mixer_plugin *plugin)
{
struct mixer *mixer = g_new(struct mixer, 1);
mixer_init(mixer, plugin);
return mixer;
}
void
mixer_free(struct mixer *mixer)
{
mixer_finish(mixer);
g_free(mixer);
}
void mixer_configure(struct mixer *mixer, const struct config_param *param) void mixer_configure(struct mixer *mixer, const struct config_param *param)
{ {
assert(mixer != NULL && mixer->plugin != NULL); assert(mixer != NULL && mixer->plugin != NULL);

View File

@ -71,6 +71,13 @@ struct mixer {
void mixer_init(struct mixer *mixer, const struct mixer_plugin *plugin); void mixer_init(struct mixer *mixer, const struct mixer_plugin *plugin);
void mixer_finish(struct mixer *mixer); void mixer_finish(struct mixer *mixer);
struct mixer *
mixer_new(const struct mixer_plugin *plugin);
void
mixer_free(struct mixer *mixer);
void mixer_configure(struct mixer *mixer, const struct config_param *param); void mixer_configure(struct mixer *mixer, const struct config_param *param);
bool mixer_open(struct mixer *mixer); bool mixer_open(struct mixer *mixer);
bool mixer_control(struct mixer *mixer, int cmd, void *arg); bool mixer_control(struct mixer *mixer, int cmd, void *arg);

View File

@ -71,7 +71,7 @@ struct alsa_data {
size_t frame_size; size_t frame_size;
/** the mixer object associated with this output */ /** the mixer object associated with this output */
struct mixer mixer; struct mixer *mixer;
}; };
static const char * static const char *
@ -90,7 +90,7 @@ alsa_data_new(void)
ret->writei = snd_pcm_writei; ret->writei = snd_pcm_writei;
//use alsa mixer by default //use alsa mixer by default
mixer_init(&ret->mixer, &alsa_mixer); ret->mixer = mixer_new(&alsa_mixer);
return ret; return ret;
} }
@ -99,7 +99,7 @@ static void
alsa_data_free(struct alsa_data *ad) alsa_data_free(struct alsa_data *ad)
{ {
g_free(ad->device); g_free(ad->device);
mixer_finish(&ad->mixer); mixer_free(ad->mixer);
free(ad); free(ad);
} }
@ -148,7 +148,7 @@ alsa_init(G_GNUC_UNUSED struct audio_output *ao,
alsa_configure(ad, param); alsa_configure(ad, param);
if (param) { if (param) {
mixer_configure(&ad->mixer, param); mixer_configure(ad->mixer, param);
} }
return ad; return ad;
@ -208,7 +208,7 @@ alsa_open(void *data, struct audio_format *audio_format)
unsigned int period_time, period_time_ro; unsigned int period_time, period_time_ro;
unsigned int buffer_time; unsigned int buffer_time;
mixer_open(&ad->mixer); mixer_open(ad->mixer);
if ((bitformat = get_bitformat(audio_format)) == SND_PCM_FORMAT_UNKNOWN) if ((bitformat = get_bitformat(audio_format)) == SND_PCM_FORMAT_UNKNOWN)
g_warning("ALSA device \"%s\" doesn't support %u bit audio\n", g_warning("ALSA device \"%s\" doesn't support %u bit audio\n",
@ -436,7 +436,7 @@ alsa_close(void *data)
ad->pcm = NULL; ad->pcm = NULL;
} }
mixer_close(&ad->mixer); mixer_close(ad->mixer);
} }
static bool static bool
@ -475,7 +475,7 @@ static bool
alsa_control(void *data, int cmd, void *arg) alsa_control(void *data, int cmd, void *arg)
{ {
struct alsa_data *ad = data; struct alsa_data *ad = data;
return mixer_control(&ad->mixer, cmd, arg); return mixer_control(ad->mixer, cmd, arg);
} }
const struct audio_output_plugin alsaPlugin = { const struct audio_output_plugin alsaPlugin = {

View File

@ -55,7 +55,9 @@ typedef struct _OssData {
int numSupported[3]; int numSupported[3];
int *unsupported[3]; int *unsupported[3];
int numUnsupported[3]; int numUnsupported[3];
struct mixer mixer;
/** the mixer object associated with this output */
struct mixer *mixer;
} OssData; } OssData;
enum oss_support { enum oss_support {
@ -276,7 +278,7 @@ static OssData *newOssData(void)
supportParam(ret, SNDCTL_DSP_CHANNELS, 2); supportParam(ret, SNDCTL_DSP_CHANNELS, 2);
supportParam(ret, SNDCTL_DSP_SAMPLESIZE, 16); supportParam(ret, SNDCTL_DSP_SAMPLESIZE, 16);
mixer_init( &ret->mixer, &oss_mixer); ret->mixer = mixer_new(&oss_mixer);
return ret; return ret;
} }
@ -290,7 +292,7 @@ static void freeOssData(OssData * od)
g_free(od->unsupported[OSS_CHANNELS]); g_free(od->unsupported[OSS_CHANNELS]);
g_free(od->unsupported[OSS_BITS]); g_free(od->unsupported[OSS_BITS]);
mixer_finish(&od->mixer); mixer_free(od->mixer);
free(od); free(od);
} }
@ -355,7 +357,7 @@ static void *oss_open_default(const struct config_param *param)
if (ret[i] == 0) { if (ret[i] == 0) {
OssData *od = newOssData(); OssData *od = newOssData();
od->device = default_devices[i]; od->device = default_devices[i];
mixer_configure(&od->mixer, param); mixer_configure(od->mixer, param);
return od; return od;
} }
} }
@ -396,7 +398,7 @@ oss_initDriver(G_GNUC_UNUSED struct audio_output *audioOutput,
if (device != NULL) { if (device != NULL) {
OssData *od = newOssData(); OssData *od = newOssData();
od->device = device; od->device = device;
mixer_configure(&od->mixer, param); mixer_configure(od->mixer, param);
return od; return od;
} }
@ -522,7 +524,7 @@ oss_openDevice(void *data, struct audio_format *audioFormat)
od->audio_format.bits, od->audio_format.channels, od->audio_format.bits, od->audio_format.channels,
od->audio_format.sample_rate); od->audio_format.sample_rate);
mixer_open(&od->mixer); mixer_open(od->mixer);
return ret; return ret;
} }
@ -532,7 +534,7 @@ static void oss_closeDevice(void *data)
OssData *od = data; OssData *od = data;
oss_close(od); oss_close(od);
mixer_close(&od->mixer); mixer_close(od->mixer);
} }
static void oss_dropBufferedAudio(void *data) static void oss_dropBufferedAudio(void *data)
@ -575,7 +577,7 @@ static bool
oss_control(void *data, int cmd, void *arg) oss_control(void *data, int cmd, void *arg)
{ {
OssData *od = data; OssData *od = data;
return mixer_control(&od->mixer, cmd, arg); return mixer_control(od->mixer, cmd, arg);
} }
const struct audio_output_plugin ossPlugin = { const struct audio_output_plugin ossPlugin = {