From 86edc05b25d905e4115b6c2b1fc51a8f7bd94a15 Mon Sep 17 00:00:00 2001 From: "Eugene (RushFuture) Nepomniashchiy" Date: Mon, 16 Mar 2015 22:03:57 +0300 Subject: [PATCH] improve alsa device enumeration method --- src/jacksettings.py | 62 +++++++++++++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 22 deletions(-) diff --git a/src/jacksettings.py b/src/jacksettings.py index b20532c..0409ddb 100755 --- a/src/jacksettings.py +++ b/src/jacksettings.py @@ -22,6 +22,7 @@ from PyQt4.QtCore import pyqtSlot, Qt, QSettings, QTimer, SIGNAL, SLOT from PyQt4.QtGui import QDialog, QDialogButtonBox, QFontMetrics, QMessageBox from sys import platform, version_info +from pprint import pprint # ------------------------------------------------------------------------------------------------------------ # Imports (Custom Stuff) @@ -691,26 +692,47 @@ class JackSettingsW(QDialog): # ----------------------------------------------------------------- # Helper functions - def getAlsaDeviceList(self): - alsaDeviceList = [] + def getAlsaDeviceListHelper(self, mode): + '''mode can be set to "aplay" or "arecord"''' + output = getoutput("env LANG=C %s -L | grep -A1 ^dmix" % mode).split("\n") - aplay_out = getoutput("env LANG=C aplay -l").split("\n") - for line in aplay_out: + info = {} + for line in output: line = line.strip() - if line.startswith("card "): - cardInfo = line.split(", ", 1)[0].split(": ") - cardIndex = cardInfo[0].replace("card ", "") - cardName = cardInfo[1].split(" [")[0] + if line == '--': continue + if line.startswith("dmix:"): + info = dict([n.split('=') for n in line.split(':')[1].split(',')]) + continue + info['NAME'] = line + + if info['CARD'] == 'Loopback': continue + + desc = "hw:%(CARD)s,%(DEV)s [%(NAME)s]" % info + yield desc + + def getAlsaDeviceList(self, control = None, mode = 'Duplex'): + alsaDeviceList = [] + + playback = [] + capture = [] - deviceInfo = line.split(", ", 1)[1].split(": ") - deviceIndex = deviceInfo[0].replace("device ", "") - deviceName = deviceInfo[1].split(" [")[0] + if mode in ['Duplex', 'Playback']: + playback = self.getAlsaDeviceListHelper('aplay') - if cardName != "Loopback": - fullName = "hw:%s,%s [%s]" % (cardName, deviceIndex, deviceName) - alsaDeviceList.append(fullName) + if mode in ['Duplex', 'Capture']: + capture = self.getAlsaDeviceListHelper('arecord') + + result = [] + if mode == 'Playback': + result = set(playback) + elif mode == 'Capture': + result = set(capture) + else: + result = set(playback).intersection(capture) - return alsaDeviceList + for line in list(result): + if control: + control(line) def setComboBoxValue(self, box, text, split=False): for i in range(box.count()): @@ -760,9 +782,7 @@ class JackSettingsW(QDialog): self.ui.obj_driver_device.clear() if driverHasFeature("device"): if LINUX and self.fDriverName == "alsa": - dev_list = self.getAlsaDeviceList() - for dev in dev_list: - self.ui.obj_driver_device.addItem(dev) + self.getAlsaDeviceList(self.ui.obj_driver_device.addItem) else: dev_list = gJackctl.GetParameterConstraint(["driver", "device"])[3] for i in range(len(dev_list)): @@ -777,10 +797,8 @@ class JackSettingsW(QDialog): self.ui.obj_driver_playback.addItem("none") if LINUX: - dev_list = self.getAlsaDeviceList() - for dev in dev_list: - self.ui.obj_driver_capture.addItem(dev) - self.ui.obj_driver_playback.addItem(dev) + self.getAlsaDeviceList(self.ui.obj_driver_capture.addItem, 'Capture') + self.getAlsaDeviceList(self.ui.obj_driver_playback.addItem, 'Playback') else: dev_list = gJackctl.GetParameterConstraint(["driver", "device"])[3] for i in range(len(dev_list)):