root/branches/streaming-rework/src/bebob/bebob_avplug.h

Revision 404, 11.4 kB (checked in by pieterpalmers, 17 years ago)

- introduce support framework for DICE and Metric Halo
- change probe/discovery code to make adding devices easier
- made conditional compilation effectively work.

./configure now has the following switches:

--enable-bebob build BeBoB support (default=yes)
--enable-motu build Motu support (default=no)
--enable-dice build DICE support (default=no)
--enable-metric-halo build Metric Halo support (note: completely useless)

(default=no)

--enable-rme build RME support (note: completely useless)

(default=no)

--enable-bounce build Bounce device support (default=no)
--enable-all-devices build support for all supported devices (default=no)

these now turn on/off compilation effectively.

Line 
1 /* bebob_avplug.h
2  * Copyright (C) 2005,06,07 by Daniel Wagner
3  *
4  * This file is part of FreeBoB.
5  *
6  * FreeBoB is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  * FreeBoB is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with FreeBoB; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
18  * MA 02111-1307 USA.
19  */
20
21 #ifdef ENABLE_BEBOB
22
23 #ifndef BEBOB_AVPLUG_H
24 #define BEBOB_AVPLUG_H
25
26 #include "libfreebobavc/avc_signal_source.h"
27 #include "libfreebobavc/avc_extended_stream_format.h"
28 #include "libfreebobavc/avc_extended_plug_info.h"
29 #include "libfreebobavc/avc_extended_cmd_generic.h"
30 #include "libfreebobavc/avc_definitions.h"
31 #include "libfreebobavc/avc_generic.h"
32 #include "libfreebob/xmlparser.h"
33
34 #include "libutil/serialize.h"
35
36 #include "debugmodule/debugmodule.h"
37
38 #include <glibmm/ustring.h>
39
40 class Ieee1394Service;
41 class ConfigRom;
42
43 namespace BeBoB {
44
45 class AvDevice;
46 class AvPlugManager;
47 class AvPlug;
48
49 typedef std::vector<AvPlug*> AvPlugVector;
50
51 class AvPlug {
52 public:
53
54     enum EAvPlugAddressType {
55         eAPA_PCR,
56         eAPA_ExternalPlug,
57         eAPA_AsynchronousPlug,
58         eAPA_SubunitPlug,
59         eAPA_FunctionBlockPlug,
60         eAPA_Undefined,
61     };
62
63     enum EAvPlugType {
64         eAPT_IsoStream,
65         eAPT_AsyncStream,
66         eAPT_Midi,
67         eAPT_Sync,
68         eAPT_Analog,
69         eAPT_Digital,
70         eAPT_Unknown,
71     };
72
73     enum EAvPlugDirection {
74         eAPD_Input,
75         eAPD_Output,
76         eAPD_Unknown,
77     };
78
79     // \todo This constructors sucks. too many parameters. fix it.
80     AvPlug( Ieee1394Service& ieee1394Service,
81             ConfigRom& configRom,
82             AvPlugManager& plugManager,
83             AVCCommand::ESubunitType subunitType,
84             subunit_id_t subunitId,
85             function_block_type_t functionBlockType,
86             function_block_type_t functionBlockId,
87             EAvPlugAddressType plugAddressType,
88             EAvPlugDirection plugDirection,
89             plug_id_t plugId,
90             int verboseLevel );
91     AvPlug( const AvPlug& rhs );
92     virtual ~AvPlug();
93
94     bool discover();
95     bool discoverConnections();
96
97     bool inquireConnnection( AvPlug& plug );
98     bool setConnection( AvPlug& plug );
99
100     int getGlobalId() const
101         { return m_globalId; }
102     plug_id_t getPlugId() const
103         { return m_id; }
104     AVCCommand::ESubunitType getSubunitType() const
105         { return m_subunitType; }
106     subunit_id_t getSubunitId() const
107         { return m_subunitId; }
108     const char* getName() const
109         { return m_name.c_str(); }
110     EAvPlugDirection getPlugDirection() const
111         { return m_direction; }
112     sampling_frequency_t getSamplingFrequency() const
113         { return m_samplingFrequency; }
114     int getSampleRate() const; // 22050, 24000, 32000, ...
115     int getNrOfChannels() const;
116     int getNrOfStreams() const;
117
118     EAvPlugDirection getDirection() const
119         { return m_direction; }
120     EAvPlugAddressType getPlugAddressType() const
121         { return m_addressType; }
122     EAvPlugType getPlugType() const
123         { return m_infoPlugType; }
124
125     function_block_type_t getFunctionBlockType() const
126         { return m_functionBlockType; }
127     function_block_id_t getFunctionBlockId() const
128         { return m_functionBlockId; }
129
130     const AvPlugVector& getInputConnections() const
131         { return m_inputConnections; }
132     const AvPlugVector& getOutputConnections() const
133         { return m_outputConnections; }
134
135     bool addXmlDescription( xmlNodePtr conectionSet );
136     bool addXmlDescriptionStreamFormats( xmlNodePtr streamFormats );
137
138     static PlugAddress::EPlugDirection convertPlugDirection(
139         EAvPlugDirection direction);
140
141     void showPlug() const;
142
143     bool serialize( Glib::ustring basePath, Util::IOSerialize& ser ) const;
144     static AvPlug* deserialize( Glib::ustring basePath,
145                                 Util::IODeserialize& deser,
146                                 AvDevice& avDevice,
147                                 AvPlugManager& plugManager );
148
149     bool deserializeUpdate( Glib::ustring basePath,
150                             Util::IODeserialize& deser );
151
152  public:
153     struct ChannelInfo {
154         stream_position_t          m_streamPosition;
155         stream_position_location_t m_location;
156         Glib::ustring              m_name;
157     };
158     typedef std::vector<ChannelInfo> ChannelInfoVector;
159
160     struct ClusterInfo {
161         int                      m_index;
162         port_type_t              m_portType;
163         Glib::ustring            m_name;
164
165         nr_of_channels_t         m_nrOfChannels;
166         ChannelInfoVector        m_channelInfos;
167         stream_format_t          m_streamFormat;
168     };
169     typedef std::vector<ClusterInfo> ClusterInfoVector;
170
171     ClusterInfoVector& getClusterInfos()
172         { return m_clusterInfos; }
173
174 protected:
175     AvPlug();
176
177     bool discoverPlugType();
178     bool discoverName();
179     bool discoverNoOfChannels();
180     bool discoverChannelPosition();
181     bool discoverChannelName();
182     bool discoverClusterInfo();
183     bool discoverStreamFormat();
184     bool discoverSupportedStreamFormats();
185     bool discoverConnectionsInput();
186     bool discoverConnectionsOutput();
187
188     ExtendedPlugInfoCmd setPlugAddrToPlugInfoCmd();
189
190     ExtendedStreamFormatCmd setPlugAddrToStreamFormatCmd(
191         ExtendedStreamFormatCmd::ESubFunction subFunction);
192
193     SignalSourceCmd setSrcPlugAddrToSignalCmd();
194
195     void setDestPlugAddrToSignalCmd(
196         SignalSourceCmd& signalSourceCmd, AvPlug& plug );
197
198     void debugOutputClusterInfos( int debugLevel );
199
200     bool copyClusterInfo(ExtendedPlugInfoPlugChannelPositionSpecificData&
201                          channelPositionData );
202
203     bool addPlugConnection( AvPlugVector& connections, AvPlug& plug );
204
205     bool discoverConnectionsFromSpecificData(
206         EAvPlugDirection discoverDirection,
207         PlugAddressSpecificData* plugAddress,
208         AvPlugVector& connections );
209
210     AvPlug* getPlugDefinedBySpecificData(
211         UnitPlugSpecificDataPlugAddress* pUnitPlugAddress,
212         SubunitPlugSpecificDataPlugAddress* pSubunitPlugAddress,
213         FunctionBlockPlugSpecificDataPlugAddress* pFunctionBlockPlugAddress );
214
215     EAvPlugDirection toggleDirection( EAvPlugDirection direction ) const;
216
217     const ClusterInfo* getClusterInfoByIndex( int index ) const;
218
219     bool serializeChannelInfos( Glib::ustring basePath,
220                                 Util::IOSerialize& ser,
221                                 const ClusterInfo& clusterInfo ) const;
222     bool deserializeChannelInfos( Glib::ustring basePath,
223                                   Util::IODeserialize& deser,
224                                   ClusterInfo& clusterInfo );
225
226     bool serializeClusterInfos( Glib::ustring basePath,
227                                 Util::IOSerialize& ser ) const;
228     bool deserializeClusterInfos( Glib::ustring basePath,
229                                   Util::IODeserialize& deser );
230
231     bool serializeFormatInfos( Glib::ustring basePath,
232                                Util::IOSerialize& ser ) const;
233     bool deserializeFormatInfos( Glib::ustring basePath,
234                                  Util::IODeserialize& deser );
235
236     bool serializeAvPlugVector( Glib::ustring basePath,
237                                 Util::IOSerialize& ser,
238                                 const AvPlugVector& vec) const;
239     bool deserializeAvPlugVector( Glib::ustring basePath,
240                                   Util::IODeserialize& deser,
241                                   AvPlugVector& vec );
242
243 private:
244     // Supported stream formats
245     struct FormatInfo {
246         FormatInfo()
247             : m_samplingFrequency( eSF_DontCare )
248             , m_isSyncStream( false )
249             , m_audioChannels( 0 )
250             , m_midiChannels( 0 )
251             , m_index( 0xff )
252             {}
253         sampling_frequency_t  m_samplingFrequency;
254         bool                  m_isSyncStream;
255         number_of_channels_t  m_audioChannels;
256         number_of_channels_t  m_midiChannels;
257         byte_t                m_index;
258     };
259     typedef std::vector<FormatInfo> FormatInfoVector;
260
261
262     Ieee1394Service*             m_p1394Service;
263     ConfigRom*                   m_pConfigRom;
264     AVCCommand::ESubunitType     m_subunitType;
265     subunit_id_t                 m_subunitId;
266     function_block_type_t        m_functionBlockType;
267     function_block_id_t          m_functionBlockId;
268     EAvPlugAddressType           m_addressType;
269     EAvPlugDirection             m_direction;
270     plug_id_t                    m_id;
271     EAvPlugType                  m_infoPlugType;
272     nr_of_channels_t             m_nrOfChannels;
273     Glib::ustring                m_name;
274     ClusterInfoVector            m_clusterInfos;
275     sampling_frequency_t         m_samplingFrequency;
276     FormatInfoVector             m_formatInfos;
277     AvPlugVector                 m_inputConnections;
278     AvPlugVector                 m_outputConnections;
279     AvPlugManager*               m_plugManager;
280     int                          m_verboseLevel;
281     int                          m_globalId;
282     static int                   m_globalIdCounter;
283
284     DECLARE_DEBUG_MODULE;
285 };
286
287 const char* avPlugAddressTypeToString( AvPlug::EAvPlugAddressType addressType );
288 const char* avPlugTypeToString( AvPlug::EAvPlugType type );
289 const char* avPlugDirectionToString( AvPlug::EAvPlugDirection direction );
290
291 class AvPlugManager
292 {
293 public:
294     AvPlugManager( int verboseLevel );
295     AvPlugManager( const AvPlugManager& rhs );
296     ~AvPlugManager();
297
298     bool addPlug( AvPlug& plug );
299     bool remPlug( AvPlug& plug );
300
301     void showPlugs() const;
302
303     AvPlug* getPlug( AVCCommand::ESubunitType subunitType,
304                      subunit_id_t subunitId,
305                      function_block_type_t functionBlockType,
306                      function_block_id_t functionBlockId,
307                      AvPlug::EAvPlugAddressType plugAddressType,
308                      AvPlug::EAvPlugDirection plugDirection,
309                      plug_id_t plugId ) const;
310     AvPlug* getPlug( int iGlobalId ) const;
311     AvPlugVector getPlugsByType( AVCCommand::ESubunitType subunitType,
312                                  subunit_id_t subunitId,
313                                  function_block_type_t functionBlockType,
314                                  function_block_id_t functionBlockId,
315                                  AvPlug::EAvPlugAddressType plugAddressType,
316                                  AvPlug::EAvPlugDirection plugDirection,
317                                  AvPlug::EAvPlugType type) const;
318
319     bool serialize( Glib::ustring basePath, Util::IOSerialize& ser ) const;
320     static  AvPlugManager* deserialize( Glib::ustring basePath,
321                                         Util::IODeserialize& deser,
322                                         AvDevice& avDevice );
323
324 private:
325     AvPlugManager();
326
327     int          m_verboseLevel;
328     AvPlugVector m_plugs;
329
330     DECLARE_DEBUG_MODULE;
331 };
332
333 class AvPlugConnection {
334 public:
335     AvPlugConnection( AvPlug& srcPlug, AvPlug& destPlug );
336
337     AvPlug& getSrcPlug() const
338         { return *m_srcPlug; }
339     AvPlug& getDestPlug() const
340         { return *m_destPlug; }
341
342     bool serialize( Glib::ustring basePath, Util::IOSerialize& ser ) const;
343     static AvPlugConnection* deserialize( Glib::ustring basePath,
344                                           Util::IODeserialize& deser,
345                                           AvDevice& avDevice );
346 private:
347     AvPlugConnection();
348
349 private:
350     AvPlug* m_srcPlug;
351     AvPlug* m_destPlug;
352 };
353
354 typedef std::vector<AvPlugConnection*> AvPlugConnectionVector;
355 typedef std::vector<AvPlugConnection> AvPlugConnectionOwnerVector;
356
357 }
358
359 #endif
360
361 #endif //#ifdef ENABLE_BEBOB
Note: See TracBrowser for help on using the browser.