diff --git a/src/jacksettings.py b/src/jacksettings.py index b20532c..ae8bee1 100755 --- a/src/jacksettings.py +++ b/src/jacksettings.py @@ -56,10 +56,7 @@ JACK_TIMER_HPET = 2 if "linux" in platform: LINUX = True - if version_info >= (3, 0): - from subprocess import getoutput - else: - from commands import getoutput + import glob else: LINUX = False @@ -691,26 +688,48 @@ class JackSettingsW(QDialog): # ----------------------------------------------------------------- # Helper functions - def getAlsaDeviceList(self): - alsaDeviceList = [] + def getAlsaDeviceList(self, mode = 'DUPLEX'): + + class AlsaDevice: + @property + def key(self): + return '%s,%s' % (self.card, self.device) + + def has(self, mode): + if mode in self.mode: return True + if mode == 'DUPLEX': + if ('CAPTURE' in self.mode) and ('PLAYBACK' in self.mode): + return True + return False + + def __repr__(self): + return 'AlsaDevice' % (self.card, self.device, self.mode) - aplay_out = getoutput("env LANG=C aplay -l").split("\n") - for line in aplay_out: - line = line.strip() - if line.startswith("card "): - cardInfo = line.split(", ", 1)[0].split(": ") - cardIndex = cardInfo[0].replace("card ", "") - cardName = cardInfo[1].split(" [")[0] + alsaDeviceList = {} - deviceInfo = line.split(", ", 1)[1].split(": ") - deviceIndex = deviceInfo[0].replace("device ", "") - deviceName = deviceInfo[1].split(" [")[0] + for filename in glob.glob('/proc/asound/card*/*/info'): - if cardName != "Loopback": - fullName = "hw:%s,%s [%s]" % (cardName, deviceIndex, deviceName) - alsaDeviceList.append(fullName) + info = open(filename) + + device = AlsaDevice() + + for line in info: + key, value = line.split(':', 2) + setattr(device, key, value.strip()) + + # Skip loopback device + if device.name == 'Loopback': continue + + device_old = alsaDeviceList.get(device.key, None) + if device_old: + if device.stream not in device_old.mode: + device_old.mode.append(device.stream) + else: + device.mode = [ device.stream ] + alsaDeviceList[device.key] = device + + return [('hw:%s,%s [%s]' % (device.card, device.device, device.name)) for device in alsaDeviceList.values() if device.has(mode)] - return alsaDeviceList def setComboBoxValue(self, box, text, split=False): for i in range(box.count()): @@ -777,9 +796,12 @@ class JackSettingsW(QDialog): self.ui.obj_driver_playback.addItem("none") if LINUX: - dev_list = self.getAlsaDeviceList() + dev_list = self.getAlsaDeviceList('CAPTURE') for dev in dev_list: self.ui.obj_driver_capture.addItem(dev) + + dev_list = self.getAlsaDeviceList('PLAYBACK') + for dev in dev_list: self.ui.obj_driver_playback.addItem(dev) else: dev_list = gJackctl.GetParameterConstraint(["driver", "device"])[3]