root/trunk/libfreebob/src/bebob/bebob_avplug_xml.cpp

Revision 241, 9.3 kB (checked in by pieterpalmers, 17 years ago)

* configure.ac: Version bump to 1.0.0

* Changed all FreeBob? to FreeBoB
* Removed all .cvsignore
* Added Pieter to AUTHORS
* Updated NEWS and README (release canditate date added)

by Daniel Wagner

Line 
1 /* bebob_avplug_xml.cpp
2  * Copyright (C) 2006 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 // AvPlug XML stuff
22
23 #include "bebob/bebob_avplug.h"
24
25 #include "libfreebobavc/ieee1394service.h"
26
27 namespace BeBoB {
28
29 bool
30 AvPlug::addXmlDescription( xmlNodePtr connectionSet )
31 {
32     char* result;
33
34     int direction;
35     switch ( m_direction ) {
36         case 0:
37             direction = FREEBOB_PLAYBACK;
38             break;
39         case 1:
40             direction = FREEBOB_CAPTURE;
41             break;
42     default:
43         debugError( "plug direction invalid (%d)\n",
44                     m_direction );
45         return false;
46     }
47
48     asprintf( &result, "%d",  direction );
49     if ( !xmlNewChild( connectionSet,
50                        0,
51                        BAD_CAST "Direction",
52                        BAD_CAST result ) )
53     {
54         debugError( "Couldn't create 'Direction' node\n" );
55         free( result );
56         return false;
57     }
58     free( result );
59
60     xmlNodePtr connection = xmlNewChild( connectionSet, 0,
61                                          BAD_CAST "Connection", 0 );
62     if ( !connection ) {
63         debugError( "Couldn't create 'Connection' node for "
64                     "direction %d\n", m_direction );
65         return false;
66     }
67
68     /*
69     asprintf( &result, "%08x%08x",
70               ( quadlet_t )( m_configRom->getGuid() >> 32 ),
71               ( quadlet_t )( m_configRom->getGuid() & 0xfffffff ) );
72     if ( !xmlNewChild( connection,  0,
73                        BAD_CAST "GUID",  BAD_CAST result ) ) {
74         debugError( "Couldn't create 'GUID' node\n" );
75         return false;
76     }
77     */
78
79     asprintf( &result, "%d", m_1394Service->getPort() );
80     if ( !xmlNewChild( connection,  0,
81                        BAD_CAST "Port",  BAD_CAST result ) ) {
82         debugError( "Couldn't create 'Port' node\n" );
83         free( result );
84         return false;
85     }
86     free( result );
87
88     asprintf( &result, "%d",  m_nodeId);
89     if ( !xmlNewChild( connection,  0,
90                        BAD_CAST "Node",  BAD_CAST result ) ) {
91         debugError( "Couldn't create 'Node' node\n" );
92         free( result );
93         return false;
94     }
95     free( result );
96
97
98     asprintf( &result, "%d",  m_nrOfChannels );
99     if ( !xmlNewChild( connection,  0,
100                        BAD_CAST "Dimension",  BAD_CAST result ) ) {
101         debugError( "Couldn't create 'Dimension' node\n" );
102         free( result );
103         return false;
104     }
105     free( result );
106
107     asprintf( &result, "%d",  getSampleRate() );
108     if ( !xmlNewChild( connection,  0,
109                        BAD_CAST "Samplerate",  BAD_CAST result ) ) {
110         debugError( "Couldn't create 'Samplerate' node\n" );
111         free( result );
112         return false;
113     }
114     free( result );
115
116     if ( !xmlNewChild( connection,  0,
117                        BAD_CAST "IsoChannel", BAD_CAST "-1" ) )
118     {
119         debugError( "Couldn't create 'IsoChannel' node\n" );
120         return false;
121     }
122
123     xmlNodePtr streams = xmlNewChild( connection,  0,
124                                       BAD_CAST "Streams",  0 );
125     if ( !streams ) {
126         debugError( "Couldn't create 'Streams' node for "
127                     "direction %d\n", m_direction );
128         return false;
129     }
130
131     for ( AvPlug::ClusterInfoVector::const_iterator it = m_clusterInfos.begin();
132           it != m_clusterInfos.end();
133           ++it )
134     {
135         const AvPlug::ClusterInfo* clusterInfo = &( *it );
136
137         AvPlug::ChannelInfoVector channelInfos = clusterInfo->m_channelInfos;
138         for ( AvPlug::ChannelInfoVector::const_iterator it = channelInfos.begin();
139               it != channelInfos.end();
140               ++it )
141         {
142             const AvPlug::ChannelInfo* channelInfo = &( *it );
143
144             xmlNodePtr stream = xmlNewChild( streams,  0,
145                                              BAD_CAST "Stream",  0 );
146             if ( !stream ) {
147                 debugError( "Coulnd't create 'Stream' node" );
148                 return false;
149             }
150
151             // \todo: iec61883 backend expects indexing starting from 0
152             // but bebob reports it starting from 1. Decide where
153             // and how to handle this
154             asprintf( &result, "%d", channelInfo->m_streamPosition - 1 );
155             if ( !xmlNewChild( stream,  0,
156                                BAD_CAST "Position",  BAD_CAST result ) )
157             {
158                 debugError( "Couldn't create 'Position' node" );
159                 free( result );
160                 return false;
161             }
162             free( result );
163
164             asprintf( &result, "%d", channelInfo->m_location );
165             if ( !xmlNewChild( stream,  0,
166                                BAD_CAST "Location",  BAD_CAST result ) )
167             {
168                 debugError( "Couldn't create 'Location' node" );
169                 free( result );
170                 return false;
171             }
172             free( result );
173
174             asprintf( &result, "%d", clusterInfo->m_streamFormat );
175             if ( !xmlNewChild( stream,  0,
176                                BAD_CAST "Format",  BAD_CAST result ) )
177             {
178                 debugError( "Couldn't create 'Format' node" );
179                 free( result );
180                 return false;
181             }
182             free( result );
183
184             asprintf( &result, "%d", clusterInfo->m_portType );
185             if ( !xmlNewChild( stream,  0,
186                                BAD_CAST "Type",  BAD_CAST result ) )
187             {
188                 debugError( "Couldn't create 'Type' node" );
189                 free( result );
190                 return false;
191             }
192             free( result );
193
194
195             // \todo XXX: What do to do with DestinationPort value??
196             asprintf( &result, "%d", 0 );
197             if ( !xmlNewChild( stream,  0,
198                                BAD_CAST "DestinationPort",  BAD_CAST result ) )
199             {
200                 debugError( "Couldn't create 'DestinationPort' node" );
201                 free( result );
202                 return false;
203             }
204             free( result );
205
206             if ( !xmlNewChild( stream,  0,
207                                BAD_CAST "Name",
208                                BAD_CAST channelInfo->m_name.c_str() ) )
209             {
210                 debugError( "Couldn't create 'Name' node" );
211                 return false;
212             }
213         }
214     }
215
216     return true;
217 }
218
219
220 bool
221 AvPlug::addXmlDescriptionStreamFormats( xmlNodePtr streamFormatNode )
222 {
223     int direction;
224     switch ( m_direction ) {
225         case 0:
226             direction = FREEBOB_PLAYBACK;
227             break;
228         case 1:
229             direction = FREEBOB_CAPTURE;
230             break;
231     default:
232         debugError( "addXmlDescriptionStreamFormats: plug direction invalid (%d)\n",
233                     m_direction );
234         return false;
235     }
236
237     char* result;
238     asprintf( &result, "%d",  direction );
239     if ( !xmlNewChild( streamFormatNode,
240                        0,
241                        BAD_CAST "Direction",
242                        BAD_CAST result ) )
243     {
244         debugError( "addXmlDescriptionStreamFormats: Could not  create 'Direction' node\n" );
245         free( result );
246         return false;
247     }
248     free( result );
249
250
251     for ( FormatInfoVector::iterator it =
252               m_formatInfos.begin();
253           it != m_formatInfos.end();
254           ++it )
255     {
256         AvPlug::FormatInfo formatInfo = *it;
257         xmlNodePtr formatNode = xmlNewChild( streamFormatNode, 0,
258                                              BAD_CAST "Format", 0 );
259         if ( !formatNode ) {
260             debugError( "addXmlDescriptionStreamFormats: Could not create 'Format' node\n" );
261             return false;
262         }
263
264         asprintf( &result, "%d",
265                   convertESamplingFrequency( static_cast<ESamplingFrequency>( formatInfo.m_samplingFrequency ) ) );
266         if ( !xmlNewChild( formatNode,  0,
267                            BAD_CAST "Samplerate",  BAD_CAST result ) )
268         {
269             debugError( "Couldn't create 'Samplerate' node\n" );
270             free( result );
271             return false;
272         }
273         free( result );
274
275         asprintf( &result, "%d",  formatInfo.m_audioChannels );
276         if ( !xmlNewChild( formatNode,  0,
277                            BAD_CAST "AudioChannels",  BAD_CAST result ) )
278         {
279             debugError( "Couldn't create 'AudioChannels' node\n" );
280             free( result );
281             return false;
282         }
283         free( result );
284
285         asprintf( &result, "%d",  formatInfo.m_midiChannels );
286         if ( !xmlNewChild( formatNode,  0,
287                            BAD_CAST "MidiChannels",  BAD_CAST result ) )
288         {
289             debugError( "Couldn't create 'MidiChannels' node\n" );
290             free( result );
291             return false;
292         }
293     }
294
295     return true;
296 }
297
298 }
Note: See TracBrowser for help on using the browser.