From 3cd8d134e5f94d08c33178a594519eadbbf7eaf8 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Thu, 6 Apr 2006 17:41:46 +0200 Subject: Misc fixes for upmix plugin - Add channel option to specify the output channels explicitly - Fix 6-channel input --- doc/upmix.txt | 21 ++++++++++++++++----- mix/pcm_upmix.c | 30 ++++++++++++++++++++++++++---- 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/doc/upmix.txt b/doc/upmix.txt index b8a6da4..56720a4 100644 --- a/doc/upmix.txt +++ b/doc/upmix.txt @@ -1,10 +1,10 @@ UPMIX PLUGIN ============ -The upmix plugin is an easy-to-use plugin for upmixing from 1 or 2 -channel stream to 4 or 6-channel stream. The number of channels to be -expanded is determined by the slave PCM. For example, the following -PCM defines upmixing to 5.1 from 2-6 channels input: +The upmix plugin is an easy-to-use plugin for upmixing to 4 or +6-channel stream. The number of channels to be expanded is determined +by the slave PCM or explicitly via channel option. For example, the +following PCM defines upmixing to 5.1 from 1-6 channels input: pcm.upmix51 { type upmix @@ -22,12 +22,23 @@ option in msec. For example, to set 10ms delay in the above case: pcm.upmix51 { type upmix slave.pcm "surround51" - channels 6 delay 10 } As default, 15ms delay is used. +The channel option specifies the number of channels of output. Either +4 or 6 channels are supported. When 0 is passed, the plugin tries 4 +or 6 channels appropriately suitable for the slave pcm. The channel +option is useful if the slave PCM has no strict input condition (like +plug or route plugin). + + pcm.myupmix { + type upmix + slave.pcm "something" + channels 6 + } + The center and LFE channels are the average of sum of left and right signals. diff --git a/mix/pcm_upmix.c b/mix/pcm_upmix.c index ed8d041..9ca5bf4 100644 --- a/mix/pcm_upmix.c +++ b/mix/pcm_upmix.c @@ -290,8 +290,10 @@ static int upmix_init(snd_pcm_extplug_t *ext) stype = (ext->slave_channels == 6) ? 1 : 0; ctype = ext->channels - 1; - if (ctype < 0 || ctype >= 5) + if (ctype < 0 || ctype > 5) { + SNDERR("Invalid channel numbers for upmix: %d", ctype + 1); return -EINVAL; + } mix->upmix = do_upmix[ctype][stype]; if (mix->delay_ms) { @@ -327,6 +329,7 @@ SND_PCM_PLUGIN_DEFINE_FUNC(upmix) snd_pcm_upmix_t *mix; snd_config_t *sconf = NULL; static unsigned int chlist[2] = {4, 6}; + unsigned int channels = 0; int delay = 10; int err; @@ -350,6 +353,20 @@ SND_PCM_PLUGIN_DEFINE_FUNC(upmix) } delay = val; } + if (strcmp(id, "channels") == 0) { + long val; + err = snd_config_get_integer(n, &val); + if (err < 0) { + SNDERR("Invalid value for %s", id); + return err; + } + channels = val; + if (channels != 4 && channels != 6 && channels != 0) { + SNDERR("channels must be 4, 6 or 0"); + return -EINVAL; + } + continue; + } SNDERR("Unknown field %s", id); return -EINVAL; } @@ -382,9 +399,14 @@ SND_PCM_PLUGIN_DEFINE_FUNC(upmix) snd_pcm_extplug_set_param_minmax(&mix->ext, SND_PCM_EXTPLUG_HW_CHANNELS, 1, 6); - snd_pcm_extplug_set_slave_param_list(&mix->ext, - SND_PCM_EXTPLUG_HW_CHANNELS, - 2, chlist); + if (channels) + snd_pcm_extplug_set_slave_param_minmax(&mix->ext, + SND_PCM_EXTPLUG_HW_CHANNELS, + channels, channels); + else + snd_pcm_extplug_set_slave_param_list(&mix->ext, + SND_PCM_EXTPLUG_HW_CHANNELS, + 2, chlist); snd_pcm_extplug_set_param(&mix->ext, SND_PCM_EXTPLUG_HW_FORMAT, SND_PCM_FORMAT_S16); snd_pcm_extplug_set_slave_param(&mix->ext, SND_PCM_EXTPLUG_HW_FORMAT, -- cgit