Viewing file: soundcardBackend.py (14.82 KB) -rwxr-xr-x Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
## soundcardBackend.py - Contains the backend code needed for system-config-soundcard ## Copyright (C) 2002, 2003 Red Hat, Inc. ## Copyright (C) 2002, 2003 Brent Fox <bfox@redhat.com> ## Copyright (C) 2004, 2005 Bastien Nocera <hadess@hadess.net>
## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version.
## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details.
## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
import string import kudzu import os import getopt import sys import commands
## ## I18N ## from rhpl.translate import _, N_ import rhpl.translate as translate translate.textdomain ("system-config-soundcard")
## ## Get position ## def position(list, name): for line in list: if line[1] == name: return line[0] return 0
## ## Load list of drivers ## def read_driver_list(): try: fd = open('/proc/asound/modules', 'r') except: return []
list = fd.readlines() fd.close()
drivers = [] for line in list: tmp = line.split() drivers.append([int(tmp[0]), string.replace(tmp[1],'_','-')])
return drivers
## ## Sort fnc for box ## def card_sort(card1, card2): return cmp(card1.position, card2.position)
## ## Usage ## def usage(): print \ _("""Usage: system-config-soundcard [OPTIONS] Options: -h, --help display this help and exit -k, --kernel= which kernel version to assume: 2.4 (modules.conf) 2.6 (modprobe.conf, default) """)
## ## Options ##
global kernel_type kver = os.uname()[2] kernel_type = string.join(kver.split('.')[0:2], '.') def options(): try: (opts, rest_args) = getopt.getopt(sys.argv[1:], "hk:", ["driver=", "help", "kernel="]) except (getopt.GetoptError), e: print e print usage() sys.exit(1) for (opt, value) in opts: if opt == "-h" or opt == "--help": usage() sys.exit(0) if opt == "-k" or opt == "--kernel": kernel_type = value if kernel_type != '2.4' and kernel_type != '2.6': print "ERROR: Invalid kernel version:", kernel_type usage() sys.exit(0)
class soundcardBackend: def __init__(self): self.defaultModule = None self.newFile = [] self.readFile() self.cardList = [] self.dspList = [] self.hardware_device = 0 self.default_device = 0 self.default_card = 0 self.dynamic_keys = 0 self.readConfig()
def probeCards(self): driverList = read_driver_list() list = kudzu.probe(kudzu.CLASS_AUDIO, kudzu.BUS_PCI | kudzu.BUS_MACIO, kudzu.PROBE_ALL)
print "----------- Kudzu -------------" for card in list: print card print "----------- **** -------------"
for card in list: #Let's go through the list of cards. If the driver is 'unknown', #don't put the card in the list. if card.driver != "unknown": card.position = position(driverList,card.driver) self.cardList.append(card)
# Same thing with ISA cards list = kudzu.probe(kudzu.CLASS_AUDIO, kudzu.BUS_ISAPNP, kudzu.PROBE_ALL) for card in list: if card.driver != "unknown": card.position = position(driverList,card.driver) self.cardList.append(card)
# Only add USB audio devices that have snd-usb-audio as the driver list = kudzu.probe(kudzu.CLASS_AUDIO, kudzu.BUS_USB, kudzu.PROBE_ALL) for card in list: if card.driver == "snd-usb-audio": card.position = position(driverList,card.driver) self.cardList.append(card)
# Same with Mac sound devices list = kudzu.probe(kudzu.CLASS_AUDIO, kudzu.BUS_MACIO, kudzu.PROBE_ALL) for card in list: if card.driver == "snd_powermac": card.position = position(driverList,card.driver) self.cardList.append(card)
self.cardList.sort(card_sort)
if self.cardList != []: self.defaultModule = self.cardList[0].driver
return self.cardList
def getData(self, card): device, module, description = card if (string.count(description,"|") == 1): maker, model = string.split(description, "|") elif (string.count(description," ") > 0): maker, model = string.split(description, " ", 1) else: maker = description model = description
return device, module, maker, model
def playTestSound(self, module, index): self.setVolume(index)
if kernel_type == '2.6': device = "plughw:%d,0"% index
path = "/usr/bin/aplay" args = [path, "-D", device, "-N", "/usr/share/system-config-soundcard/sound-sample.wav"]
if kernel_type == "2.4": if self.dspList == []: device = "/dev/dsp" else: device = "/dev/dsp%d" % self.dspList.index(module)
path = "/usr/bin/play" args = [path, "-d", device, "/usr/share/system-config-soundcard/sound-sample.wav", "-v", "2"]
pid = os.fork() if (not pid): os.execv(path, args) else: os.waitpid(pid,0)
def readFile(self): if kernel_type == '2.6': fd = open('/etc/modprobe.conf', 'r') if kernel_type == '2.4': fd = open('/etc/modules.conf', 'r') lines = fd.readlines() fd.close()
self.newFile = []
for line in lines: #strip out all lines dealing with sound if (string.find(line, "sound-slot-") < 0 and string.find(line,"snd-card-") < 0) or string.strip(line)[0] == "#": self.newFile.append(line) def writeFile(self, selectedCard): self.selectedCard = selectedCard aliasList = [] aumixList = [] self.dspList = []
device, self.defaultModule, maker, model = self.getData(self.cardList[selectedCard]) if kernel_type == '2.6': aliasList.append("alias snd-card-0 %s\n" % self.defaultModule) aumixList.append("install %s /sbin/modprobe --ignore-install %s && /usr/sbin/alsactl restore >/dev/null 2>&1 ||:\n" % (self.defaultModule, self.defaultModule)) aumixList.append("remove %s { /usr/sbin/alsactl store >/dev/null 2>&1 || : ; }; /sbin/modprobe -r --ignore-remove %s\n" % (self.defaultModule, self.defaultModule)) if kernel_type == '2.4': aliasList.append("alias sound-slot-0 %s\n" % self.defaultModule) aumixList.append("post-install sound-slot-0 /bin/aumix-minimal -f /etc/.aumixrc -L >/dev/null 2>&1 || :\n") aumixList.append("pre-remove sound-slot-0 /bin/aumix-minimal -f /etc/.aumixrc -S >/dev/null 2>&1 || :\n") self.dspList.append(self.defaultModule)
count = 1 for card in self.cardList: device, module, maker, model = self.getData(card)
if module == self.defaultModule: #We've already written this line, so skip pass else: if kernel_type == '2.6': aliasList.append("alias snd-card-%d %s\n" % (count, module)) aumixList.append("install %s /sbin/modprobe --ignore-install %s && /usr/sbin/alsactl restore >/dev/null 2>&1 ||:\n" % (module, module)) aumixList.append("remove %s { /usr/sbin/alsactl store >/dev/null 2>&1 || : ; }; /sbin/modprobe -r --ignore-remove %s\n" % (module, module)) if kernel_type == '2.4': aliasList.append("alias sound-slot-%d %s\n" % (count, module)) aumixList.append("post-install sound-slot-%d /bin/aumix-minimal -f /etc/.aumixrc -L >/dev/null 2>&1 || :\n" % count) aumixList.append("pre-remove sound-slot-%d /bin/aumix-minimal -f /etc/.aumixrc -S >/dev/null 2>&1 || :\n" % count) self.dspList.append(module) count = count + 1
#Let's re-read the file again to make sure we're starting from a clean base self.readFile() self.newFile = self.newFile + aliasList + aumixList
if kernel_type == '2.6': fd = open('/etc/modprobe.conf', 'w') if kernel_type == '2.4': fd = open('/etc/modules.conf', 'w')
for line in self.newFile: fd.write(line)
fd.close()
def setVolume(self, index): if kernel_type == '2.4': aumix_path = "/bin/aumix-minimal" aumix_pid = os.fork() aumix_args = [aumix_path, "-f", "/etc/.aumixrc", "-L"]
if (not aumix_pid): try: os.execv(aumix_path, aumix_args) except: sys.exit(0) else: os.waitpid(aumix_pid,0)
#alsa drivers load muted. we need to set the volume for them. if kernel_type == '2.6': amixer_path = "/usr/bin/alsaunmute" amixer_pid = os.fork() amixer_args = [amixer_path, `index`, "-v"]
if (not amixer_pid): try: os.execv(amixer_path, amixer_args) except: sys.exit(0) else: os.waitpid(amixer_pid,0)
def setDefaultCard(self, index): self.default_card = index def getDefaultCard(self): return self.cardList[self.default_card]
def getDefaultCardNum(self): return self.default_card
def setDefaultDevice(self, index): self.default_device = index
def getDefaultDevice(self): return self.default_device
def setHardwareDevice(self, state): self.hardware_device = state;
def getHardwareDevice(self): return self.hardware_device
def setDynamicKeys(self, state): self.dynamic_keys = state;
def getDynamicKeys(self): return self.dynamic_keys
def reconfigureDynamicKeys(self): if self.dynamic_keys : if os.path.exists("/var/run/console/console.lock"): os.system("/usr/bin/ainit `cat /var/run/console/console.lock` start") else: if os.path.exists("/var/run/console/console.lock"): os.system("/usr/bin/ainit `cat /var/run/console/console.lock` stop")
def writeConfig(self):
# Writing to asound.conf index = self.default_card device = self.default_device if kernel_type == '2.6': lines = []
lines.append("#Generated by system-config-soundcard, do not edit by hand\n") if self.hardware_device: lines.append("#HWCONF\n") lines.append("#DEV %d\n" % device) lines.append("pcm.!default { type hw card %d device %d } \n" % (index, device)) lines.append("ctl.!default { type hw card %d }\n" % index) else: lines.append("#SWCONF\n") lines.append("#DEV %d\n" % device) lines.append("defaults.pcm.card %d \n" % index) lines.append("defaults.pcm.device %d \n" % device) lines.append("defaults.ctl.card %d \n" % index)
fd = open('/etc/asound.conf', 'w') for line in lines: fd.write(line) fd.close()
# re-writing ainit.conf fd = open('/etc/alsa/ainit.conf', 'r') lines = fd.readlines() fd.close()
lines_out = [] for line in lines: line_tmp = string.split(string.strip(line)) if line_tmp != [] and cmp(string.lower(line_tmp[0]),"enable") == 0: if self.dynamic_keys: lines_out.append("enable = yes\n") else: lines_out.append("enable = no\n") else: lines_out.append(line)
fd = open('/etc/alsa/ainit.conf', 'w') fd.writelines(lines_out) fd.close()
def readConfig(self): # Check alsa configuration try: fd = open('/etc/asound.conf', 'r') line = fd.readline() line = fd.readline() self.hardware_device = (cmp(line[:7],'#HWCONF') != 1)
line = fd.readline() if not cmp(line[:4],'#DEV'): self.default_device = int(line[4:]) fd.close() except: self.hardware_device = 0 self.default_device = 0
# Check ainit configuration try: fd = open('/etc/alsa/ainit.conf', 'r') lines = fd.readlines() fd.close()
for line in lines: line = string.split(string.strip(line)) if line != [] and cmp(string.lower(line[0]),"enable") == 0: self.dynamic_keys = (cmp(string.lower(line[2]),'yes') == 0) break; except: self.dynamic_keys = 0
try: self.default_card = int(commands.getoutput('/usr/bin/alsacard')) except: self.default_card = 0
print "Read config:\ncard %d\ndevice %d\nHW %d" % (self.default_card, self.default_device, self.hardware_device)
def unloadModules(self): for card in self.cardList: device, module, maker, model = self.getData(card)
retval = os.system("/sbin/modprobe -r %s" % module)
def loadModules(self): retval = os.system("/sbin/modprobe %s" % self.defaultModule) if retval == 0: #Modprobe worked pass else: #Modprobe failed return self.defaultModule
for card in self.cardList: device, module, maker, model = self.getData(card)
if module == self.defaultModule: #We've already inserted this one, so don't try again pass else: retval = os.system("/sbin/modprobe %s" % module)
if retval == 0: #Modprobe worked pass else: #Modprobe failed return self.defaultModule
return 0
|