root/trunk/libffado/support/mixer/mixer_motu.py

Revision 1106, 11.6 kB (checked in by arnonym, 14 years ago)

Not my day. Remove the modal parameter from the arguments.

Line 
1 #
2 # Copyright (C) 2005-2008 by Pieter Palmers
3 # Copyright (C) 2008 by Jonathan Woithe
4 #
5 # This file is part of FFADO
6 # FFADO = Free Firewire (pro-)audio drivers for linux
7 #
8 # FFADO is based upon FreeBoB.
9 #
10 # This program is free software: you can redistribute it and/or modify
11 # it under the terms of the GNU General Public License as published by
12 # the Free Software Foundation, either version 2 of the License, or
13 # (at your option) version 3 of the License.
14 #
15 # This program is distributed in the hope that it will be useful,
16 # but WITHOUT ANY WARRANTY; without even the implied warranty of
17 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 # GNU General Public License for more details.
19 #
20 # You should have received a copy of the GNU General Public License
21 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
22 #
23
24 from qt import *
25 from mixer_motuui import *
26
27 class MotuMixer(MotuMixerUI):
28     def __init__(self,parent = None,name = None,fl = 0):
29         MotuMixerUI.__init__(self,parent,name,fl)
30
31     # public slot: channel/mix faders
32     def updateFader(self, a0):
33         sender = self.sender()
34         vol = 128-a0
35         print "setting %s channel/mix fader to %d" % (self.ChannelFaders[sender][0], vol)
36         self.hw.setDiscrete(self.ChannelFaders[sender][0], vol)
37
38     # public slot: a generic multivalue control
39     def updateControl(self, a0):
40         sender = self.sender()
41         val = a0
42         print "setting %s control to %d" % (self.Controls[sender][0], val)
43         self.hw.setDiscrete(self.Controls[sender][0], val)
44
45     # public slot: generic binary switch
46     def updateBinarySwitch(self, a0):
47         sender = self.sender()
48         val=a0
49         print "setting %s switch to %d" % (self.BinarySwitches[sender][0], val)
50         self.hw.setDiscrete(self.BinarySwitches[sender][0], val)
51
52     # public slot: mix destination control
53     def updateMixDest(self, a0):
54         sender = self.sender()
55         dest=a0
56         print "setting %s mix destination to %d" % (self.MixDests[sender][0], dest)
57         self.hw.setDiscrete(self.MixDests[sender][0], dest)
58
59     # public slots: mix output controls
60     def set_mix1_dest(self,a0):
61         self.setMixDest('mix1', a0)
62
63     def setSelector(self,a0,a1):
64         name=a0
65         state = a1
66         print "setting %s state to %d" % (name, state)
67         self.hw.setDiscrete(self.SelectorControls[name][0], state)
68
69     def init(self):
70         print "Init MOTU mixer window"
71
72         self.ChannelFaders={
73             self.mix1ana1_fader: ['/Mixer/Mix1/Ana1_fader'],
74             self.mix1ana2_fader: ['/Mixer/Mix1/Ana2_fader'],
75             self.mix1ana3_fader: ['/Mixer/Mix1/Ana3_fader'],
76             self.mix1ana4_fader: ['/Mixer/Mix1/Ana4_fader'],
77             self.mix1ana5_fader: ['/Mixer/Mix1/Ana5_fader'],
78             self.mix1ana6_fader: ['/Mixer/Mix1/Ana6_fader'],
79             self.mix1ana7_fader: ['/Mixer/Mix1/Ana7_fader'],
80             self.mix1ana8_fader: ['/Mixer/Mix1/Ana8_fader'],
81             self.mix1_fader: ['/Mixer/Mix1/Mix_fader'],
82             }
83
84         self.Controls={
85             self.mix1ana1_pan:   ['/Mixer/Mix1/Ana1_pan'],
86             self.mix1ana2_pan:   ['/Mixer/Mix1/Ana2_pan'],
87             self.mix1ana3_pan:   ['/Mixer/Mix1/Ana3_pan'],
88             self.mix1ana4_pan:   ['/Mixer/Mix1/Ana4_pan'],
89             self.mix1ana5_pan:   ['/Mixer/Mix1/Ana5_pan'],
90             self.mix1ana6_pan:   ['/Mixer/Mix1/Ana6_pan'],
91             self.mix1ana7_pan:   ['/Mixer/Mix1/Ana7_pan'],
92             self.mix1ana8_pan:   ['/Mixer/Mix1/Ana8_pan'],
93
94             self.ana1_trimgain:  ['/Mixer/Control/Ana1_trimgain'],
95             self.ana2_trimgain:  ['/Mixer/Control/Ana2_trimgain'],
96             self.ana3_trimgain:  ['/Mixer/Control/Ana3_trimgain'],
97             self.ana4_trimgain:  ['/Mixer/Control/Ana4_trimgain'],
98         }
99
100         self.BinarySwitches={
101             self.mix1ana1_mute:  ['/Mixer/Mix1/Ana1_mute'],
102             self.mix1ana2_mute:  ['/Mixer/Mix1/Ana2_mute'],
103             self.mix1ana3_mute:  ['/Mixer/Mix1/Ana3_mute'],
104             self.mix1ana4_mute:  ['/Mixer/Mix1/Ana4_mute'],
105             self.mix1ana5_mute:  ['/Mixer/Mix1/Ana5_mute'],
106             self.mix1ana6_mute:  ['/Mixer/Mix1/Ana6_mute'],
107             self.mix1ana7_mute:  ['/Mixer/Mix1/Ana7_mute'],
108             self.mix1ana8_mute:  ['/Mixer/Mix1/Ana8_mute'],
109             self.mix1ana1_solo:  ['/Mixer/Mix1/Ana1_solo'],
110             self.mix1ana2_solo:  ['/Mixer/Mix1/Ana2_solo'],
111             self.mix1ana3_solo:  ['/Mixer/Mix1/Ana3_solo'],
112             self.mix1ana4_solo:  ['/Mixer/Mix1/Ana4_solo'],
113             self.mix1ana5_solo:  ['/Mixer/Mix1/Ana5_solo'],
114             self.mix1ana6_solo:  ['/Mixer/Mix1/Ana6_solo'],
115             self.mix1ana7_solo:  ['/Mixer/Mix1/Ana7_solo'],
116             self.mix1ana8_solo:  ['/Mixer/Mix1/Ana8_solo'],
117             self.mix1_mute:      ['/Mixer/Mix1/Mix_mute'],
118             self.ana1_pad:       ['/Mixer/Control/Ana1_pad'],
119             self.ana2_pad:       ['/Mixer/Control/Ana2_pad'],
120             self.ana3_pad:       ['/Mixer/Control/Ana3_pad'],
121             self.ana4_pad:       ['/Mixer/Control/Ana4_pad'],
122             self.ana5_level:     ['/Mixer/Control/Ana5_level'],
123             self.ana6_level:     ['/Mixer/Control/Ana6_level'],
124             self.ana7_level:     ['/Mixer/Control/Ana7_level'],
125             self.ana8_level:     ['/Mixer/Control/Ana8_level'],
126             self.ana5_boost:     ['/Mixer/Control/Ana5_boost'],
127             self.ana6_boost:     ['/Mixer/Control/Ana6_boost'],
128             self.ana7_boost:     ['/Mixer/Control/Ana7_boost'],
129             self.ana8_boost:     ['/Mixer/Control/Ana8_boost'],
130         }
131
132         # Ultimately these may be rolled into the BinarySwitches controls,
133         # but since they aren't implemented and therefore need to be
134         # disabled it's easier to keep them separate for the moment.
135         self.PairSwitches={
136             self.mix1ana1_2_pair:   ['Mixer/Mix1/Ana1_2_pair'],
137             self.mix1ana3_4_pair:   ['Mixer/Mix1/Ana3_4_pair'],
138             self.mix1ana5_6_pair:   ['Mixer/Mix1/Ana5_6_pair'],
139             self.mix1ana7_8_pair:   ['Mixer/Mix1/Ana7_8_pair'],
140             self.mix1aes1_2_pair:   ['Mixer/Mix1/Aes1_2_pair'],
141             self.mix1adat1_2_pair:  ['Mixer/Mix1/Adat1_2_pair'],
142             self.mix1adat3_4_pair:  ['Mixer/Mix1/Adat3_4_pair'],
143             self.mix1adat5_6_pair:  ['Mixer/Mix1/Adat5_6_pair'],
144             self.mix1adat7_8_pair:  ['Mixer/Mix1/Adat7_8_pair'],
145             self.mix1spdif1_2_pair: ['Mixer/Mix1/Spdif1_2_pair'],
146         }
147
148         self.MixDests={
149             self.mix1_dest:      ['/Mixer/Mix1/Mix_dest'],
150
151             self.phones_src:     ['/Mixer/Control/Phones_src'],
152
153             self.optical_in_mode:   ['/Mixer/Control/OpticalIn_mode'],
154             self.optical_out_mode:  ['/Mixer/Control/OpticalOut_mode'],
155         }
156
157         self.SelectorControls={
158
159         }
160
161         # Other mixer variables
162         self.is_streaming = 0
163         self.sample_rate = 0
164
165     def initValues(self):
166         # Is the device streaming?
167         self.is_streaming = self.hw.getDiscrete('/Mixer/Info/IsStreaming')
168         print "device streaming flag: %d" % (self.is_streaming)
169
170         # Retrieve other device settings as needed
171         self.sample_rate = self.hw.getDiscrete('/Mixer/Info/SampleRate')
172         print "device sample rate: %d" % (self.sample_rate)
173         self.has_mic_inputs = self.hw.getDiscrete('/Mixer/Info/HasMicInputs')
174         print "device has mic inputs: %d" % (self.has_mic_inputs)
175         self.has_aesebu_inputs = self.hw.getDiscrete('/Mixer/Info/HasAESEBUInputs')
176         print "device has AES/EBU inputs: %d" % (self.has_aesebu_inputs)
177         self.has_spdif_inputs = self.hw.getDiscrete('/Mixer/Info/HasSPDIFInputs')
178         print "device has SPDIF inputs: %d" % (self.has_spdif_inputs)
179         self.has_optical_spdif = self.hw.getDiscrete('/Mixer/Info/HasOpticalSPDIF')
180         print "device has optical SPDIF: %d" % (self.has_optical_spdif)
181
182         # Customise the UI based on device options retrieved
183         if (self.has_mic_inputs):
184             # Mic input controls displace AES/EBU since no current device
185             # has both.
186             self.mix1_aes_group.setTitle("Mic inputs")
187             # FIXME: when implmented, will mic channels just reuse the AES/EBU
188             # dbus path?  If not we'll have to reset the respective values in
189             # the control arrays (self.ChannelFaders etc).
190         else:
191             if (not(self.has_aesebu_inputs)):
192                 self.mix1_aes_group.setEnabled(False)
193         if (not(self.has_spdif_inputs)):
194             self.mix1_spdif_group.setEnabled(False)
195
196         # Some devices don't have the option of selecting an optical SPDIF
197         # mode.
198         if (not(self.has_optical_spdif)):
199             self.optical_in_mode.removeItem(2)
200             self.optical_out_mode.removeItem(2)
201
202         # Some controls must be disabled if the device is streaming
203         if (self.is_streaming):
204             print "Disabling controls which require inactive streaming"
205             self.optical_in_mode.setEnabled(False)
206             self.optical_out_mode.setEnabled(False)
207
208         # Some channels aren't available at higher sampling rates
209         if (self.sample_rate > 96000):
210             print "Disabling controls not present above 96 kHz"
211             self.mix1_adat_group.setEnabled(False)
212             self.mix1_aes_group.setEnabled(False)
213             self.mix1_spdif_group.setEnabled(False)
214         if (self.sample_rate > 48000):
215             print "Disabling controls not present above 48 kHz"
216             self.mix1_adat58_group.setEnabled(False)
217
218         # Now fetch the current values into the respective controls.  Don't
219         # bother fetching controls which are disabled.
220         for ctrl, info in self.ChannelFaders.iteritems():
221             if (not(ctrl.isEnabled())):
222                 continue
223             vol = 128-self.hw.getDiscrete(info[0])
224             print "%s channel fader is %d" % (info[0] , vol)
225             ctrl.setValue(vol)
226             QObject.connect(ctrl, SIGNAL('valueChanged(int)'), self.updateFader)
227
228         for ctrl, info in self.Controls.iteritems():
229             if (not(ctrl.isEnabled())):
230                 continue
231             pan = self.hw.getDiscrete(info[0])
232             print "%s control is %d" % (info[0] , pan)
233             ctrl.setValue(pan)
234             QObject.connect(ctrl, SIGNAL('valueChanged(int)'), self.updateControl)
235
236         # Disable the channel pair controls since they aren't yet implemented
237         for ctrl, info in self.PairSwitches.iteritems():
238             print "%s control is not implemented yet: disabling" % (info[0])
239             ctrl.setEnabled(False)
240
241         for ctrl, info in self.BinarySwitches.iteritems():
242             if (not(ctrl.isEnabled())):
243                 continue
244             val = self.hw.getDiscrete(info[0])
245             print "%s switch is %d" % (info[0] , val)
246             ctrl.setChecked(val)
247             QObject.connect(ctrl, SIGNAL('toggled(bool)'), self.updateBinarySwitch)
248
249         for ctrl, info in self.MixDests.iteritems():
250             if (not(ctrl.isEnabled())):
251                 continue
252             dest = self.hw.getDiscrete(info[0])
253             print "%s mix destination is %d" % (info[0] , dest)
254             ctrl.setCurrentItem(dest)
255             QObject.connect(ctrl, SIGNAL('activated(int)'), self.updateMixDest)
256
257         for name, ctrl in self.SelectorControls.iteritems():
258             state = self.hw.getDiscrete(ctrl[0])
259             print "%s state is %d" % (name , state)
260             ctrl[1].setCurrentItem(state)   
261
262         # FIXME: If optical mode is not ADAT, disable ADAT controls here.
263         # It can't be done earlier because we need the current values of the
264         # ADAT channel controls in case the user goes ahead and enables the
265         # ADAT optical mode.
Note: See TracBrowser for help on using the browser.