From 763dd8c1dd4de451663474bafd13068eb6017bbb Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sun, 25 Jan 2009 17:37:55 +0100 Subject: mixer: return a mixer struct pointer Don't use statically allocated mixer objects. --- src/mixer_api.c | 16 ++++++++++++++++ src/mixer_api.h | 7 +++++++ src/output/alsa_plugin.c | 14 +++++++------- src/output/oss_plugin.c | 18 ++++++++++-------- 4 files changed, 40 insertions(+), 15 deletions(-) diff --git a/src/mixer_api.c b/src/mixer_api.c index bd5e1ca05..cd216415a 100644 --- a/src/mixer_api.c +++ b/src/mixer_api.c @@ -37,6 +37,22 @@ void mixer_finish(struct mixer *mixer) 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) { assert(mixer != NULL && mixer->plugin != NULL); diff --git a/src/mixer_api.h b/src/mixer_api.h index c209f4b06..c563457c2 100644 --- a/src/mixer_api.h +++ b/src/mixer_api.h @@ -71,6 +71,13 @@ struct mixer { void mixer_init(struct mixer *mixer, const struct mixer_plugin *plugin); 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); bool mixer_open(struct mixer *mixer); bool mixer_control(struct mixer *mixer, int cmd, void *arg); diff --git a/src/output/alsa_plugin.c b/src/output/alsa_plugin.c index 23a9089cd..f08e99041 100644 --- a/src/output/alsa_plugin.c +++ b/src/output/alsa_plugin.c @@ -71,7 +71,7 @@ struct alsa_data { size_t frame_size; /** the mixer object associated with this output */ - struct mixer mixer; + struct mixer *mixer; }; static const char * @@ -90,7 +90,7 @@ alsa_data_new(void) ret->writei = snd_pcm_writei; //use alsa mixer by default - mixer_init(&ret->mixer, &alsa_mixer); + ret->mixer = mixer_new(&alsa_mixer); return ret; } @@ -99,7 +99,7 @@ static void alsa_data_free(struct alsa_data *ad) { g_free(ad->device); - mixer_finish(&ad->mixer); + mixer_free(ad->mixer); free(ad); } @@ -148,7 +148,7 @@ alsa_init(G_GNUC_UNUSED struct audio_output *ao, alsa_configure(ad, param); if (param) { - mixer_configure(&ad->mixer, param); + mixer_configure(ad->mixer, param); } return ad; @@ -208,7 +208,7 @@ alsa_open(void *data, struct audio_format *audio_format) unsigned int period_time, period_time_ro; unsigned int buffer_time; - mixer_open(&ad->mixer); + mixer_open(ad->mixer); if ((bitformat = get_bitformat(audio_format)) == SND_PCM_FORMAT_UNKNOWN) g_warning("ALSA device \"%s\" doesn't support %u bit audio\n", @@ -436,7 +436,7 @@ alsa_close(void *data) ad->pcm = NULL; } - mixer_close(&ad->mixer); + mixer_close(ad->mixer); } static bool @@ -475,7 +475,7 @@ static bool alsa_control(void *data, int cmd, void *arg) { 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 = { diff --git a/src/output/oss_plugin.c b/src/output/oss_plugin.c index b80024b29..0107dbdd2 100644 --- a/src/output/oss_plugin.c +++ b/src/output/oss_plugin.c @@ -55,7 +55,9 @@ typedef struct _OssData { int numSupported[3]; int *unsupported[3]; int numUnsupported[3]; - struct mixer mixer; + + /** the mixer object associated with this output */ + struct mixer *mixer; } OssData; enum oss_support { @@ -276,7 +278,7 @@ static OssData *newOssData(void) supportParam(ret, SNDCTL_DSP_CHANNELS, 2); supportParam(ret, SNDCTL_DSP_SAMPLESIZE, 16); - mixer_init( &ret->mixer, &oss_mixer); + ret->mixer = mixer_new(&oss_mixer); return ret; } @@ -290,7 +292,7 @@ static void freeOssData(OssData * od) g_free(od->unsupported[OSS_CHANNELS]); g_free(od->unsupported[OSS_BITS]); - mixer_finish(&od->mixer); + mixer_free(od->mixer); free(od); } @@ -355,7 +357,7 @@ static void *oss_open_default(const struct config_param *param) if (ret[i] == 0) { OssData *od = newOssData(); od->device = default_devices[i]; - mixer_configure(&od->mixer, param); + mixer_configure(od->mixer, param); return od; } } @@ -396,7 +398,7 @@ oss_initDriver(G_GNUC_UNUSED struct audio_output *audioOutput, if (device != NULL) { OssData *od = newOssData(); od->device = device; - mixer_configure(&od->mixer, param); + mixer_configure(od->mixer, param); 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.sample_rate); - mixer_open(&od->mixer); + mixer_open(od->mixer); return ret; } @@ -532,7 +534,7 @@ static void oss_closeDevice(void *data) OssData *od = data; oss_close(od); - mixer_close(&od->mixer); + mixer_close(od->mixer); } static void oss_dropBufferedAudio(void *data) @@ -575,7 +577,7 @@ static bool oss_control(void *data, int cmd, void *arg) { OssData *od = data; - return mixer_control(&od->mixer, cmd, arg); + return mixer_control(od->mixer, cmd, arg); } const struct audio_output_plugin ossPlugin = { -- cgit v1.2.3