root/trunk/libffado/support/dbus/controlserver.h

Revision 1652, 9.9 kB (checked in by arnonym, 12 years ago)

Getting the destination index for each peak is enough. Its always only one source per destination, so the destination is a unique identifier.

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
24 #ifndef CONTROLSERVER_H
25 #define CONTROLSERVER_H
26
27 #include "debugmodule/debugmodule.h"
28
29 #include <dbus-c++/dbus.h>
30
31 #include "controlserver-glue.h"
32
33 #include "libcontrol/BasicElements.h"
34 #include "libieee1394/configrom.h"
35 #include "libutil/Mutex.h"
36
37 namespace Control {
38     class MatrixMixer;
39     class CrossbarRouter;
40 };
41
42 namespace DBusControl {
43
44 class Element;
45 class Container;
46
47 template< typename CalleePtr, typename MemFunPtr >
48 class MemberSignalFunctor0
49     : public Control::SignalFunctor
50 {
51 public:
52     MemberSignalFunctor0( const CalleePtr& pCallee,
53             MemFunPtr pMemFun,
54             int pSignalId)
55         : Control::SignalFunctor( pSignalId )
56         , m_pCallee( pCallee )
57         , m_pMemFun( pMemFun )
58         {}
59
60     virtual ~MemberSignalFunctor0()
61         {}
62
63     virtual void operator() ()
64         {
65             ( ( *m_pCallee ).*m_pMemFun )();
66         }
67     virtual void operator() (int) {}
68 private:
69     CalleePtr  m_pCallee;
70     MemFunPtr  m_pMemFun;
71 };
72
73 template< typename CalleePtr, typename MemFunPtr >
74 class MemberSignalFunctor1
75     : public Control::SignalFunctor
76 {
77 public:
78     MemberSignalFunctor1( const CalleePtr& pCallee,
79             MemFunPtr pMemFun,
80             int pSignalId)
81         : Control::SignalFunctor( pSignalId )
82         , m_pCallee( pCallee )
83         , m_pMemFun( pMemFun )
84         {}
85
86     virtual ~MemberSignalFunctor1()
87         {}
88
89     virtual void operator() () {}
90
91     virtual void operator() (int value)
92         {
93             ( ( *m_pCallee ).*m_pMemFun )(value);
94         }
95 private:
96     CalleePtr  m_pCallee;
97     MemFunPtr  m_pMemFun;
98 };
99
100 class Element
101 : public org::ffado::Control::Element::Element
102 , public DBus::IntrospectableAdaptor
103 , public DBus::ObjectAdaptor
104 {
105 friend class Container; // required to have container access other slave elements
106 public:
107
108     Element( DBus::Connection& connection,
109              std::string p, Element *,
110              Control::Element &slave );
111
112     DBus::UInt64 getId( );
113     DBus::String getName( );
114     DBus::String getLabel( );
115     DBus::String getDescription( );
116
117     DBus::Bool canChangeValue( );
118
119     void setVerboseLevel( const DBus::Int32 &);
120     DBus::Int32 getVerboseLevel();
121
122 protected:
123     void Lock();
124     void Unlock();
125     bool isLocked();
126     Util::Mutex* getLock();
127
128     Element *           m_Parent;
129     Control::Element &  m_Slave;
130 private:
131     Util::Mutex*        m_UpdateLock;
132 protected:
133     DECLARE_DEBUG_MODULE;
134 };
135 typedef std::vector<Element *> ElementVector;
136 typedef std::vector<Element *>::iterator ElementVectorIterator;
137 typedef std::vector<Element *>::const_iterator ConstElementVectorIterator;
138
139 class Container
140 : public org::ffado::Control::Element::Container
141 , public DBusControl::Element
142 {
143 public:
144     Container( DBus::Connection& connection,
145                   std::string p, Element *,
146                   Control::Container &slave );
147     virtual ~Container();
148
149     DBus::Int32 getNbElements( );
150     DBus::String getElementName( const DBus::Int32& );
151
152     void updated(int new_nb_elements);
153     void destroyed();
154
155     void setVerboseLevel( const DBus::Int32 &);
156 private:
157     Element *createHandler(Element *, Control::Element& e);
158     void updateTree();
159     Element * findElementForControl(Control::Element *e);
160     void removeElement(Element *e);
161
162     Control::Container &        m_Slave;
163     ElementVector               m_Children;
164     Control::SignalFunctor *    m_updateFunctor;
165 };
166
167 class Continuous
168 : public org::ffado::Control::Element::Continuous
169 , public Element
170 {
171 public:
172     Continuous( DBus::Connection& connection,
173                   std::string p, Element *,
174                   Control::Continuous &slave );
175    
176     DBus::Double setValue( const DBus::Double & value );
177     DBus::Double getValue( );
178     DBus::Double getMinimum( );
179     DBus::Double getMaximum( );
180     DBus::Double setValueIdx( const DBus::Int32 & idx,
181                               const DBus::Double & value );
182     DBus::Double getValueIdx( const DBus::Int32 & idx );
183
184 private:
185     Control::Continuous &m_Slave;
186 };
187
188 class Discrete
189 : public org::ffado::Control::Element::Discrete
190 , public Element
191 {
192 public:
193     Discrete( DBus::Connection& connection,
194               std::string p, Element *,
195               Control::Discrete &slave );
196    
197     DBus::Int32 setValue( const DBus::Int32 & value );
198     DBus::Int32 getValue( );
199     DBus::Int32 setValueIdx( const DBus::Int32 & idx,
200                              const DBus::Int32 & value );
201     DBus::Int32 getValueIdx( const DBus::Int32 & idx );
202
203 private:
204     Control::Discrete &m_Slave;
205 };
206
207 class Text
208 : public org::ffado::Control::Element::Text
209 , public Element
210 {
211 public:
212     Text( DBus::Connection& connection,
213           std::string p, Element *,
214           Control::Text &slave );
215
216     DBus::String setValue( const DBus::String & value );
217     DBus::String getValue( );
218
219 private:
220     Control::Text &m_Slave;
221 };
222
223 class Register
224 : public org::ffado::Control::Element::Register
225 , public Element
226 {
227 public:
228     Register( DBus::Connection& connection,
229               std::string p, Element *,
230               Control::Register &slave );
231    
232     DBus::UInt64 setValue( const DBus::UInt64 & addr, const DBus::UInt64 & value );
233     DBus::UInt64 getValue( const DBus::UInt64 & addr );
234
235 private:
236     Control::Register &m_Slave;
237 };
238
239 class Enum
240 : public org::ffado::Control::Element::Enum
241 , public Element
242 {
243 public:
244     Enum( DBus::Connection& connection,
245           std::string p, Element *,
246           Control::Enum &slave );
247    
248     DBus::Int32 select( const DBus::Int32 & idx );
249     DBus::Int32 selected( );
250     DBus::Int32 count( );
251     DBus::String getEnumLabel( const DBus::Int32 & idx );
252
253 private:
254     Control::Enum &m_Slave;
255 };
256
257 class AttributeEnum
258 : public org::ffado::Control::Element::AttributeEnum
259 , public Element
260 {
261 public:
262     AttributeEnum( DBus::Connection& connection,
263                    std::string p, Element *,
264                    Control::AttributeEnum &slave );
265    
266     DBus::Int32 select( const DBus::Int32 & idx );
267     DBus::Int32 selected( );
268     DBus::Int32 count( );
269     DBus::Int32 attributeCount();
270     DBus::String getEnumLabel( const DBus::Int32 & idx );
271     DBus::String getAttributeValue( const DBus::Int32 & idx );
272     DBus::String getAttributeName( const DBus::Int32 & idx );
273
274 private:
275     Control::AttributeEnum &m_Slave;
276 };
277
278 // FIXME: to change this to a normal ConfigRom class name we have to
279 // put the 1394 config rom class into a separate namespace.
280 class ConfigRomX
281 : public org::ffado::Control::Element::ConfigRomX
282 , public Element
283 {
284 public:
285     ConfigRomX( DBus::Connection& connection,
286                   std::string p, Element *,
287                   ConfigRom &slave );
288
289     DBus::String getGUID( );
290     DBus::String getVendorName( );
291     DBus::String getModelName( );
292     DBus::Int32 getVendorId( );
293     DBus::Int32 getModelId( );
294     DBus::Int32 getUnitVersion( );
295
296 private:
297     ConfigRom &m_Slave;
298 };
299
300 class MatrixMixer
301 : public org::ffado::Control::Element::MatrixMixer
302 , public Element
303 {
304 public:
305     MatrixMixer(  DBus::Connection& connection,
306                   std::string p, Element *,
307                   Control::MatrixMixer &slave );
308
309     DBus::String getRowName( const DBus::Int32& );
310     DBus::String getColName( const DBus::Int32& );
311     DBus::Int32 canWrite( const DBus::Int32&, const DBus::Int32& );
312     DBus::Double setValue( const DBus::Int32&, const DBus::Int32&, const DBus::Double& );
313     DBus::Double getValue( const DBus::Int32&, const DBus::Int32& );
314     DBus::Int32 getRowCount( );
315     DBus::Int32 getColCount( );
316
317 private:
318     Control::MatrixMixer &m_Slave;
319 };
320
321 class CrossbarRouter
322 : public org::ffado::Control::Element::CrossbarRouter
323 , public Element
324 {
325 public:
326     CrossbarRouter(  DBus::Connection& connection,
327                   std::string p, Element *,
328                   Control::CrossbarRouter &slave );
329
330     DBus::String getSourceName(const DBus::Int32 &);
331     DBus::String getDestinationName(const DBus::Int32 &);
332     DBus::Int32 getSourceIndex(const DBus::String &);
333     DBus::Int32 getDestinationIndex(const DBus::String &);
334
335     std::vector< DBus::String > getSourceNames();
336     std::vector< DBus::String > getDestinationNames();
337
338     std::vector< DBus::Int32 > getDestinationsForSource(const DBus::Int32 &);
339     DBus::Int32 getSourceForDestination(const DBus::Int32 &);
340
341     DBus::Bool  canConnect(const DBus::Int32 &source, const DBus::Int32 &dest);
342     DBus::Bool  setConnectionState(const DBus::Int32 &source, const DBus::Int32 &dest, const DBus::Bool &enable);
343     DBus::Bool  getConnectionState(const DBus::Int32 &source, const DBus::Int32 &dest);
344
345     DBus::Bool  canConnectNamed(const DBus::String&, const DBus::String&);
346     DBus::Bool  setConnectionStateNamed(const DBus::String&, const DBus::String&, const DBus::Bool &enable);
347     DBus::Bool  getConnectionStateNamed(const DBus::String&, const DBus::String&);
348
349     DBus::Bool  clearAllConnections();
350
351     DBus::Int32 getNbSources();
352     DBus::Int32 getNbDestinations();
353
354     DBus::Bool  hasPeakMetering();
355     DBus::Double getPeakValue(const DBus::Int32 &source, const DBus::Int32 &dest);
356
357     std::vector< DBus::Struct<int, double> > getPeakValues();
358
359     std::vector< DBus::Int32 > getConnectionMap();
360     DBus::Int32 setConnectionMap(const std::vector< DBus::Int32 >&);
361
362 private:
363     Control::CrossbarRouter &m_Slave;
364 };
365
366 }
367
368 #endif // CONTROLSERVER_H
Note: See TracBrowser for help on using the browser.