summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2006-04-06 17:41:46 +0200
committerTakashi Iwai <tiwai@suse.de>2006-04-06 17:41:46 +0200
commit3cd8d134e5f94d08c33178a594519eadbbf7eaf8 (patch)
tree31f9201df424ade39be4a3839b122bf39787de80
parent74bdac50b257b986cea38a2c08134c430fc5654f (diff)
Misc fixes for upmix plugin
- Add channel option to specify the output channels explicitly - Fix 6-channel input
-rw-r--r--doc/upmix.txt21
-rw-r--r--mix/pcm_upmix.c30
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,