root/trunk/libffado/support/mixer-qt4/ffado/mixer/audiofire.py

Revision 2803, 17.5 kB (checked in by jwoithe, 3 years ago)

Cosmetic: capitalise "L" in "Linux".

"Linux" is a proper noun so it should start with a capital letter. These
changes are almost all within comments.

This patch was originally proposed by pander on the ffado-devel mailing
list. It has been expanded to cover all similar cases to maintain
consistency throughout the source tree.

  • Property svn:mergeinfo set to
Line 
1 #
2 # Copyright (C) 2005-2008 by Pieter Palmers
3 #
4 # This file is part of FFADO
5 # FFADO = Free FireWire (pro-)audio drivers for Linux
6 #
7 # FFADO is based upon FreeBoB.
8 #
9 # This program is free software: you can redistribute it and/or modify
10 # it under the terms of the GNU General Public License as published by
11 # the Free Software Foundation, either version 2 of the License, or
12 # (at your option) version 3 of the License.
13 #
14 # This program is distributed in the hope that it will be useful,
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 # GNU General Public License for more details.
18 #
19 # You should have received a copy of the GNU General Public License
20 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
21 #
22
23 # from PyQt4.QtCore import Qt, QTimer
24 # from PyQt4.QtGui import QWidget, QHBoxLayout, QVBoxLayout
25 # from PyQt4.QtGui import QGroupBox, QTabWidget, QLabel
26 # from PyQt4.QtGui import QPushButton, QToolButton, QSpacerItem, QSizePolicy
27 from ffado.import_pyqt import *
28
29 from ffado.config import *
30 import logging
31 log = logging.getLogger('audiofire')
32
33 class AfMonitorWidget(QWidget):
34     def __init__(self,parent = None):
35         QWidget.__init__(self,parent)
36         uicLoad("ffado/mixer/audiofire_strip", self)
37
38 class AfSettingsWidget(QWidget):
39     def __init__(self,parent = None):
40         QWidget.__init__(self,parent)
41         uicLoad("ffado/mixer/audiofire_settings", self)
42
43 class AudioFire(QWidget):
44     def __init__(self,parent = None):
45         QWidget.__init__(self,parent)
46         log.debug("Init AudioFire mixer window")
47
48     def getDisplayTitle(self):
49         modelId = self.configrom.getModelId()
50         if modelId == 0x0AF2:
51             return "AudioFire2"
52         if modelId == 0x0AF4:
53             return "AudioFire4"
54         if modelId == 0x0AF8:
55             return "AudioFire8"
56         if modelId == 0x0AF9:
57             return "AudioFirePre8"
58         if modelId == 0x0AF12:
59             return "AudioFire12"
60         return "Generic FireWorks"
61
62     def updateMatrixButton(self,a0):
63         sender = self.sender()
64         if a0:
65             state = 1
66         else:
67             state = 0
68         log.debug("set %s %d %d to %d" % (
69                     self.MatrixButtonControls[sender][0],
70                     self.MatrixButtonControls[sender][1],
71                     self.MatrixButtonControls[sender][2],
72                     state))
73         self.hw.setMatrixMixerValue(self.MatrixButtonControls[sender][0],
74                                     self.MatrixButtonControls[sender][1],
75                                     self.MatrixButtonControls[sender][2],
76                                     state)
77
78     def updateMatrixRotary(self,a0):
79         sender = self.sender()
80         vol = a0
81         log.debug("set %s %d %d to %d" % (
82                     self.MatrixRotaryControls[sender][0],
83                     self.MatrixRotaryControls[sender][1],
84                     self.MatrixRotaryControls[sender][2],
85                     vol))
86         self.hw.setMatrixMixerValue(self.MatrixRotaryControls[sender][0],
87                                     self.MatrixRotaryControls[sender][1],
88                                     self.MatrixRotaryControls[sender][2],
89                                     vol)
90
91     def updateMatrixVolume(self,a0):
92         sender = self.sender()
93         vol = a0
94         #vol = 0x01000000-vol
95         log.debug("set %s %d %d to %d" % (
96                     self.MatrixVolumeControls[sender][0],
97                     self.MatrixVolumeControls[sender][1],
98                     self.MatrixVolumeControls[sender][2],
99                     vol))
100         self.hw.setMatrixMixerValue(self.MatrixVolumeControls[sender][0],
101                                     self.MatrixVolumeControls[sender][1],
102                                     self.MatrixVolumeControls[sender][2],
103                                     vol)
104
105     def updateVolume(self,a0):
106         sender = self.sender()
107         vol = a0
108         #vol = 0x01000000-vol
109         log.debug("set %s to %d" % (
110                     self.VolumeControls[sender][0],
111                     vol))
112         self.hw.setContignuous(self.VolumeControls[sender][0],
113                               vol)
114
115     def updateSelector(self,a0):
116         sender = self.sender()
117         if a0:
118             state = 1
119         else:
120             state = 0
121         log.debug("set %s to %d" % (
122                     self.SelectorControls[sender][0],
123                     state))
124         self.hw.setDiscrete(self.SelectorControls[sender][0], state)
125
126     def updateTrigger(self):
127         sender = self.sender()
128         log.debug("trigger %s" % (self.TriggerControls[sender][0]))
129         self.hw.setDiscrete(self.TriggerControls[sender][0], 1)
130
131     def updateSPDIFmodeControl(self,a0):
132         sender = self.sender()
133         if a0:
134             state = 1
135         else:
136             state = 0
137         if state:
138             log.debug("set %s to %d" % (
139                         self.SPDIFmodeControls[sender][0],
140                         self.SPDIFmodeControls[sender][1]))
141             self.hw.setDiscrete(self.SPDIFmodeControls[sender][0], self.SPDIFmodeControls[sender][1])
142
143     def updateDigIfaceControl(self, a0):
144         sender = self.sender()
145         state = a0
146         # 0/2/3 is available but GUI set 0/1/2
147         if a0 > 0:
148             state += 1
149         log.debug("set %s to %d" % (
150             self.DigIfaceControls[sender][0], state))
151         self.hw.setDiscrete(self.DigIfaceControls[sender][0], state)
152
153     def updatePlbkRouteControl(self, src):
154         sender = self.sender()
155         path = self.PlbkRouteControls[sender][0]
156         sink = self.PlbkRouteControls[sender][1]
157         self.hw.setDiscrete(path, sink, src)
158         self.setStreamLabel(src, sink)
159
160     def setStreamLabel(self, src, sink):
161         pos = src * 2 + 1
162         self.StreamMonitors[sink].lblName.setText("Playback %d/%d" % (pos, pos + 1))
163
164     def buildMixer(self):
165         log.debug("Building mixer")
166         self.MatrixButtonControls={}
167         self.MatrixRotaryControls={}
168         self.MatrixVolumeControls={}
169         self.VolumeControls={}
170         self.SelectorControls={}
171         self.SPDIFmodeControls={}
172         self.TriggerControls={}
173         self.DigIfaceControls={}
174         self.PlbkRouteControls={}
175         self.StreamMonitors=[]
176
177         nb_pys_out = self.hw.getDiscrete("/HwInfo/PhysicalAudioOutCount")
178         nb_pys_in = self.hw.getDiscrete("/HwInfo/PhysicalAudioInCount")
179
180         outputtabslayout = QHBoxLayout( self )
181         outputtabs = QTabWidget(self)
182         outputtabslayout.addWidget( outputtabs, 1 )
183
184         for outpair in range(int(nb_pys_out/2)):
185             tab = QWidget( outputtabs )
186             tablayout = QHBoxLayout( tab )
187            
188             grpMonitor = QGroupBox(tab)
189             tablayout.addWidget(grpMonitor)
190    
191             grpPlayback = QGroupBox(tab)
192             tablayout.addWidget(grpPlayback)
193    
194             grpOutput = QGroupBox(tab)
195             tablayout.addWidget(grpOutput)
196    
197             grpMonitor.setTitle("Monitor")
198             grpPlayback.setTitle("Playback")
199             grpOutput.setTitle("Output")
200            
201             # monitor controls
202             grpMonitorLayout = QHBoxLayout()
203             grpMonitor.setLayout(grpMonitorLayout);
204             output_id = outpair * 2
205             for inpair in range(int(nb_pys_in/2)):
206                 # create GUI elements
207                 strip = AfMonitorWidget( grpMonitor )
208                 grpMonitorLayout.addWidget( strip, 1 )
209                 input_id = inpair*2
210                 strip.lblName.setText("In %d/%d" % (input_id+1, input_id+2))
211
212                 # add the elements to the control structure
213
214                 self.MatrixButtonControls[strip.btnMute0] = ['/Mixer/MonitorMute', input_id, output_id]
215                 self.MatrixButtonControls[strip.btnMute1] = ['/Mixer/MonitorMute', input_id + 1, output_id + 1]
216                 self.MatrixButtonControls[strip.btnSolo0] = ['/Mixer/MonitorSolo', input_id, output_id]
217                 self.MatrixButtonControls[strip.btnSolo1] = ['/Mixer/MonitorSolo', input_id + 1, output_id + 1]
218                 self.MatrixRotaryControls[strip.rotPan0]  = ['/Mixer/MonitorPan', input_id, output_id]
219                 self.MatrixRotaryControls[strip.rotPan1]  = ['/Mixer/MonitorPan', input_id + 1, output_id + 1]
220                 self.MatrixVolumeControls[strip.sldGain0]  = ['/Mixer/MonitorGain', input_id, output_id]
221                 self.MatrixVolumeControls[strip.sldGain1]  = ['/Mixer/MonitorGain', input_id + 1, output_id + 1]
222
223             # playback
224             grpPlaybackLayout = QHBoxLayout()
225             grpPlayback.setLayout(grpPlaybackLayout);
226             strip = AfMonitorWidget( grpPlayback )
227             grpPlaybackLayout.addWidget(strip, 1)
228             strip.lblName.setText("Playback %d/%d" % (output_id+1, output_id+2))
229             self.StreamMonitors.append(strip)
230
231             self.VolumeControls[strip.sldGain0] = ["/Mixer/PC%dGain" % (output_id)]
232             self.VolumeControls[strip.sldGain1] = ["/Mixer/PC%dGain" % (output_id+1)]
233             self.SelectorControls[strip.btnMute0] = ["/Mixer/PC%dMute" % (output_id)]
234             self.SelectorControls[strip.btnMute1] = ["/Mixer/PC%dMute" % (output_id+1)]
235             self.SelectorControls[strip.btnSolo0] = ["/Mixer/PC%dSolo" % (output_id)]
236             self.SelectorControls[strip.btnSolo1] = ["/Mixer/PC%dSolo" % (output_id+1)]
237
238             # fix up mixer strip gui
239             strip.rotPan0.hide()
240             strip.rotPan1.hide()
241
242             # output
243             grpOutputLayout = QHBoxLayout()
244             grpOutput.setLayout(grpOutputLayout);
245             strip = AfMonitorWidget( grpOutput )
246             grpOutputLayout.addWidget(strip, 1)
247             strip.lblName.setText("Output %d/%d" % (output_id+1, output_id+2))
248
249             self.VolumeControls[strip.sldGain0] = ["/Mixer/OUT%dGain" % (output_id)]
250             self.VolumeControls[strip.sldGain1] = ["/Mixer/OUT%dGain" % (output_id+1)]
251             self.SelectorControls[strip.btnMute0] = ["/Mixer/OUT%dMute" % (output_id)]
252             self.SelectorControls[strip.btnMute1] = ["/Mixer/OUT%dMute" % (output_id+1)]
253             self.SelectorControls[strip.btnSolo0] = ["/Mixer/OUT%dNominal" % (output_id)]
254             self.SelectorControls[strip.btnSolo1] = ["/Mixer/OUT%dNominal" % (output_id+1)]
255
256             # fix up mixer strip gui
257             strip.btnSolo0.setText("Pad")
258             strip.btnSolo1.setText("Pad")
259             strip.rotPan0.hide()
260             strip.rotPan1.hide()
261
262             # add the tab
263             outputtabs.addTab( tab, "Out %d/%d" % (output_id+1, output_id+2))
264
265         # add an input config tab
266         tab = QWidget( outputtabs )
267         tablayout = QHBoxLayout( tab )
268
269         for inpair in range(nb_pys_in):
270             # create GUI elements
271             log.debug("strip")
272             grpInput = QGroupBox(tab)
273             tablayout.addWidget(grpInput)
274             grpInput.setTitle("In %d" % (inpair+1))
275
276             grpInputLayout = QVBoxLayout()
277             grpInput.setLayout(grpInputLayout);
278
279             label = QLabel( grpInput )
280             grpInputLayout.addWidget( label )
281             label.setText("In %d" % (inpair+1))
282             label.setAlignment(Qt.AlignCenter)
283
284             btn = QToolButton( grpInput )
285             grpInputLayout.addWidget( btn )
286             btn.setText("Pad")
287             btn.setCheckable(True)
288             self.SelectorControls[btn] = ["/Mixer/IN%dNominal" % (inpair)]
289
290             spacer = QSpacerItem(1,1,QSizePolicy.Minimum,QSizePolicy.Expanding)
291             grpInputLayout.addItem(spacer)
292
293         outputtabs.addTab( tab, "Input")
294
295         # add an settings tab
296         tab = QWidget( outputtabs )
297         tablayout = QHBoxLayout( tab )
298         outputtabs.addTab( tab, "Settings")
299         settings = AfSettingsWidget( tab )
300
301         has_sw_phantom = self.hw.getDiscrete("/HwInfo/PhantomPower")
302         if has_sw_phantom:
303             self.SelectorControls[settings.btnPhantom] = ["/PhantomPower"]
304         else:
305             settings.btnPhantom.hide()
306
307         has_opt_iface = self.hw.getDiscrete('/HwInfo/OpticalInterface')
308         if has_opt_iface:
309             self.DigIfaceControls[settings.cmbDigIface] = ['/DigitalInterface']
310         else:
311             settings.DigIface.hide()
312
313         has_plbk_route = self.hw.getDiscrete('/HwInfo/PlaybackRouting')
314         if has_plbk_route:
315             self.PlbkRouteControls[settings.cmbRoute1] = ['/PlaybackRouting', 0]
316             self.PlbkRouteControls[settings.cmbRoute2] = ['/PlaybackRouting', 1]
317             self.PlbkRouteControls[settings.cmbRoute3] = ['/PlaybackRouting', 2]
318             if self.configrom.getModelId() == 0x0AF2:
319                 label_route2 = 'Headphone Out 1/2'
320             else:
321                 label_route2 = 'Analog Out 3/4'
322             settings.labelRoute2.setText(label_route2)
323         else:
324             settings.PlbkRoute.hide()
325
326         self.TriggerControls[settings.btnSaveSettings] = ["/SaveSettings"]
327         self.TriggerControls[settings.btnIdentify] = ["/Identify"]
328
329         if self.configrom.getModelId() == 0x0AF12:
330             settings.spdifMode.hide()
331         else:
332             self.SPDIFmodeControls[settings.radioConsumer] = ["/SpdifMode", 0]
333             self.SPDIFmodeControls[settings.radioProfessional] = ["/SpdifMode", 1]
334
335         # Store a reference to the "save" button for later manipulation
336         self.btnSaveSettings = settings.btnSaveSettings
337
338     def polledUpdate(self):
339         ss = self.streamingstatus.selected()
340
341         # Only alter controls sensitive to the streaming state when the
342         # streaming state has changed.
343         if (ss != self.streaming_state):
344             ss_txt = self.streamingstatus.getEnumLabel(ss)
345             # The device doesn't cope very well if "save settings" is done
346             # while streaming is active
347             self.btnSaveSettings.setEnabled(ss_txt=='Idle')
348
349         self.streaming_state = ss
350
351     def initValues(self):
352         log.debug("Init values")
353
354         for ctrl, info in self.MatrixVolumeControls.items():
355             vol = self.hw.getMatrixMixerValue(self.MatrixVolumeControls[ctrl][0],
356                                                 self.MatrixVolumeControls[ctrl][1],
357                                                 self.MatrixVolumeControls[ctrl][2])
358
359             #vol = 0x01000000-vol
360             log.debug("%s volume is %d" % (ctrl.objectName() , vol))
361             ctrl.setValue(vol)
362
363             # connect the UI element
364             ctrl.valueChanged.connect(self.updateMatrixVolume)
365
366         for ctrl, info in self.MatrixButtonControls.items():
367             state = self.hw.getMatrixMixerValue(self.MatrixButtonControls[ctrl][0],
368                                                 self.MatrixButtonControls[ctrl][1],
369                                                 self.MatrixButtonControls[ctrl][2])
370
371             log.debug("%s state is %d" % (ctrl.objectName() , state))
372             if state:
373                 ctrl.setChecked(True)
374             else:
375                 ctrl.setChecked(False)
376
377             # connect the UI element
378             ctrl.clicked.connect(self.updateMatrixButton)
379
380         for ctrl, info in self.MatrixRotaryControls.items():
381             vol = self.hw.getMatrixMixerValue(self.MatrixRotaryControls[ctrl][0],
382                                                 self.MatrixRotaryControls[ctrl][1],
383                                                 self.MatrixRotaryControls[ctrl][2])
384
385             log.debug("%s value is %d" % (ctrl.objectName(), vol))
386             ctrl.setValue(vol)
387
388             # connect the UI element
389             ctrl.valueChanged.connect(self.updateMatrixRotary)
390
391         for ctrl, info in self.VolumeControls.items():
392             vol = self.hw.getContignuous(self.VolumeControls[ctrl][0])
393
394             #vol = 0x01000000-vol
395             log.debug("%s volume is %d" % (ctrl.objectName() , vol))
396             ctrl.setValue(vol)
397
398             # connect the UI element
399             ctrl.valueChanged.connect(self.updateVolume)
400
401         for ctrl, info in self.SelectorControls.items():
402             state = self.hw.getDiscrete(self.SelectorControls[ctrl][0])
403             log.debug("%s state is %d" % (ctrl.objectName() , state))
404             if state:
405                 ctrl.setChecked(True)
406             else:
407                 ctrl.setChecked(False)
408
409             # connect the UI element
410             ctrl.clicked.connect(self.updateSelector)
411
412         for ctrl, info in self.TriggerControls.items():
413             # connect the UI element
414             ctrl.clicked.connect(self.updateTrigger)
415
416         for ctrl, info in self.SPDIFmodeControls.items():
417             state = self.hw.getDiscrete(self.SPDIFmodeControls[ctrl][0])
418             log.debug("%s state is %d" % (ctrl.objectName() , state))
419             if state == self.SPDIFmodeControls[ctrl][1]:
420                 ctrl.setChecked(True)
421             else:
422                 ctrl.setChecked(False)
423
424             # connect the UI element
425             ctrl.toggled.connect(self.updateSPDIFmodeControl)
426
427         for ctrl, info in self.DigIfaceControls.items():
428             state = self.hw.getDiscrete(self.DigIfaceControls[ctrl][0])
429             # 0/2/3 is available but GUI set 0/1/2
430             if state > 0:
431                 state -= 1
432             ctrl.setCurrentIndex(state)
433             ctrl.activated.connect(self.updateDigIfaceControl)
434
435         for ctrl, info in self.PlbkRouteControls.items():
436             sink = self.PlbkRouteControls[ctrl][1]
437             src = self.hw.getDiscrete(self.PlbkRouteControls[ctrl][0], sink)
438             ctrl.setCurrentIndex(src)
439             self.setStreamLabel(src, sink)
440             ctrl.activated.connect(self.updatePlbkRouteControl)
441
442         self.update_timer = QTimer(self)
443         self.update_timer.timeout.connect(self.polledUpdate)
444         self.update_timer.start(1000)
445         self.streaming_state = -1
446
447 # vim: et
Note: See TracBrowser for help on using the browser.