root/branches/echoaudio/src/libavc/avc_extended_plug_info.h

Revision 499, 10.6 kB (checked in by ppalmers, 17 years ago)

- implement AV/C descriptor and infoblock parsing
- implement AV/C music subunit status descriptor and related infoblocks

- small changes and generalizations

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1 /*
2  * Copyright (C) 2005-2007 by Daniel Wagner
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 library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License version 2.1, as published by the Free Software Foundation;
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
21  * MA 02110-1301 USA
22  */
23
24 #ifndef AVCEXTENDEDPLUGINFO_H
25 #define AVCEXTENDEDPLUGINFO_H
26
27 #include "avc_extended_cmd_generic.h"
28 #include "avc_generic.h"
29
30 #include <libavc1394/avc1394.h>
31
32 #include <string>
33 #include <vector>
34
35 class ExtendedPlugInfoPlugTypeSpecificData : public IBusData
36 {
37 public:
38     enum EExtendedPlugInfoPlugType {
39         eEPIPT_IsoStream   = 0x0,
40         eEPIPT_AsyncStream = 0x1,
41         eEPIPT_Midi        = 0x2,
42         eEPIPT_Sync        = 0x3,
43         eEPIPT_Analog      = 0x4,
44         eEPIPT_Digital     = 0x5,
45
46         eEPIPT_Unknown     = 0xff,
47     };
48
49     ExtendedPlugInfoPlugTypeSpecificData( EExtendedPlugInfoPlugType ePlugType =  eEPIPT_Unknown);
50     virtual ~ExtendedPlugInfoPlugTypeSpecificData();
51
52     virtual bool serialize( IOSSerialize& se );
53     virtual bool deserialize( IISDeserialize& de );
54     virtual ExtendedPlugInfoPlugTypeSpecificData* clone() const;
55
56     typedef byte_t plug_type_t;
57
58     plug_type_t m_plugType;
59 };
60
61 const char* extendedPlugInfoPlugTypeToString( plug_type_t plugType );
62
63 /////////////////////////////////////////
64
65 class ExtendedPlugInfoPlugNameSpecificData : public IBusData
66 {
67 public:
68     ExtendedPlugInfoPlugNameSpecificData();
69     virtual ~ExtendedPlugInfoPlugNameSpecificData();
70
71     virtual bool serialize( IOSSerialize& se );
72     virtual bool deserialize( IISDeserialize& de );
73     virtual ExtendedPlugInfoPlugNameSpecificData* clone() const;
74
75     std::string m_name;
76 };
77
78 /////////////////////////////////////////
79
80 class ExtendedPlugInfoPlugNumberOfChannelsSpecificData : public IBusData
81 {
82 public:
83     ExtendedPlugInfoPlugNumberOfChannelsSpecificData();
84     virtual ~ExtendedPlugInfoPlugNumberOfChannelsSpecificData();
85
86     virtual bool serialize( IOSSerialize& se );
87     virtual bool deserialize( IISDeserialize& de );
88     virtual ExtendedPlugInfoPlugNumberOfChannelsSpecificData* clone() const;
89
90     nr_of_channels_t m_nrOfChannels;
91 };
92
93
94 /////////////////////////////////////////
95
96 class ExtendedPlugInfoPlugChannelPositionSpecificData : public IBusData
97 {
98 public:
99     enum ELocation {
100         eEPI_LeftFront        = 0x01,
101         eEPI_RightFront       = 0x02,
102         eEPI_Center           = 0x03,
103         eEPI_Subwoofer        = 0x04,
104         eEPI_LeftSurround     = 0x05,
105         eEPI_RightSurround    = 0x06,
106         eEPI_LeftOfCenter     = 0x07,
107         eEPI_RightOfCenter    = 0x08,
108         eEPI_Surround         = 0x09,
109         eEPI_SideLeft         = 0x0a,
110         eEPI_SideRight        = 0x0b,
111         eEPI_Top              = 0x0c,
112         eEPI_Bottom           = 0x0d,
113         eEPI_LeftFrontEffect  = 0x0e,
114         eEPI_RightFrontEffect = 0x0f,
115         eEPI_NoPostion        = 0xff,
116     };
117
118     struct ChannelInfo {
119         stream_position_t          m_streamPosition;
120         stream_position_location_t m_location;
121     };
122
123     typedef std::vector<ChannelInfo> ChannelInfoVector;
124
125     struct ClusterInfo {
126         nr_of_channels_t         m_nrOfChannels;
127         ChannelInfoVector        m_channelInfos;
128     };
129
130     ExtendedPlugInfoPlugChannelPositionSpecificData();
131     virtual ~ExtendedPlugInfoPlugChannelPositionSpecificData();
132
133     virtual bool serialize( IOSSerialize& se );
134     virtual bool deserialize( IISDeserialize& de );
135     virtual ExtendedPlugInfoPlugChannelPositionSpecificData* clone() const;
136
137     typedef std::vector<ClusterInfo> ClusterInfoVector;
138
139     nr_of_clusters_t         m_nrOfClusters;
140     ClusterInfoVector        m_clusterInfos;
141 };
142
143 /////////////////////////////////////////
144
145 class ExtendedPlugInfoPlugChannelNameSpecificData : public IBusData
146 {
147 public:
148     ExtendedPlugInfoPlugChannelNameSpecificData();
149     virtual ~ExtendedPlugInfoPlugChannelNameSpecificData();
150
151     virtual bool serialize( IOSSerialize& se );
152     virtual bool deserialize( IISDeserialize& de );
153     virtual ExtendedPlugInfoPlugChannelNameSpecificData* clone() const;
154
155     stream_position_t m_streamPosition;
156     string_length_t   m_stringLength;
157     std::string       m_plugChannelName;
158 };
159
160 /////////////////////////////////////////
161
162 class ExtendedPlugInfoPlugInputSpecificData : public IBusData
163 {
164 public:
165     ExtendedPlugInfoPlugInputSpecificData();
166     ExtendedPlugInfoPlugInputSpecificData( const ExtendedPlugInfoPlugInputSpecificData& rhs );
167     virtual ~ExtendedPlugInfoPlugInputSpecificData();
168
169     virtual bool serialize( IOSSerialize& se );
170     virtual bool deserialize( IISDeserialize& de );
171     virtual ExtendedPlugInfoPlugInputSpecificData* clone() const;
172
173     PlugAddressSpecificData* m_plugAddress;
174 };
175
176
177 /////////////////////////////////////////
178
179 class ExtendedPlugInfoPlugOutputSpecificData : public IBusData
180 {
181 public:
182     ExtendedPlugInfoPlugOutputSpecificData();
183     ExtendedPlugInfoPlugOutputSpecificData( const ExtendedPlugInfoPlugOutputSpecificData& rhs );
184     virtual ~ExtendedPlugInfoPlugOutputSpecificData();
185
186     virtual bool serialize( IOSSerialize& se );
187     virtual bool deserialize( IISDeserialize& de );
188     virtual ExtendedPlugInfoPlugOutputSpecificData* clone() const;
189
190     number_of_output_plugs_t m_nrOfOutputPlugs;
191
192     typedef std::vector<PlugAddressSpecificData*> PlugAddressVector;
193     PlugAddressVector m_outputPlugAddresses;
194 };
195
196 /////////////////////////////////////////
197
198 class ExtendedPlugInfoClusterInfoSpecificData : public IBusData
199 {
200 public:
201     enum EPortType {
202         ePT_Speaker            = 0x00,
203         ePT_Headphone          = 0x01,
204         ePT_Microphone         = 0x02,
205         ePT_Line               = 0x03,
206         ePT_SPDIF              = 0x04,
207         ePT_ADAT               = 0x05,
208         ePT_TDIF               = 0x06,
209         ePT_MADI               = 0x07,
210         ePT_Analog             = 0x08,
211         ePT_Digital            = 0x09,
212         ePT_MIDI               = 0x0a,
213         ePT_NoType             = 0xff,
214     };
215
216     ExtendedPlugInfoClusterInfoSpecificData();
217     virtual ~ExtendedPlugInfoClusterInfoSpecificData();
218
219     virtual bool serialize( IOSSerialize& se );
220     virtual bool deserialize( IISDeserialize& de );
221     virtual ExtendedPlugInfoClusterInfoSpecificData* clone() const;
222
223     cluster_index_t m_clusterIndex;
224     port_type_t     m_portType;
225     string_length_t m_stringLength;
226     std::string     m_clusterName;
227 };
228
229 const char* extendedPlugInfoClusterInfoPortTypeToString( port_type_t portType );
230
231 /////////////////////////////////////////
232
233 #define AVC1394_EXTENDED_PLUG_INFO_INFO_TYPE_PLUG_TYPE                   0x00
234 #define AVC1394_EXTENDED_PLUG_INFO_INFO_TYPE_PLUG_NAME                   0x01
235 #define AVC1394_EXTENDED_PLUG_INFO_INFO_TYPE_PLUG_NO_OF_CHANNELS         0x02
236 #define AVC1394_EXTENDED_PLUG_INFO_INFO_TYPE_PLUG_CHANNEL_POSITION       0x03
237 #define AVC1394_EXTENDED_PLUG_INFO_INFO_TYPE_PLUG_CHANNEL_NAME           0x04
238 #define AVC1394_EXTENDED_PLUG_INFO_INFO_TYPE_PLUG_INPUT                  0x05
239 #define AVC1394_EXTENDED_PLUG_INFO_INFO_TYPE_PLUG_OUTPUT                 0x06
240 #define AVC1394_EXTENDED_PLUG_INFO_INFO_TYPE_PLUG_CLUSTER_INFO           0x07
241
242 class ExtendedPlugInfoInfoType : public IBusData
243 {
244 public:
245     enum EInfoType {
246         eIT_PlugType        = AVC1394_EXTENDED_PLUG_INFO_INFO_TYPE_PLUG_TYPE,
247         eIT_PlugName        = AVC1394_EXTENDED_PLUG_INFO_INFO_TYPE_PLUG_NAME,
248         eIT_NoOfChannels    = AVC1394_EXTENDED_PLUG_INFO_INFO_TYPE_PLUG_NO_OF_CHANNELS,
249         eIT_ChannelPosition = AVC1394_EXTENDED_PLUG_INFO_INFO_TYPE_PLUG_CHANNEL_POSITION,
250         eIT_ChannelName     = AVC1394_EXTENDED_PLUG_INFO_INFO_TYPE_PLUG_CHANNEL_NAME,
251         eIT_PlugInput       = AVC1394_EXTENDED_PLUG_INFO_INFO_TYPE_PLUG_INPUT,
252         eIT_PlugOutput      = AVC1394_EXTENDED_PLUG_INFO_INFO_TYPE_PLUG_OUTPUT,
253         eIT_ClusterInfo     = AVC1394_EXTENDED_PLUG_INFO_INFO_TYPE_PLUG_CLUSTER_INFO,
254     };
255
256     ExtendedPlugInfoInfoType(EInfoType eInfoType);
257     ExtendedPlugInfoInfoType( const ExtendedPlugInfoInfoType& rhs );
258     virtual ~ExtendedPlugInfoInfoType();
259
260     bool initialize();
261
262     virtual bool serialize( IOSSerialize& se );
263     virtual bool deserialize( IISDeserialize& de );
264     virtual ExtendedPlugInfoInfoType* clone() const;
265
266     info_type_t m_infoType;
267
268     ExtendedPlugInfoPlugTypeSpecificData*               m_plugType;
269     ExtendedPlugInfoPlugNameSpecificData*               m_plugName;
270     ExtendedPlugInfoPlugNumberOfChannelsSpecificData*   m_plugNrOfChns;
271     ExtendedPlugInfoPlugChannelPositionSpecificData*    m_plugChannelPosition;
272     ExtendedPlugInfoPlugChannelNameSpecificData*        m_plugChannelName;
273     ExtendedPlugInfoPlugInputSpecificData*              m_plugInput;
274     ExtendedPlugInfoPlugOutputSpecificData*             m_plugOutput;
275     ExtendedPlugInfoClusterInfoSpecificData*            m_plugClusterInfo;
276 };
277
278 const char* extendedPlugInfoInfoTypeToString( info_type_t infoType );
279
280 /////////////////////////////////////////////////////////
281
282 #define AVC1394_PLUG_INFO_SUBFUNCTION_EXTENDED_PLUG_INFO_CMD   0xC0
283 #define AVC1394_PLUG_INFO_SUBFUNCTION_SERIAL_BUS_NOT_USED      0xFF
284
285
286 class ExtendedPlugInfoCmd: public AVCCommand
287 {
288 public:
289     enum ESubFunction {
290         eSF_ExtendedPlugInfoCmd                  = AVC1394_PLUG_INFO_SUBFUNCTION_EXTENDED_PLUG_INFO_CMD,
291         eSF_NotUsed                              = AVC1394_PLUG_INFO_SUBFUNCTION_SERIAL_BUS_NOT_USED,
292     };
293
294     ExtendedPlugInfoCmd( Ieee1394Service& ieee1394service,
295                          ESubFunction eSubFunction = eSF_ExtendedPlugInfoCmd );
296     ExtendedPlugInfoCmd( const ExtendedPlugInfoCmd& rhs );
297     virtual ~ExtendedPlugInfoCmd();
298
299     virtual bool serialize( IOSSerialize& se );
300     virtual bool deserialize( IISDeserialize& de );
301
302     bool setPlugAddress( const PlugAddress& plugAddress );
303     bool setSubFunction( ESubFunction subFunction );
304     subfunction_t getSubFunction( ) {return m_subFunction;};
305     bool setInfoType( const ExtendedPlugInfoInfoType& infoType );
306     ExtendedPlugInfoInfoType* getInfoType()
307     { return m_infoType; }
308
309     virtual const char* getCmdName() const
310     { return "ExtendedPlugInfoCmd"; }
311
312 protected:
313     subfunction_t             m_subFunction;
314     PlugAddress*              m_plugAddress;
315     ExtendedPlugInfoInfoType* m_infoType;
316 };
317
318
319 #endif
Note: See TracBrowser for help on using the browser.