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
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.
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) {
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;
}
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;
}
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,