Changeset 1796
- Timestamp:
- 02/02/10 14:31:11 (11 years ago)
- Files:
-
- trunk/libffado/support/mixer-qt4/ffado/mixer/generic_dice_eap.py (copied) (copied from trunk/libffado/support/mixer-qt4/ffado/mixer/saffire_dice.py) (3 diffs)
- trunk/libffado/support/mixer-qt4/ffado/mixer/saffire_dice.py (modified) (5 diffs)
- trunk/libffado/support/mixer-qt4/ffado/mixer/saffire_dice_monitoring.ui (modified) (5 diffs)
- trunk/libffado/support/mixer-qt4/ffado/widgets/crossbarrouter.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/libffado/support/mixer-qt4/ffado/mixer/generic_dice_eap.py
r1794 r1796 1 1 # 2 # Copyright (C) 2009 by Arnold Krille2 # Copyright (C) 2009-2010 by Arnold Krille 3 3 # 4 4 # This file is part of FFADO … … 27 27 from ffado.config import * 28 28 29 class BooleanControl: 30 def __init__(self, hw, path): 31 self.iface = dbus.Interface( 32 hw.bus.get_object(hw.servername, path), 33 dbus_interface="org.ffado.Control.Element.Boolean") 34 self.value = self.iface.selected() 35 36 def selected(self): 37 return self.value 38 39 def select(self, n): 40 if self.iface.select(n): 41 self.value = n 42 return True 43 return False 44 45 class DiscreteControl: 46 def __init__(self, hw, path): 47 self.iface = dbus.Interface( 48 hw.bus.get_object(hw.servername, path), 49 dbus_interface="org.ffado.Control.Element.Discrete") 50 self.value = self.iface.getValue() 51 52 def getvalue(self): 53 return self.value 54 55 def setvalue(self, v): 56 if v != self.value: 57 self.iface.setValue(v) 58 self.value = v 59 60 class MonitoringModel(QtCore.QAbstractTableModel): 61 def __init__(self, hw, parent): 62 QtCore.QAbstractTableModel.__init__(self, parent) 63 64 self.hw = hw 65 66 self.mutestates = ("Global", "True", "False") 67 68 self.globaldims = [] 69 self.globalmutes = [] 70 self.perchannelmutes = [] 71 self.globalvolumes = [] 72 self.perchannelvolumes = [] 73 for i in range(10): 74 self.globaldims.append(BooleanControl(self.hw, self.hw.basepath + ("/EAP/Monitoring/GlobalDim/AffectsCh%i" % i))) 75 self.globalmutes.append(BooleanControl(self.hw, self.hw.basepath + ("/EAP/Monitoring/GlobalMute/AffectsCh%i" % i))) 76 self.perchannelmutes.append(BooleanControl(self.hw, self.hw.basepath + ("/EAP/Monitoring/PerChannel/Mute%i" % i))) 77 self.globalvolumes.append(BooleanControl(self.hw, self.hw.basepath + ("/EAP/Monitoring/GlobalVolume/AffectsCh%i" % i))) 78 self.perchannelvolumes.append(DiscreteControl(self.hw, self.hw.basepath + ("/EAP/Monitoring/PerChannel/Volume%i" % i))) 79 80 def rowCount(self, parent): 81 return 3 82 83 def columnCount(self, parent): 84 return 10 85 86 def headerData(self, section, orientation, role=Qt.Qt.DisplayRole): 87 if role != Qt.Qt.DisplayRole: 88 #print "headerData will return nothing" 89 return None 90 #print "headerData() Will return a label" 91 if orientation == Qt.Qt.Horizontal: 92 return "Ch. %i" % section 93 if orientation == Qt.Qt.Vertical: 94 return ("Mute", "Dim", "Volume")[section] 95 return None 96 97 def data(self, index, role): 98 if not role in (Qt.Qt.DisplayRole, Qt.Qt.EditRole): 99 return None 100 row = index.row() 101 col = index.column() 102 if role == Qt.Qt.DisplayRole: 103 if row is 0: 104 if self.perchannelmutes[col].selected(): 105 return self.mutestates[1] 106 else: 107 if self.globalmutes[col].selected(): 108 return self.mutestates[0] 109 return self.mutestates[2] 110 if row is 1: 111 if self.globaldims[col].selected(): 112 return "Enabled" 113 else: 114 return "Disabled" 115 if row is 2: 116 if self.globalvolumes[col].selected(): 117 return "Global" 118 else: 119 return self.perchannelvolumes[col].getvalue() 120 if role == Qt.Qt.EditRole: 121 if row is 0: 122 return QtCore.QStringList(self.mutestates) 123 if row is 1: 124 return QtCore.QStringList(("Enabled","Disabled")) 125 if row is 2: 126 if self.globalvolumes[col].selected(): 127 return 1 128 return self.perchannelvolumes[col].getvalue() 129 return "%i,%i" % (row,col) 130 131 def setData(self, index, value, role=Qt.Qt.EditRole): 132 col = index.column() 133 row = index.row() 134 if row == 0: 135 if value == "Global": 136 self.globalmutes[col].select(True) 137 self.perchannelmutes[col].select(False) 138 else: 139 self.globalmutes[col].select(False) 140 if value == "True": value = True 141 if value == "False": value = False 142 self.perchannelmutes[col].select(value) 143 return True 144 if row == 1: 145 if value == "Enabled": value = True 146 if value == "Disabled": value = False 147 return self.globaldims[col].select(value) 148 if row == 2: 149 #print "setData() value=%s" % value.toString() 150 v = int(value.toString()) 151 #print " integer is %i" % v 152 if v > 0: 153 return self.globalvolumes[col].select(True) 154 else: 155 self.globalvolumes[col].select(False) 156 self.perchannelvolumes[col].setvalue(v) 157 return False 158 159 def flags(self, index): 160 ret = QtCore.QAbstractTableModel.flags(self, index) 161 if index.row() in (0,1,2): 162 ret |= Qt.Qt.ItemIsEditable 163 return ret 164 165 166 167 class MonitoringDelegate(QtGui.QStyledItemDelegate): 168 def __init__(self, parent): 169 QtGui.QStyledItemDelegate.__init__(self, parent) 170 171 def createEditor(self, parent, option, index): 172 if index.data(Qt.Qt.EditRole).type() == QtCore.QVariant.StringList: 173 combo = QtGui.QComboBox(parent) 174 self.connect(combo, QtCore.SIGNAL("activated(int)"), self.currentChanged) 175 return combo 176 else: 177 return QtGui.QStyledItemDelegate.createEditor(self, parent, option, index) 178 179 def setEditorData(self, editor, index): 180 if isinstance(editor, QtGui.QComboBox): 181 list = index.data(Qt.Qt.EditRole).toStringList() 182 editor.addItems(list) 183 editor.setCurrentIndex(list.indexOf(index.data(Qt.Qt.DisplayRole).toString())) 184 else: 185 QtGui.QStyledItemDelegate.setEditorData(self, editor, index) 186 187 def setModelData(self, editor, model, index): 188 if isinstance(editor, QtGui.QComboBox): 189 model.setData(index, editor.currentText(), Qt.Qt.EditRole) 190 else: 191 QtGui.QStyledItemDelegate.setModelData(self, editor, model, index) 192 193 def currentChanged(self): 194 #print "currentChanged() sender=%s" % (str(self.sender())) 195 editor = self.sender() 196 self.emit(QtCore.SIGNAL("commitData(QWidget*)"), editor) 197 self.emit(QtCore.SIGNAL("closeEditor(QWidget*)"), editor) 198 199 class Saffire_Dice(QtGui.QWidget): 29 class Generic_Dice_EAP(QtGui.QWidget): 200 30 def __init__(self, parent=None): 201 31 QtGui.QWidget.__init__(self, parent) … … 220 50 self.tabs.addTab(scrollarea, "Routing") 221 51 222 model = MonitoringModel(self.hw, self)223 52 224 widget = QtGui.QWidget() 225 uicLoad("ffado/mixer/saffire_dice_monitoring.ui", widget) 226 widget.monitoringView.setModel(model) 227 widget.monitoringView.setItemDelegate(MonitoringDelegate(self)) 228 self.tabs.addTab(widget, "Monitoring") 229 230 self.muteInterface = BooleanControl(self.hw, self.hw.basepath+"/EAP/Monitoring/GlobalMute/State") 231 widget.btnMute.setChecked(self.muteInterface.selected()) 232 self.connect(widget.btnMute, QtCore.SIGNAL("toggled(bool)"), self.muteToggle) 233 self.dimInterface = BooleanControl(self.hw, self.hw.basepath+"/EAP/Monitoring/GlobalDim/State") 234 widget.btnDim.setChecked(self.dimInterface.selected()) 235 self.connect(widget.btnDim, QtCore.SIGNAL("toggled(bool)"), self.dimToggle) 236 237 self.dimLevelInterface = DiscreteControl(self.hw, self.hw.basepath+"/EAP/Monitoring/GlobalDim/Level") 238 widget.dimLevel.setValue(self.dimLevelInterface.getvalue()) 239 self.connect(widget.dimLevel, QtCore.SIGNAL("valueChanged(int)"), self.dimLevelChanged) 240 self.volumeInterface = DiscreteControl(self.hw, self.hw.basepath+"/EAP/Monitoring/GlobalVolume/Level") 241 widget.volumeKnob.setValue(self.volumeInterface.getvalue()) 242 self.connect(widget.volumeKnob, QtCore.SIGNAL("valueChanged(int)"), self.volumeChanged) 243 244 if self.configrom.getModelName() == "SAFFIRE_PRO_24": 245 self.ch1inst = BooleanControl(self.hw, self.hw.basepath + "/EAP/Ch1LineInst") 246 widget.chkInst1.setChecked(self.ch1inst.selected()) 247 self.connect(widget.chkInst1, QtCore.SIGNAL("toggled(bool)"), self.ch1inst.select) 248 self.ch2inst = BooleanControl(self.hw, self.hw.basepath + "/EAP/Ch2LineInst") 249 widget.chkInst2.setChecked(self.ch2inst.selected()) 250 self.connect(widget.chkInst2, QtCore.SIGNAL("toggled(bool)"), self.ch2inst.select) 251 self.ch3level = BooleanControl(self.hw, self.hw.basepath + "/EAP/Ch3Level") 252 widget.chkLevel3.setChecked(self.ch3level.selected()) 253 self.connect(widget.chkLevel3, QtCore.SIGNAL("toggled(bool)"), self.ch3level.select) 254 self.ch4level = BooleanControl(self.hw, self.hw.basepath + "/EAP/Ch4Level") 255 widget.chkLevel4.setChecked(self.ch4level.selected()) 256 self.connect(widget.chkLevel4, QtCore.SIGNAL("toggled(bool)"), self.ch4level.select) 257 widget.chkSpdif.deleteLater() 258 widget.btnPad.deleteLater() 259 else: 260 widget.chkInst1.deleteLater() 261 widget.chkInst2.deleteLater() 262 widget.chkLevel3.deleteLater() 263 widget.chkLevel4.deleteLater() 264 265 266 def muteToggle(self, mute): 267 self.muteInterface.select(mute) 268 def dimToggle(self, mute): 269 self.dimInterface.select(mute) 270 271 def dimLevelChanged(self, value): 272 self.dimLevelInterface.setvalue(value) 273 def volumeChanged(self, value): 274 self.volumeInterface.setvalue(value) 275 276 def getDisplayTitle(self): 277 return "Saffire PRO40/PRO24 Mixer" 53 #def getDisplayTitle(self): 54 # return "Saffire PRO40/PRO24 Mixer" 278 55 279 56 # trunk/libffado/support/mixer-qt4/ffado/mixer/saffire_dice.py
r1794 r1796 1 1 # 2 # Copyright (C) 2009 by Arnold Krille2 # Copyright (C) 2009-2010 by Arnold Krille 3 3 # 4 4 # This file is part of FFADO … … 24 24 from ffado.widgets.matrixmixer import MatrixMixer 25 25 from ffado.widgets.crossbarrouter import * 26 from ffado.mixer.generic_dice_eap import * 26 27 27 28 from ffado.config import * … … 197 198 self.emit(QtCore.SIGNAL("closeEditor(QWidget*)"), editor) 198 199 199 class Saffire_Dice( QtGui.QWidget):200 class Saffire_Dice(Generic_Dice_EAP): 200 201 def __init__(self, parent=None): 201 QtGui.QWidget.__init__(self, parent) 202 self.layout = QtGui.QGridLayout(self) 203 self.setLayout(self.layout) 204 self.tabs = QtGui.QTabWidget(self) 205 self.layout.addWidget(self.tabs) 202 Generic_Dice_EAP.__init__(self, parent) 206 203 207 204 def buildMixer(self): 208 205 #print self.hw 209 206 #print self.hw.getText("/Generic/Nickname") 210 self.matrix = MatrixMixer(self.hw.servername, self.hw.basepath+"/EAP/MatrixMixer", self) 211 scrollarea = QtGui.QScrollArea(self.tabs) 212 scrollarea.setWidgetResizable(True) 213 scrollarea.setWidget(self.matrix) 214 self.tabs.addTab(scrollarea, "Matrix") 215 216 self.router = CrossbarRouter(self.hw.servername, self.hw.basepath+"/EAP/Router", self) 217 scrollarea = QtGui.QScrollArea(self.tabs) 218 scrollarea.setWidgetResizable(True) 219 scrollarea.setWidget(self.router) 220 self.tabs.addTab(scrollarea, "Routing") 207 Generic_Dice_EAP.buildMixer(self) 221 208 222 209 model = MonitoringModel(self.hw, self) … … 243 230 244 231 if self.configrom.getModelName() == "SAFFIRE_PRO_24": 232 widget.stacked.setCurrentWidget(widget.pagePro24) 245 233 self.ch1inst = BooleanControl(self.hw, self.hw.basepath + "/EAP/Ch1LineInst") 246 234 widget.chkInst1.setChecked(self.ch1inst.selected()) … … 255 243 widget.chkLevel4.setChecked(self.ch4level.selected()) 256 244 self.connect(widget.chkLevel4, QtCore.SIGNAL("toggled(bool)"), self.ch4level.select) 257 widget.chkSpdif.deleteLater() 258 widget.btnPad.deleteLater() 259 else: 260 widget.chkInst1.deleteLater() 261 widget.chkInst2.deleteLater() 262 widget.chkLevel3.deleteLater() 263 widget.chkLevel4.deleteLater() 245 #widget.chkSpdif.deleteLater() 246 #widget.btnPad.deleteLater() 247 elif self.configrom.getModelName() == "SAFFIRE_PRO_40": 248 widget.stacked.setCurrentWidget(widget.pagePro40) 249 #widget.chkInst1.deleteLater() 250 #widget.chkInst2.deleteLater() 251 #widget.chkLevel3.deleteLater() 252 #widget.chkLevel4.deleteLater() 253 else: 254 self.stacked.deleteLater() 264 255 265 256 trunk/libffado/support/mixer-qt4/ffado/mixer/saffire_dice_monitoring.ui
r1794 r1796 8 8 <y>0</y> 9 9 <width>599</width> 10 <height> 657</height>10 <height>406</height> 11 11 </rect> 12 12 </property> … … 28 28 </property> 29 29 </widget> 30 <widget class="QWidget" name=" layoutWidget">30 <widget class="QWidget" name=""> 31 31 <layout class="QGridLayout" name="gridLayout"> 32 <item row="3" column="0"> 33 <widget class="QLabel" name="label"> 34 <property name="text"> 35 <string>Dim Level:</string> 36 </property> 37 <property name="alignment"> 38 <set>Qt::AlignCenter</set> 39 </property> 40 <property name="buddy"> 41 <cstring>dimLevel</cstring> 42 </property> 43 </widget> 44 </item> 45 <item row="3" column="1"> 46 <widget class="QSpinBox" name="dimLevel"> 47 <property name="sizePolicy"> 48 <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> 49 <horstretch>0</horstretch> 50 <verstretch>0</verstretch> 51 </sizepolicy> 52 </property> 53 <property name="alignment"> 54 <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> 55 </property> 56 <property name="suffix"> 57 <string> dB</string> 58 </property> 59 <property name="minimum"> 60 <number>-127</number> 61 </property> 62 <property name="maximum"> 32 <item row="0" column="0" rowspan="2" colspan="2"> 33 <widget class="QStackedWidget" name="stacked"> 34 <property name="currentIndex"> 63 35 <number>0</number> 64 36 </property> 65 </widget> 66 </item> 67 <item row="0" column="2" rowspan="6"> 37 <widget class="QWidget" name="pagePro24"> 38 <layout class="QGridLayout" name="gridLayout_3"> 39 <item row="0" column="0"> 40 <widget class="QCheckBox" name="chkInst1"> 41 <property name="sizePolicy"> 42 <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> 43 <horstretch>0</horstretch> 44 <verstretch>0</verstretch> 45 </sizepolicy> 46 </property> 47 <property name="text"> 48 <string>Ch 1 Instrument</string> 49 </property> 50 </widget> 51 </item> 52 <item row="1" column="1"> 53 <widget class="QCheckBox" name="chkLevel4"> 54 <property name="sizePolicy"> 55 <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> 56 <horstretch>0</horstretch> 57 <verstretch>0</verstretch> 58 </sizepolicy> 59 </property> 60 <property name="text"> 61 <string>Ch 4 High Level</string> 62 </property> 63 </widget> 64 </item> 65 <item row="1" column="0"> 66 <widget class="QCheckBox" name="chkInst2"> 67 <property name="sizePolicy"> 68 <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> 69 <horstretch>0</horstretch> 70 <verstretch>0</verstretch> 71 </sizepolicy> 72 </property> 73 <property name="text"> 74 <string>Ch 2 Instrument</string> 75 </property> 76 </widget> 77 </item> 78 <item row="0" column="1"> 79 <widget class="QCheckBox" name="chkLevel3"> 80 <property name="sizePolicy"> 81 <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> 82 <horstretch>0</horstretch> 83 <verstretch>0</verstretch> 84 </sizepolicy> 85 </property> 86 <property name="text"> 87 <string>Ch 3 High Level</string> 88 </property> 89 </widget> 90 </item> 91 </layout> 92 </widget> 93 <widget class="QWidget" name="pagePro40"> 94 <layout class="QHBoxLayout" name="horizontalLayout"> 95 <item> 96 <widget class="QCheckBox" name="chkSpdif"> 97 <property name="sizePolicy"> 98 <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> 99 <horstretch>0</horstretch> 100 <verstretch>0</verstretch> 101 </sizepolicy> 102 </property> 103 <property name="text"> 104 <string>Use ADAT-Out as S/PDIF</string> 105 </property> 106 </widget> 107 </item> 108 <item> 109 <widget class="QPushButton" name="btnPad"> 110 <property name="sizePolicy"> 111 <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> 112 <horstretch>0</horstretch> 113 <verstretch>0</verstretch> 114 </sizepolicy> 115 </property> 116 <property name="text"> 117 <string>Pad Output</string> 118 </property> 119 </widget> 120 </item> 121 </layout> 122 </widget> 123 </widget> 124 </item> 125 <item row="0" column="2" rowspan="5"> 68 126 <widget class="QGroupBox" name="groupBox"> 69 127 <property name="sizePolicy"> … … 118 176 </widget> 119 177 </item> 120 <item row="4" column="0" colspan="2"> 178 <item row="2" column="0"> 179 <widget class="QLabel" name="label"> 180 <property name="text"> 181 <string>Dim Level:</string> 182 </property> 183 <property name="alignment"> 184 <set>Qt::AlignCenter</set> 185 </property> 186 <property name="buddy"> 187 <cstring>dimLevel</cstring> 188 </property> 189 </widget> 190 </item> 191 <item row="2" column="1"> 192 <widget class="QSpinBox" name="dimLevel"> 193 <property name="sizePolicy"> 194 <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> 195 <horstretch>0</horstretch> 196 <verstretch>0</verstretch> 197 </sizepolicy> 198 </property> 199 <property name="alignment"> 200 <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> 201 </property> 202 <property name="suffix"> 203 <string> dB</string> 204 </property> 205 <property name="minimum"> 206 <number>-127</number> 207 </property> 208 <property name="maximum"> 209 <number>0</number> 210 </property> 211 </widget> 212 </item> 213 <item row="3" column="0" colspan="2"> 121 214 <widget class="QPushButton" name="btnDim"> 122 215 <property name="sizePolicy"> … … 140 233 </widget> 141 234 </item> 142 <item row=" 5" column="0" colspan="2">235 <item row="4" column="0" colspan="2"> 143 236 <widget class="QPushButton" name="btnMute"> 144 237 <property name="sizePolicy"> … … 159 252 <property name="checkable"> 160 253 <bool>true</bool> 161 </property>162 </widget>163 </item>164 <item row="0" column="0">165 <widget class="QCheckBox" name="chkInst1">166 <property name="sizePolicy">167 <sizepolicy hsizetype="Minimum" vsizetype="Minimum">168 <horstretch>0</horstretch>169 <verstretch>0</verstretch>170 </sizepolicy>171 </property>172 <property name="text">173 <string>Ch 1 Instrument</string>174 </property>175 </widget>176 </item>177 <item row="0" column="1">178 <widget class="QCheckBox" name="chkLevel3">179 <property name="sizePolicy">180 <sizepolicy hsizetype="Minimum" vsizetype="Minimum">181 <horstretch>0</horstretch>182 <verstretch>0</verstretch>183 </sizepolicy>184 </property>185 <property name="text">186 <string>Ch 3 High Level</string>187 </property>188 </widget>189 </item>190 <item row="1" column="0">191 <widget class="QCheckBox" name="chkInst2">192 <property name="sizePolicy">193 <sizepolicy hsizetype="Minimum" vsizetype="Minimum">194 <horstretch>0</horstretch>195 <verstretch>0</verstretch>196 </sizepolicy>197 </property>198 <property name="text">199 <string>Ch 2 Instrument</string>200 </property>201 </widget>202 </item>203 <item row="1" column="1">204 <widget class="QCheckBox" name="chkLevel4">205 <property name="sizePolicy">206 <sizepolicy hsizetype="Minimum" vsizetype="Minimum">207 <horstretch>0</horstretch>208 <verstretch>0</verstretch>209 </sizepolicy>210 </property>211 <property name="text">212 <string>Ch 4 High Level</string>213 </property>214 </widget>215 </item>216 <item row="2" column="0">217 <widget class="QCheckBox" name="chkSpdif">218 <property name="sizePolicy">219 <sizepolicy hsizetype="Minimum" vsizetype="Minimum">220 <horstretch>0</horstretch>221 <verstretch>0</verstretch>222 </sizepolicy>223 </property>224 <property name="text">225 <string>Use ADAT-Out as S/PDIF</string>226 </property>227 </widget>228 </item>229 <item row="2" column="1">230 <widget class="QPushButton" name="btnPad">231 <property name="sizePolicy">232 <sizepolicy hsizetype="Minimum" vsizetype="Minimum">233 <horstretch>0</horstretch>234 <verstretch>0</verstretch>235 </sizepolicy>236 </property>237 <property name="text">238 <string>Pad Output</string>239 254 </property> 240 255 </widget> trunk/libffado/support/mixer-qt4/ffado/widgets/crossbarrouter.py
r1780 r1796 71 71 72 72 self.lbl = QtGui.QLabel(self.outname, self) 73 self.lbl.setToolTip("The name of the destination that is to be controlled here.") 73 74 self.layout.addWidget(self.lbl, 0, 0) 74 75 … … 79 80 80 81 self.combo = QtGui.QComboBox(self) 82 self.combo.setToolTip("<qt>Select the source for this destination.<br>Each destination can only receive sound from one source at a time. But one source can send sound to multiple destinations.</qt>") 81 83 self.layout.addWidget(self.combo, 1, 0, 1, 2) 82 84 self.combo.addItem("Disconnected")