diff options
author | Takashi Iwai <tiwai@suse.de> | 2006-04-06 17:41:46 +0200 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2006-04-06 17:41:46 +0200 |
commit | 3cd8d134e5f94d08c33178a594519eadbbf7eaf8 (patch) | |
tree | 31f9201df424ade39be4a3839b122bf39787de80 | |
parent | 74bdac50b257b986cea38a2c08134c430fc5654f (diff) |
Misc fixes for upmix plugin
- Add channel option to specify the output channels explicitly
- Fix 6-channel input
-rw-r--r-- | doc/upmix.txt | 21 | ||||
-rw-r--r-- | 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, |