root/branches/libffado-2.0/support/mixer/mixer_generic.py

Revision 1093, 5.7 kB (checked in by arnonym, 16 years ago)
  • Add a generic part for each mixer controlling the nickname and the clocksource.
  • Don't install the generic mixer as its only intended for developers.
  • ignore the generated ffadomixer_config.py
  • Rework/resort the initialization of mixer-widgets...
Line 
1 #
2 # Copyright (C) 2008 by Arnold Krille
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 # 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 import sys
24 import dbus
25 from qt import *
26
27 class ContainerWidget( QFrame ):
28         def __init__( self, name, interface, parent ):
29                 QFrame.__init__( self, parent )
30                 self.interface = interface
31                 self.setFrameStyle( QFrame.Plain|QFrame.StyledPanel )
32                 self.setLineWidth( 1 )
33                 self.setMargin( 5 )
34                 l2 = QVBoxLayout( self )
35                 l2.setMargin( 5 )
36                 lbl = QLabel( "<qt><b>" + name + "</b></qt>", self )
37                 l2.addWidget( lbl )
38                 self.l = QHBoxLayout( None )
39                 self.l.setMargin( 0 )
40                 self.l.setSpacing( 2 )
41                 l2.addLayout( self.l )
42
43         def layout( self ):
44                 return self.l
45
46 class ContinuousWidget( QWidget ):
47         def __init__( self, name, interface, parent ):
48                 QWidget.__init__( self, parent )
49                 self.interface = interface
50                 l = QVBoxLayout( self )
51                 l.addWidget( QLabel( name, self ) )
52                 self.slider = QSlider( self )
53                 l.addWidget( self.slider )
54
55                 self.min = self.interface.getMinimum()
56                 self.max = self.interface.getMaximum()
57                 self.slider.setMinValue( 0 )
58                 self.slider.setMaxValue( 100 )
59                 self.slider.setValue( self.interfaceToSlider( self.interface.getValue() ) )
60                 self.connect( self.slider, SIGNAL( "valueChanged(int)" ), self.sliderMoved )
61
62         def sliderToInterFace( self, slider ):
63                 return ( self.max - self.min ) * (100-slider)/100.0 + self.min
64         def interfaceToSlider( self, interface ):
65                 return - ( interface - self.min ) / ( self.max - self.min ) * 100.0 + 100
66
67         def sliderMoved( self, i ):
68                 #print "ContinuousWidget::sliderMoved( %i )" % i
69                 self.interface.setValue( self.sliderToInterFace( i ) )
70
71 class EnumWidget( QWidget ):
72         def __init__( self, name, interface, parent ):
73                 QWidget.__init__( self, parent )
74                 self.interface = interface
75                 l = QVBoxLayout( self )
76                 l.addWidget( QLabel( name, self ) )
77                 self.select = QComboBox( False, self )
78                 l.addWidget( self.select )
79                 for i in range( interface.count() ):
80                         self.select.insertItem( interface.getEnumLabel( i ) )
81                 self.select.setCurrentItem( self.interface.selected() )
82                 self.connect( self.select, SIGNAL( "activated(int)" ), self.currentChanged )
83
84         def currentChanged( self, i ):
85                 #print "EnumWidget::currentChanged(" + str(i) + ")"
86                 self.interface.select( i )
87
88 class TextWidget( QWidget ):
89         def __init__( self, name, interface, parent ):
90                 QWidget.__init__( self, parent )
91                 self.interface = interface
92                 l = QVBoxLayout( self )
93                 l.addWidget( QLabel( name, self ) )
94                 self.text = QLineEdit( self )
95                 l.addWidget( self.text )
96                 self.text.setText( interface.getValue() )
97                 self.connect( self.text, SIGNAL( "textChanged( const QString & )" ), self.setText )
98
99         def setText( self, text ):
100                 self.interface.setValue( text.latin1() )
101
102 class HLine( QFrame ):
103         def __init__( self, parent ):
104                 QFrame.__init__( self, parent )
105                 self.setFrameShape( QFrame.HLine )
106                 self.setLineWidth( 2 )
107                 self.setMinimumHeight( 10 )
108
109 class GenericMixer( QWidget ):
110         def __init__( self, bus, session, parent=None ):
111                 QWidget.__init__( self, parent )
112                 QVBoxLayout( self )
113                 self.layout().addWidget( QLabel( "<qt>This generic interface is only intended for developers. The controls shown here may or may not work and probably don't represent the devices real structure. This just displays the object-tree as exported by ffado-dbus-server.</qt>", self ) )
114                 self.layout().addWidget( HLine( self ) )
115                 self.introspect( bus, session, "/org/ffado/Control/DeviceManager", self )
116
117         def introspect( self, bus, session, path, parentwidget ):
118                 element = bus.get_object( session, path )
119                 element._Introspect().block()
120                 interfacemap = element._introspect_method_map
121                 interfacelist = []
122                 for t in interfacemap:
123                         tmp = ".".join(t.split(".")[:-1])
124                         if tmp not in interfacelist:
125                                 interfacelist.append( tmp )
126
127                 name = "Unnamed"
128
129                 if interfacelist.count( "org.ffado.Control.Element.Element" ):
130                         name = dbus.Interface( element, "org.ffado.Control.Element.Element" ).getName()
131
132                 w = None
133
134                 if interfacelist.count( "org.ffado.Control.Element.Container" ):
135                         container = dbus.Interface( element, "org.ffado.Control.Element.Container" )
136                         w = ContainerWidget( name, container, parentwidget )
137                         parentwidget.layout().addWidget( w )
138                         for i in range( container.getNbElements() ):
139                                 #print "%s %i %s" % ( path, i, container.getElementName( i ) )
140                                 self.introspect( bus, session, path + "/" + container.getElementName( i ), w )
141
142                 if w == None and interfacelist.count( "org.ffado.Control.Element.Continuous" ):
143                         w = ContinuousWidget( name, dbus.Interface( element, "org.ffado.Control.Element.Continuous" ), parentwidget )
144                         parentwidget.layout().addWidget( w )
145
146                 if w == None and interfacelist.count( "org.ffado.Control.Element.AttributeEnum" ):
147                         w = EnumWidget( name, dbus.Interface( element, "org.ffado.Control.Element.AttributeEnum" ), parentwidget )
148                         parentwidget.layout().addWidget( w )
149
150                 if w == None and interfacelist.count( "org.ffado.Control.Element.Text" ):
151                         w = TextWidget( name, dbus.Interface( element, "org.ffado.Control.Element.Text" ), parentwidget )
152                         parentwidget.layout().addWidget( w )
153
154                 if w == None:
155                         w = QLabel( "<qt><b>%s</b> (Not yet implemented)</qt>" % name, parentwidget )
156                         parentwidget.layout().addWidget( w )
157
Note: See TracBrowser for help on using the browser.