From: <tr...@ff...> - 2014-01-29 17:31:25
|
Author: philippe Date: 2014-01-29 09:30:10 -0800 (Wed, 29 Jan 2014) New Revision: 2473 Modified: trunk/libffado/src/dice/dice_eap.cpp trunk/libffado/support/mixer-qt4/ffado/mixer/generic_dice_eap.py trunk/libffado/support/mixer-qt4/ffado/mixer/globalmixer.py trunk/libffado/support/mixer-qt4/ffado/panelmanager.py trunk/libffado/support/mixer-qt4/ffado/widgets/crossbarrouter.py trunk/libffado/support/mixer-qt4/ffado/widgets/matrixmixer.py Log: ffado-mixer/DICE EAP: file saving of settings. Complementary commit: Add saving of mixer section Modified: trunk/libffado/src/dice/dice_eap.cpp =================================================================== --- trunk/libffado/src/dice/dice_eap.cpp 2014-01-29 17:21:17 UTC (rev 2472) +++ trunk/libffado/src/dice/dice_eap.cpp 2014-01-29 17:30:10 UTC (rev 2473) @@ -1381,8 +1381,8 @@ debugWarning("Mixer is read-only\n"); return false; } - int nb_inputs = m_eap.m_mixer_nb_tx; - int addr = ((nb_inputs * col) + row) * 4; + int nb_outputs = m_eap.m_mixer_nb_tx; + int addr = ((nb_outputs * col) + row) * 4; quadlet_t tmp = (quadlet_t) val; if(!m_eap.writeRegBlock(eRT_Mixer, 4+addr, &tmp, 4)) { debugError("Failed to write coefficient\n"); @@ -1394,8 +1394,8 @@ double EAP::Mixer::getValue( const int row, const int col) { - int nb_inputs = m_eap.m_mixer_nb_tx; - int addr = ((nb_inputs * col) + row) * 4; + int nb_outputs = m_eap.m_mixer_nb_tx; + int addr = ((nb_outputs * col) + row) * 4; quadlet_t tmp; if(!m_eap.readRegBlock(eRT_Mixer, 4+addr, &tmp, 4)) { debugError("Failed to read coefficient\n"); Modified: trunk/libffado/support/mixer-qt4/ffado/mixer/generic_dice_eap.py =================================================================== --- trunk/libffado/support/mixer-qt4/ffado/mixer/generic_dice_eap.py 2014-01-29 17:21:17 UTC (rev 2472) +++ trunk/libffado/support/mixer-qt4/ffado/mixer/generic_dice_eap.py 2014-01-29 17:30:10 UTC (rev 2473) @@ -1,5 +1,6 @@ # # Copyright (C) 2009-2010 by Arnold Krille +# 2013 by Philippe Carriere # # This file is part of FFADO # FFADO = Free Firewire (pro-)audio drivers for linux @@ -68,24 +69,59 @@ def saveSettings(self, indent): saveString = [] + idt = indent + " " + saveString.append('%s<mixer>\n' % indent) + saveString.extend(self.mixer.saveSettings(idt)) + # Do not forget to mention the adopted rule for matrix columns mixer + # This might be useful for future import function + saveString.append("%s <col_rule>\n" % indent) + saveString.append("%s Columns_are_outputs\n" % indent) + saveString.append("%s </col_rule>\n" % indent) + saveString.append('%s</mixer>\n' % indent) saveString.append('%s<router>\n' % indent) - idt = indent + " " saveString.extend(self.router.saveSettings(idt)) saveString.append('%s</router>\n' % indent) return saveString def readSettings(self, readString): try: + idxb = readString.index('<mixer>') + idxe = readString.index('</mixer>') + except Exception: + log.debug("No mixer settings found") + idxb = -1 + idxe = -1 + if idxb >= 0: + if idxe > idxb + 1: + stringMixer = [] + for s in readString[idxb+1:idxe]: + stringMixer.append(s) + # When trying to import from a different device, the rule for column interpretation is + # not necessarily the same + try: + idx = stringMixer.index('<col_rule>') + except Exception: + log.debug('Do not know how to handle column versus input/output') + idx = -1 + transpose_coeff = False + if idx >=0: + if stringMixer[idx+1].find("Columns_are_outputs") == -1: + log.debug('Transposing the matrix coefficient; you are importing, are not you ?') + transpose_coeff = True + if self.mixer.readSettings(stringMixer, transpose_coeff): + log.debug("Mixer settings modified") + del stringMixer + try: idxb = readString.index('<router>') idxe = readString.index('</router>') except Exception: log.debug("No router settings found") idxb = -1 idxe = -1 - if idxb > 0: - if idxe > idxb: + if idxb >= 0: + if idxe > idxb + 1: stringRouter = [] - for s in readString[idxb:idxe]: + for s in readString[idxb+1:idxe]: stringRouter.append(s) if self.router.readSettings(stringRouter): log.debug("Router settings modified") Modified: trunk/libffado/support/mixer-qt4/ffado/mixer/globalmixer.py =================================================================== --- trunk/libffado/support/mixer-qt4/ffado/mixer/globalmixer.py 2014-01-29 17:21:17 UTC (rev 2472) +++ trunk/libffado/support/mixer-qt4/ffado/mixer/globalmixer.py 2014-01-29 17:30:10 UTC (rev 2473) @@ -1,5 +1,6 @@ # # Copyright (C) 2008 by Arnold Krille +# 2013 by Philippe Carriere # # This file is part of FFADO # FFADO = Free Firewire (pro-)audio drivers for linux Modified: trunk/libffado/support/mixer-qt4/ffado/panelmanager.py =================================================================== --- trunk/libffado/support/mixer-qt4/ffado/panelmanager.py 2014-01-29 17:21:17 UTC (rev 2472) +++ trunk/libffado/support/mixer-qt4/ffado/panelmanager.py 2014-01-29 17:30:10 UTC (rev 2473) @@ -1,6 +1,7 @@ # # Copyright (C) 2005-2008 by Pieter Palmers # 2007-2008 by Arnold Krille +# 2013 by Philippe Carriere # # This file is part of FFADO # FFADO = Free Firewire (pro-)audio drivers for linux @@ -485,6 +486,7 @@ except IOError: print "Unable to open file" return + log.debug("Opening file %s" % readfilename) # discard useless whitespace characters readString = [] for line in f: @@ -530,7 +532,7 @@ while nd > 0: idxb = readString.index('<device>') idxe = readString.index('</device>') - if idxe < idxb: + if idxe < idxb+1: print "Not a regular xml file: data must be enclosed between a <device> and </device> tag" return stringDev = [] @@ -543,7 +545,7 @@ print "Device guid not found" return guid = stringDev[idx+1] - log.debug("Device %s found\n" % guid) + log.debug("Device %s found" % guid) if guid in self.panels: w = self.panels[guid] Modified: trunk/libffado/support/mixer-qt4/ffado/widgets/crossbarrouter.py =================================================================== --- trunk/libffado/support/mixer-qt4/ffado/widgets/crossbarrouter.py 2014-01-29 17:21:17 UTC (rev 2472) +++ trunk/libffado/support/mixer-qt4/ffado/widgets/crossbarrouter.py 2014-01-29 17:30:10 UTC (rev 2473) @@ -1,5 +1,6 @@ # # Copyright (C) 2009 by Arnold Krille +# 2013 by Philippe Carriere # # This file is part of FFADO # FFADO = Free Firewire (pro-)audio drivers for linux @@ -123,9 +124,9 @@ self.settings = QtCore.QSettings(self) - destinations = self.interface.getDestinationNames() + self.destinations = self.interface.getDestinationNames() self.outgroups = [] - for ch in destinations: + for ch in self.destinations: tmp = str(ch).split(":")[0] if not tmp in self.outgroups: self.outgroups.append(tmp) @@ -145,7 +146,7 @@ self.biglayout.addLayout(self.layout) self.switchers = {} - for out in destinations: + for out in self.destinations: btn = OutputSwitcher(self.interface, out, self) self.layout.addWidget(btn, int(out.split(":")[-1]) + 1, self.outgroups.index(out.split(":")[0])) self.switchers[out] = btn @@ -183,28 +184,40 @@ self.emit(QtCore.SIGNAL("MixerRoutingChanged")) def saveSettings(self, indent): - destinations = self.interface.getDestinationNames() routerSaveString = [] - routerSaveString.append('%s<dimensions>\n' % indent) - routerSaveString.append('%s %d 2\n' % (indent, len(destinations))) - routerSaveString.append('%s</dimensions>\n' % indent) + routerSaveString.append('%s<dest_number>\n' % indent) + routerSaveString.append('%s %d\n' % (indent, len(self.destinations))) + routerSaveString.append('%s</dest_number>\n' % indent) + routerSaveString.append('%s<srcperdest>\n' % indent) + routerSaveString.append('%s 2\n' % indent) + routerSaveString.append('%s</srcperdest>\n' % indent) routerSaveString.append('%s<connections>\n' % indent) - for out in destinations: + for out in self.destinations: routerSaveString.append('%s ' % indent + out + ' ') routerSaveString.append(self.interface.getSourceForDestination(out) + '\n') routerSaveString.append('%s</connections>\n' % indent) return routerSaveString def readSettings(self, routerReadString): - try: - idx = routerReadString.index('<dimensions>') - except Exception: - log.debug("Router dimensions must be specified\n") + sources = str(self.interface.getSourceNames()) + if routerReadString[0].find('<dest_number>') == -1: + log.debug("Number of router destinations must be specified\n") return False - n_r = int(routerReadString[idx+1].split()[0]) - n_c = int(routerReadString[idx+1].split()[1]) - if n_c > 2: - print "Don't know how to handle more than one source for one destination" + if routerReadString[2].find('</dest_number>') == -1: + log.debug("Incompatible xml file\n") + return False + n_dest = int(routerReadString[1]) + if n_dest != len(self.destinations): + log.debug("Caution: numbers of destinations mismatch") + if routerReadString[3].find('<srcperdest>') == -1: + log.debug("Number of sources per destinations must be specified\n") + return False + if routerReadString[5].find('</srcperdest>') == -1: + log.debug("Incompatible xml file\n") + return False + n_spd = int(routerReadString[4]) + if n_spd != 2: + log.debug("Unable to handle more than one source for each destination;") try: idxb = routerReadString.index('<connections>') idxe = routerReadString.index('</connections>') @@ -213,14 +226,16 @@ idxb = -1 idxe = -1 return False - if idxb > 0: - if idxe > idxb: + if idxb >= 0: + if idxe > idxb + 1: for s in routerReadString[idxb+1:idxe]: destination = s.split()[0] - source = s.split()[1] - idx = self.switchers[destination].combo.findText(source) - self.switchers[destination].combo.setCurrentIndex(idx) - self.switchers[destination].comboCurrentChanged(source) + if str(self.destinations).find(destination) != -1: + source = s.split()[1] + if sources.find(source) != -1: + idx = self.switchers[destination].combo.findText(source) + self.switchers[destination].combo.setCurrentIndex(idx) + self.switchers[destination].comboCurrentChanged(source) return True # # vim: sw=4 ts=4 et Modified: trunk/libffado/support/mixer-qt4/ffado/widgets/matrixmixer.py =================================================================== --- trunk/libffado/support/mixer-qt4/ffado/widgets/matrixmixer.py 2014-01-29 17:21:17 UTC (rev 2472) +++ trunk/libffado/support/mixer-qt4/ffado/widgets/matrixmixer.py 2014-01-29 17:30:10 UTC (rev 2473) @@ -1,7 +1,7 @@ # coding=utf8 # # Copyright (C) 2009 by Arnold Krille -# Copyright (C) 2013 by Philippe Carriere +# 2013 by Philippe Carriere # # This file is part of FFADO # FFADO = Free Firewire (pro-)audio drivers for linux @@ -477,6 +477,157 @@ self.items[x][y].setValue(val) self.items[x][y].internalValueChanged(val) + def saveSettings(self, indent): + matrixSaveString = [] + matrixSaveString.append('%s <row_number>\n' % indent) + matrixSaveString.append('%s %d\n' % (indent, self.rows)) + matrixSaveString.append('%s </row_number>\n' % indent) + matrixSaveString.append('%s <col_number>\n' % indent) + matrixSaveString.append('%s %d\n' % (indent, self.cols)) + matrixSaveString.append('%s </col_number>\n' % indent) + matrixSaveString.append('%s <coefficients>\n' % indent) + for i in range(self.rows): + line = '%s ' % indent + for j in range(self.cols): + line += '%d ' % self.interface.getValue(i,j) + line += '\n' + matrixSaveString.append(line) + matrixSaveString.append('%s </coefficients>\n' % indent) + if (self.mutes_interface != None): + matrixSaveString.append('%s <mutes>\n' % indent) + for i in range(self.rows): + line = '%s ' % indent + for j in range(self.cols): + line += '%d ' % self.mutes_interface.getValue(i,j) + line += '\n' + matrixSaveString.append(line) + matrixSaveString.append('%s </mutes>\n' % indent) + + if (self.inverts_interface != None): + matrixSaveString.append('%s <inverts>\n' % indent) + for i in range(self.rows): + line = '%s ' % indent + for j in range(self.cols): + line += '%d ' % self.inverts_interface.getValue(i,j) + line += '\n' + matrixSaveString.append(line) + matrixSaveString.append('%s </inverts>\n' % indent) + + return matrixSaveString + + def readSettings(self, readMatrixString, transpose_coeff): + if readMatrixString[0].find("<row_number>") == -1: + log.debug("Number of matrix rows must be specified") + return False + if readMatrixString[2].find("</row_number>") == -1: + log.debug("Non-conformal xml file") + return False + n_rows = int(readMatrixString[1]) + + if readMatrixString[3].find("<col_number>") == -1: + log.debug("Number of matrix columns must be specified") + return False + if readMatrixString[5].find("</col_number>") == -1: + log.debug("Non-conformal xml file") + return False + n_cols = int(readMatrixString[4]) + + if transpose_coeff: + if n_rows > self.cols: + n_rows = self.cols + if n_cols > self.rows: + n_cols = self.rows + else: + if n_rows > self.rows: + n_rows = self.rows + if n_cols > self.cols: + n_cols = self.cols + log.debug("Setting %d rows and %d columns coefficients" % (n_rows, n_cols)) + + try: + idxb = readMatrixString.index('<coefficients>') + idxe = readMatrixString.index('</coefficients>') + except Exception: + log.debug("No mixer matrix coefficients specified") + idxb = -1 + idxe = -1 + if idxb >= 0: + if idxe < idxb + n_rows + 1: + log.debug("Incoherent number of rows in coefficients") + return False + i = 0 + for s in readMatrixString[idxb+1:idxb + n_rows + 1]: + coeffs = s.split() + if len(coeffs) < n_cols: + log.debug("Incoherent number of columns in coefficients") + return False + j = 0 + for c in coeffs[0:n_cols]: + if transpose_coeff: + self.interface.setValue(j, i, int(c)) + else: + self.interface.setValue(i, j, int(c)) + j += 1 + i += 1 + del coeffs + + try: + idxb = readMatrixString.index('<mutes>') + idxe = readMatrixString.index('</mutes>') + except Exception: + log.debug("No mixer mute coefficients specified") + idxb = -1 + idxe = -1 + if idxb >= 0: + if idxe < idxb + n_rows + 1: + log.debug("Incoherent number of rows in mute") + return false + i = 0 + for s in readMatrixString[idxb+1:idxb + n_rows + 1]: + coeffs = s.split() + if len(coeffs) < n_cols: + log.debug("Incoherent number of columns in mute") + return false + j = 0 + for c in coeffs[0:n_cols]: + if transpose_coeff: + self.mutes_interface.setValue(j, i, int(c)) + else: + self.mutes_interface.setValue(i, j, int(c)) + j += 1 + i += 1 + del coeffs + + try: + idxb = readMatrixString.index('<inverts>') + idxe = readMatrixString.index('</inverts>') + except Exception: + log.debug("No mixer inverts coefficients specified") + idxb = -1 + idxe = -1 + if idxb >= 0: + if idxe < idxb + n_rows + 1: + log.debug("Incoherent number of rows in inverts") + return false + i = 0 + for s in readMatrixString[idxb+1:idxb + n_rows + 1]: + coeffs = s.split() + if len(coeffs) < n_cols: + log.debug("Incoherent number of columns in inverts") + return false + j = 0 + for c in coeffs[0:n_cols]: + if transpose_coeff: + self.inverts_interface.setValue(j, i, int(c)) + else: + self.inverts_interface.setValue(i, j, int(c)) + j += 1 + i += 1 + del coeffs + + self.refreshValues() + return True + class VolumeSlider(QtGui.QSlider): def __init__(self, In, Out, value, parent): QtGui.QSlider.__init__(self, QtCore.Qt.Vertical, parent) @@ -857,6 +1008,88 @@ self.out[i].volume[n_in].sliderSetValue(v) self.out[i].svl[n_in].sliderSetValue(v) + def saveSettings(self, indent): + rows = self.interface.getRowCount() + cols = self.interface.getColCount() + matrixSaveString = [] + matrixSaveString.append('%s <row_number>\n' % indent) + matrixSaveString.append('%s %d\n' % (indent, rows)) + matrixSaveString.append('%s </row_number>\n' % indent) + matrixSaveString.append('%s <col_number>\n' % indent) + matrixSaveString.append('%s %d\n' % (indent, cols)) + matrixSaveString.append('%s </col_number>\n' % indent) + matrixSaveString.append('%s <coefficients>\n' % indent) + for i in range(rows): + line = '%s ' % indent + for j in range(cols): + line += '%d ' % self.interface.getValue(i,j) + line += '\n' + matrixSaveString.append(line) + matrixSaveString.append('%s </coefficients>\n' % indent) + + return matrixSaveString + + def readSettings(self, readMatrixString, transpose_coeff): + rows = self.interface.getRowCount() + cols = self.interface.getColCount() + if readMatrixString[0].find("<row_number>") == -1: + log.debug("Number of matrix rows must be specified") + return False + if readMatrixString[2].find("</row_number>") == -1: + log.debug("Non-conformal xml file") + return False + n_rows = int(readMatrixString[1]) + + if readMatrixString[3].find("<col_number>") == -1: + log.debug("Number of matrix columns must be specified") + return False + if readMatrixString[5].find("</col_number>") == -1: + log.debug("Non-conformal xml file") + return False + n_cols = int(readMatrixString[4]) + + if transpose_coeff: + if n_rows > cols: + n_rows = cols + if n_cols > rows: + n_cols = rows + else: + if n_rows > rows: + n_rows = rows + if n_cols > cols: + n_cols = cols + log.debug("Setting %d rows and %d columns coefficients" % (n_rows, n_cols)) + + try: + idxb = readMatrixString.index('<coefficients>') + idxe = readMatrixString.index('</coefficients>') + except Exception: + log.debug("No mixer matrix coefficients specified") + idxb = -1 + idxe = -1 + if idxb >= 0: + if idxe < idxb + n_rows + 1: + log.debug("Incoherent number of rows in coefficients") + return False + i = 0 + for s in readMatrixString[idxb+1:idxb + n_rows + 1]: + coeffs = s.split() + if len(coeffs) < n_cols: + log.debug("Incoherent number of columns in coefficients") + return False + j = 0 + for c in coeffs[0:n_cols]: + if transpose_coeff: + self.interface.setValue(j, i, int(c)) + else: + self.interface.setValue(i, j, int(c)) + j += 1 + i += 1 + del coeffs + + self.refreshValues() + return True + from functools import partial class MatrixMixer(QtGui.QWidget): @@ -1152,5 +1385,65 @@ self.matrix.updateRouting() self.perOut.updateRouting() + def saveSettings(self, indent): + mixerString = [] + mixerString.append("%s<matrices>\n" % indent) + mixerString.extend(self.matrix.saveSettings(indent)) + mixerString.append("%s</matrices>\n" % indent) + mixerString.append("%s<stereo_outputs>\n" % indent) + mixerString.append("%s <number>\n" % indent) + n = len(self.stereo_channels) + mixerString.append("%s %d\n" % (indent, n)) + mixerString.append("%s </number>\n" % indent) + if n > 0: + mixerString.append("%s <channels>\n" % indent) + for i in self.stereo_channels: + mixerString.append("%s %d %d\n" % (indent, i+1, i+2)) + mixerString.append("%s </channels>\n" % indent) + mixerString.append("%s</stereo_outputs>\n" % indent) + return mixerString + + def readSettings(self, readMixerString, transpose_coeff): + try: + idxb = readMixerString.index('<matrices>') + idxe = readMixerString.index('</matrices>') + except Exception: + log.debug("No matrices found") + idxb = -1 + idxe = -1 + if idxb >= 0: + if idxe > idxb+1: + readString = [] + for s in readMixerString[idxb+1:idxe]: + readString.append(s) + if self.matrix.readSettings(readString, transpose_coeff): + log.debug("Mixer matrices settings modified") + del readString + try: + idx = readMixerString.index('<stereo_outputs>') + except Exception: + log.debug("No stereo outputs channels information found") + idx = -1 + if idx >= 0: + if readMixerString[idx+1].find('<number>') == -1: + log.debug("Number of stereo output channels must be specified") + return False + n = int(readMixerString[idx+2]) + if n > self.perOut.nbOut/2: + log.debug("Incoherent number of stereo channels") + return False + if n > 0: + if readMixerString[idx+3].find('</number>') == -1: + log.debug("No </number> tag found") + return False + if readMixerString[idx+4].find('<channels>') == -1: + log.debug("No <channels> tag found") + return False + for s in readMixerString[idx+5:idx+5+n]: + i = (int(s.split()[0]) - 1)/2 + self.stereo_switch[i].setChecked(True); + self.switchStereoChannel(i, True) + return True + # # vim: et ts=4 sw=4 fileencoding=utf8 |