diff options
-rw-r--r-- | src/modules/alsa/alsa-ucm.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/src/modules/alsa/alsa-ucm.c b/src/modules/alsa/alsa-ucm.c index 785b23453..50a7cd8d8 100644 --- a/src/modules/alsa/alsa-ucm.c +++ b/src/modules/alsa/alsa-ucm.c @@ -1279,6 +1279,7 @@ void pa_alsa_ucm_add_port( } static bool devset_supports_device(pa_idxset *devices, pa_alsa_ucm_device *dev) { + const char *sink, *sink2, *source, *source2; pa_alsa_ucm_device *d; uint32_t idx; @@ -1302,12 +1303,26 @@ static bool devset_supports_device(pa_idxset *devices, pa_alsa_ucm_device *dev) if (!pa_idxset_issubset(devices, dev->supported_devices)) return false; - /* Must not be unsupported by any selected device */ - PA_IDXSET_FOREACH(d, devices, idx) + sink = pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_SINK); + source = pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_SOURCE); + + PA_IDXSET_FOREACH(d, devices, idx) { + /* Must not be unsupported by any selected device */ if (!pa_idxset_isempty(d->supported_devices)) if (!pa_idxset_contains(d->supported_devices, dev)) return false; + /* PlaybackPCM must not be the same as any selected device */ + sink2 = pa_proplist_gets(d->proplist, PA_ALSA_PROP_UCM_SINK); + if (sink && sink2 && pa_streq(sink, sink2)) + return false; + + /* CapturePCM must not be the same as any selected device */ + source2 = pa_proplist_gets(d->proplist, PA_ALSA_PROP_UCM_SOURCE); + if (source && source2 && pa_streq(source, source2)) + return false; + } + return true; } |