Index: applet/contents/ui/ListItemBase.qml =================================================================== --- applet/contents/ui/ListItemBase.qml +++ applet/contents/ui/ListItemBase.qml @@ -331,6 +331,47 @@ contextMenu.addMenuItem(menuItem); } } + + // Choose output / input device + // By choice only shown when there are at least two options + if ((type == "sink-input" && sinkView.count > 1) || (type == "source-input" && sourceView.count)) { + contextMenu.addMenuItem(newSeperator()); + var menuItem = newMenuItem(); + menuItem.text = type == "sink-input" ? i18nc("Heading for a list of possible output devices (speakers, headphones, ...) to choose", "Play audio using") : i18nc("Heading for a list of possible input devices (built-in microphone, headset, ...) to choose", "Record audio using"); + menuItem.section = true; + contextMenu.addMenuItem(menuItem); + + if (type == "sink-input") { + for (var i = 0; i < sinkView.model.count; ++i) { + var data = sinkView.model.get(i); + var menuItem = createDeviceMenuItem(data); + contextMenu.addMenuItem(menuItem); + } + } + + else if (type == "source-input") { + for (var i = 0; i < sourceView.model.count; ++i) { + var data = sourceView.model.get(i); + var menuItem = createDeviceMenuItem(data); + contextMenu.addMenuItem(menuItem); + } + } + } + } + + function createDeviceMenuItem(data) { + var menuItem = newMenuItem(); + menuItem.text = data.Description; + menuItem.enabled = true; + menuItem.checkable = true; + menuItem.checked = data.Index === PulseObject.deviceIndex; + var setActiveSink = function(sinkIndex) { + return function() { + PulseObject.deviceIndex = sinkIndex; + }; + }; + menuItem.clicked.connect(setActiveSink(data.Index)); + return menuItem; } function show() {