enum snd_pcm_plug_route_policy {
PLUG_ROUTE_POLICY_NONE,
+ PLUG_ROUTE_POLICY_DEFAULT,
PLUG_ROUTE_POLICY_COPY,
PLUG_ROUTE_POLICY_SUM,
PLUG_ROUTE_POLICY_DUP,
snd_pcm_plug_t *plug = pcm->private_data;
unsigned int tt_ssize, tt_cused, tt_sused;
snd_pcm_route_ttable_entry_t *ttable;
+ enum snd_pcm_plug_route_policy rpolicy;
int err;
assert(snd_pcm_format_linear(slv->format));
if (clt->channels == slv->channels)
ttable = alloca(tt_cused * tt_sused * sizeof(*ttable));
for (k = 0; k < tt_cused * tt_sused; ++k)
ttable[k] = 0;
- switch (plug->route_policy) {
+ rpolicy = plug->route_policy;
+ if (rpolicy == PLUG_ROUTE_POLICY_DEFAULT) {
+ rpolicy = PLUG_ROUTE_POLICY_COPY;
+ if (pcm->stream == SND_PCM_STREAM_CAPTURE && clt->channels == 1)
+ rpolicy = PLUG_ROUTE_POLICY_SUM;
+ }
+ switch (rpolicy) {
case PLUG_ROUTE_POLICY_SUM:
case PLUG_ROUTE_POLICY_DUP:
if (clt->channels > slv->channels) {
}
while (n-- > 0) {
snd_pcm_route_ttable_entry_t v = FULL;
- if (plug->route_policy == PLUG_ROUTE_POLICY_SUM) {
+ if (rpolicy == PLUG_ROUTE_POLICY_SUM) {
if (pcm->stream == SND_PCM_STREAM_PLAYBACK &&
clt->channels > slv->channels) {
int srcs = clt->channels / slv->channels;
snd_pcm_t *spcm;
snd_config_t *slave = NULL, *sconf;
snd_config_t *tt = NULL;
- enum snd_pcm_plug_route_policy route_policy = PLUG_ROUTE_POLICY_SUM;
+ enum snd_pcm_plug_route_policy route_policy = PLUG_ROUTE_POLICY_DEFAULT;
snd_pcm_route_ttable_entry_t *ttable = NULL;
unsigned int cused, sused;
snd_pcm_format_t sformat = SND_PCM_FORMAT_UNKNOWN;
SNDERR("Invalid type for %s", id);
return -EINVAL;
}
- if (!strcmp(str, "sum"))
+ if (tt != NULL)
+ SNDERR("Table is defined, route policy is ignored");
+ if (!strcmp(str, "default"))
+ route_policy = PLUG_ROUTE_POLICY_DEFAULT;
+ else if (!strcmp(str, "sum"))
route_policy = PLUG_ROUTE_POLICY_SUM;
else if (!strcmp(str, "copy"))
route_policy = PLUG_ROUTE_POLICY_COPY;