root/trunk/freebob/src/avdevice.cpp

Revision 42, 17.0 kB (checked in by wagi, 19 years ago)

Register/unregister AvDevice? in AvDevicePool? when detected/disappeared.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1 /* avdevice.cpp
2  * Copyright (C) 2004 by Daniel Wagner, Pieter Palmers
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 #include <errno.h>
21 #include <libavc1394/avc1394.h>
22 #include <libavc1394/avc1394_vcr.h>
23 #include "debugmodule.h"
24 #include "avdevice.h"
25 #include "avdevicesubunit.h"
26 #include "avdeviceaudiosubunit.h"
27 #include "avdevicemusicsubunit.h"
28
29 AvDevice::AvDevice(octlet_t oGuid)
30 {
31     m_oGuid = oGuid;
32 }
33
34 FBReturnCodes
35 AvDevice::initialize() {
36     if (!m_bInitialised) {
37         m_handle = raw1394_new_handle();
38         if ( !m_handle ) {
39             if ( !errno ) {
40                 debugPrint(DEBUG_LEVEL_DEVICE,  "libraw1394 not compatible.\n" );
41             } else {
42                 perror ("Could not get 1394 handle");
43                 debugPrint(DEBUG_LEVEL_DEVICE, "Is ieee1394 and raw1394 driver loaded?\n");
44             }
45             return eFBRC_Creating1394HandleFailed;
46         }
47
48         raw1394_set_userdata( m_handle, this );
49
50         if ( raw1394_set_port( m_handle,  m_iPort ) < 0 ) {
51             perror( "Could not set port" );
52             return eFBRC_Setting1394PortFailed;
53         }
54    }
55
56    // enumerate the subunits present in this device, create an AvDeviceSubunit for them, and add this object to the cSubUnits vector
57         unsigned char table_entry;
58         unsigned char subunit_maxid;
59         unsigned char subunit_type;
60         quadlet_t table_entries; // buffer these table entries, because the memory content pointed to by
61                                  // the response pointer can change due to other libraw operations on this handle
62
63         quadlet_t request[6];
64         quadlet_t *response;
65         AvDeviceSubunit *tmpAvDeviceSubunit=NULL;
66
67         // check the number of I/O plugs
68
69         request[0] = AVC1394_CTYPE_STATUS | AVC1394_SUBUNIT_TYPE_UNIT | AVC1394_SUBUNIT_ID_IGNORE
70                                         | AVC1394_COMMAND_PLUG_INFO | 0x00;
71         request[1] = 0xFFFFFFFF;
72         response = avcExecuteTransaction(request, 2, 2);
73         if (response != NULL) {
74                 iNbIsoDestinationPlugs= (unsigned char) ((response[1]>>24) & 0xff);
75                 iNbIsoSourcePlugs= (unsigned char) ((response[1]>>16) & 0xff);
76                 iNbExtDestinationPlugs= (unsigned char) ((response[1]>>8) & 0xff);
77                 iNbExtSourcePlugs= (unsigned char) ((response[1]>>0) & 0xff);
78         }
79         request[0] = AVC1394_CTYPE_STATUS | AVC1394_SUBUNIT_TYPE_UNIT | AVC1394_SUBUNIT_ID_IGNORE
80                                         | AVC1394_COMMAND_PLUG_INFO | 0x01;
81         request[1] = 0xFFFFFFFF;
82         response = avcExecuteTransaction(request, 2, 2);
83         if (response != NULL) {
84                 iNbAsyncDestinationPlugs= (unsigned char) ((response[1]>>24) & 0xff);
85                 iNbAsyncSourcePlugs= (unsigned char) ((response[1]>>16) & 0xff);
86         }
87
88         debugPrint (DEBUG_LEVEL_DEVICE,"AvDevice: %d Isochronous source plugs, %d Isochronous destination plugs\n",iNbIsoSourcePlugs,iNbIsoDestinationPlugs);
89         debugPrint (DEBUG_LEVEL_DEVICE,"AvDevice: %d External source plugs, %d External destination plugs\n",iNbExtSourcePlugs,iNbExtDestinationPlugs);
90         debugPrint (DEBUG_LEVEL_DEVICE,"AvDevice: %d Asynchronous source plugs, %d Asynchronous destination plugs\n",iNbAsyncSourcePlugs,iNbAsyncDestinationPlugs);
91
92         // create the subunits
93         for (unsigned int i=0;i<8;i++) { // cycle through the 8 pages (max 32 subunits; 4 subunits/page)
94                 request[0] = AVC1394_CTYPE_STATUS | AVC1394_SUBUNIT_TYPE_UNIT | AVC1394_SUBUNIT_ID_IGNORE
95                                 | AVC1394_COMMAND_SUBUNIT_INFO | ((i<<4) & 0xF0) | 0x07;
96                 request[1] = 0xFFFFFFFF;
97                 response = avcExecuteTransaction(request, 6, 2);
98
99                 table_entries=response[1];
100
101                 if (response != NULL) {
102                         // this way of processing the table entries assumes that the subunit type is not "extended"
103
104                         // stop processing when a "not implemented" is received (according to spec)
105                         if((response[0]&0xFF000000) == AVC1394_RESPONSE_NOT_IMPLEMENTED) break;
106
107                         // warning: don't do unsigned int j! comparison >= 0 is always true for uint
108                         for (int j=3;j>=0;j--) { // cycle through the 8 pages (max 32 subunits; 4 subunits/page)
109                                 table_entry=(table_entries >> (j*8)) & 0xFF;
110                                 subunit_maxid=table_entry& 0x07;
111                                 subunit_type=(table_entry >> 3) & 0x1F;
112                                 //debugPrint (DEBUG_LEVEL_DEVICE,"AvDevice: Page %d, item %d: Table entry=0x%02X, subunit_maxid=0x%02X, subunit_type=0x%02X\n",i,j,table_entry,subunit_maxid,subunit_type);
113
114                                 // according to spec we could stop processing
115                                 // at the first 0xFF entry, but doing it this way
116                                 // is a little more robust
117                                 if (table_entry != 0xFF) {
118                                         for (unsigned char subunit_id=0;subunit_id<subunit_maxid+1;subunit_id++) {
119
120                                                 // only two types of specific subunits are supported: audio and music
121                                                 switch (subunit_type) {
122                                                         case 0x01: // audio subunit
123                                                                 tmpAvDeviceSubunit=new AvDeviceAudioSubunit(this,subunit_id);
124                                                                 if (tmpAvDeviceSubunit) { // test code
125                                                                         //tmpAvDeviceSubunit->printOutputPlugConnections();
126                                                                 }
127                                                         break;
128                                                         case 0x0C: // music subunit
129                                                                 tmpAvDeviceSubunit=new AvDeviceMusicSubunit(this,subunit_id);
130                                                                 /*{ // just a test
131                                                                 AvDeviceMusicSubunit tmpAvDeviceSubunit2(this,subunit_id);
132                                                                 tmpAvDeviceSubunit2.printMusicPlugInfo();
133                                                                 tmpAvDeviceSubunit2.printMusicPlugConfigurations();
134                                                                 tmpAvDeviceSubunit2.printOutputPlugConnections();
135                                                                 tmpAvDeviceSubunit2.test();
136                                                                 }*/
137                                                         break;
138
139                                                         default: // generic
140                                                                 tmpAvDeviceSubunit=new AvDeviceSubunit(this,subunit_type,subunit_id);
141                                                         break;
142                                                 }
143
144                                                 if(tmpAvDeviceSubunit && tmpAvDeviceSubunit->isValid()) {
145                                                         cSubUnits.push_back(tmpAvDeviceSubunit);
146                                                         //setDebugLevel(DEBUG_LEVEL_ALL);
147                                                         debugPrint (DEBUG_LEVEL_DEVICE, "Trying to reserve the subunit...\n");
148                                                         tmpAvDeviceSubunit->reserve(0x01);
149                                                         debugPrint (DEBUG_LEVEL_DEVICE, "  isReserved?: %d\n",tmpAvDeviceSubunit->isReserved());
150                                                         tmpAvDeviceSubunit->unReserve();
151                                                         //setDebugLevel(DEBUG_LEVEL_MODERATE);
152
153
154                                                 } else {
155                                                         if (tmpAvDeviceSubunit) {
156                                                                 debugPrint (DEBUG_LEVEL_DEVICE,"AvDevice: Unsupported AvDeviceSubunit encountered. Page %d, item %d: Table entry=0x%02X, subunit_maxid=0x%02X, subunit_type=0x%02X, subunit_id=%0x02X\n",i,j,table_entry,subunit_maxid,subunit_type,subunit_id);
157
158                                                                 delete tmpAvDeviceSubunit;
159                                                         } else {
160                                                                 debugPrint (DEBUG_LEVEL_DEVICE,"AvDevice: Could not create AvDeviceSubunit object.\n");
161                                                         }
162                                                 }
163                                         }
164                                 }
165                         }
166                 }
167         }
168
169    m_bInitialised = true;
170    return eFBRC_Success;
171
172 }
173
174 bool AvDevice::isInitialised() {
175         return m_bInitialised;
176 }
177
178 AvDevice::~AvDevice()
179 {
180
181         vector<AvDeviceSubunit *>::iterator it;
182         for( it = cSubUnits.begin(); it != cSubUnits.end(); it++ ) {
183                 delete *it;
184         }
185
186     if ( m_handle ) {
187         raw1394_destroy_handle( m_handle );
188         m_handle = 0;
189     }
190 }
191
192 /* Function to execute an AVC transaction, i.e. send command/status and get response
193  * main purpose is wrapping the avc1394 function call to output some debugging comments.
194  */
195 quadlet_t * AvDevice::avcExecuteTransaction(quadlet_t *request, unsigned int request_len, unsigned int response_len) {
196         quadlet_t *response;
197         unsigned char *request_pos;
198         unsigned int i;
199         response = avc1394_transaction_block(m_handle, m_iNodeId, request, request_len, 2);
200         if (request != NULL) {
201                 debugPrint (DEBUG_LEVEL_TRANSFERS, "------- TRANSACTION START -------\n");
202                 debugPrint (DEBUG_LEVEL_TRANSFERS,"  REQUEST:     ");
203                 /* request is in machine byte order. this function is for intel architecure */
204                 for (i=0;i<request_len;i++) {
205                         request_pos=(unsigned char *)(request+i);
206                         debugPrintShort (DEBUG_LEVEL_TRANSFERS, "0x%02X%02X%02X%02X ", *(request_pos),*(request_pos+1),*(request_pos+2),*(request_pos+3));
207                 }
208                 debugPrintShort (DEBUG_LEVEL_TRANSFERS,"\n");
209                 debugPrint (DEBUG_LEVEL_TRANSFERS,"      => ");
210                 debugPrintShort (DEBUG_LEVEL_TRANSFERS,"                     ");
211                 request_pos=(unsigned char *)(request);
212                 debugPrintShort (DEBUG_LEVEL_TRANSFERS, "subunit_type=%02X  subunit_id=%02X  opcode=%02X",((*(request_pos+1))>>3)&0x1F,(*(request_pos+1))&0x07,(*(request_pos+2))&0xFF);
213                 debugPrintShort (DEBUG_LEVEL_TRANSFERS,"\n");
214         }
215         if (response != NULL) {
216                 /* response is in order of receiving, i.e. msb first */
217                 debugPrint (DEBUG_LEVEL_TRANSFERS,"  -> RESPONSE: ");
218                 for (i=0;i<response_len;i++) {
219                         debugPrintShort (DEBUG_LEVEL_TRANSFERS, "0x%08X ", response[i]);
220                 }
221                 debugPrintShort (DEBUG_LEVEL_TRANSFERS,"\n");
222                 debugPrint (DEBUG_LEVEL_TRANSFERS,"      => ");
223                 switch (response[0]&0xFF000000) {
224                         case AVC1394_RESPONSE_NOT_IMPLEMENTED:
225                                 debugPrintShort (DEBUG_LEVEL_TRANSFERS,"Not Implemented      ");
226                         break;
227                         case AVC1394_RESPONSE_ACCEPTED:
228                                 debugPrintShort (DEBUG_LEVEL_TRANSFERS,"Accepted             ");
229                         break;
230                         case AVC1394_RESPONSE_REJECTED:
231                                 debugPrintShort (DEBUG_LEVEL_TRANSFERS,"Rejected             ");
232                         break;
233                         case AVC1394_RESPONSE_IN_TRANSITION:
234                                 debugPrintShort (DEBUG_LEVEL_TRANSFERS,"In Transition        ");
235                         break;
236                         case AVC1394_RESPONSE_IMPLEMENTED:
237                                 debugPrintShort (DEBUG_LEVEL_TRANSFERS,"Implemented / Stable ");
238                         break;
239                         case AVC1394_RESPONSE_CHANGED:
240                                 debugPrintShort (DEBUG_LEVEL_TRANSFERS,"Changed              ");
241                         break;
242                         case AVC1394_RESPONSE_INTERIM:
243                                 debugPrintShort (DEBUG_LEVEL_TRANSFERS,"Interim              ");
244                         break;
245                         default:
246                                 debugPrintShort (DEBUG_LEVEL_TRANSFERS,"Unknown response     ");
247                         break;
248                 }
249                 debugPrintShort (DEBUG_LEVEL_TRANSFERS, "subunit_type=%02X  subunit_id=%02X  opcode=%02X",(response[0]>>19)&0x1F,(response[0]>>16)&0x07,(response[0]>>8)&0xFF);
250                 debugPrintShort (DEBUG_LEVEL_TRANSFERS,"\n");
251         }
252         debugPrint (DEBUG_LEVEL_TRANSFERS, "------- TRANSACTION END -------\n");
253         return response;
254
255 }
256
257 FBReturnCodes AvDevice::setInputPlugSignalFormat(unsigned char plug, unsigned char fmt, quadlet_t fdf) {
258         quadlet_t request[6];
259         quadlet_t *response;
260
261         request[0] = AVC1394_CTYPE_CONTROL | AVC1394_SUBUNIT_TYPE_UNIT | AVC1394_SUBUNIT_ID_IGNORE
262                                         | AVC1394_COMMAND_INPUT_PLUG_SIGNAL_FORMAT | plug;
263         request[1] = (0x80000000) | ((fmt & 0x3F)<<24) | (fdf & 0x00FFFFFF);
264         response = avcExecuteTransaction(request, 2, 2);
265         if (response != NULL) {
266
267         }
268         return eFBRC_Success;
269 }
270
271 FBReturnCodes AvDevice::getInputPlugSignalFormat(unsigned char plug, unsigned char *fmt, quadlet_t *fdf) {
272         quadlet_t request[6];
273         quadlet_t *response;
274
275         request[0] = AVC1394_CTYPE_STATUS | AVC1394_SUBUNIT_TYPE_UNIT | AVC1394_SUBUNIT_ID_IGNORE
276                                         | AVC1394_COMMAND_INPUT_PLUG_SIGNAL_FORMAT | plug;
277         request[1] = 0xFFFFFFFF;
278         response = avcExecuteTransaction(request, 2, 2);
279         if (response != NULL) {
280                 *fmt=((response[1] >> 24) & 0x3F);
281                 *fdf=response[1]& 0x00FFFFFF;
282         }
283         return eFBRC_Success;
284 }
285
286 FBReturnCodes AvDevice::setOutputPlugSignalFormat(unsigned char plug, unsigned char fmt, quadlet_t fdf) {
287         quadlet_t request[6];
288         quadlet_t *response;
289
290         request[0] = AVC1394_CTYPE_CONTROL | AVC1394_SUBUNIT_TYPE_UNIT | AVC1394_SUBUNIT_ID_IGNORE
291                                         | AVC1394_COMMAND_OUTPUT_PLUG_SIGNAL_FORMAT | plug;
292         request[1] = (0x80000000) | ((fmt & 0x3F)<<24) | (fdf & 0x00FFFFFF);
293         response = avcExecuteTransaction(request, 2, 2);
294         if (response != NULL) {
295
296         }
297         return eFBRC_Success;
298 }
299
300 FBReturnCodes AvDevice::getOutputPlugSignalFormat(unsigned char plug, unsigned char *fmt, quadlet_t *fdf) {
301         quadlet_t request[6];
302         quadlet_t *response;
303
304         request[0] = AVC1394_CTYPE_STATUS | AVC1394_SUBUNIT_TYPE_UNIT | AVC1394_SUBUNIT_ID_IGNORE
305                                         | AVC1394_COMMAND_OUTPUT_PLUG_SIGNAL_FORMAT | plug;
306         request[1] = 0xFFFFFFFF;
307         response = avcExecuteTransaction(request, 2, 2);
308         if (response != NULL) {
309                 *fmt=((response[1] >> 24) & 0x3F);
310                 *fdf=response[1]& 0x00FFFFFF;
311         }
312         return eFBRC_Success;
313 }
314
315 AvDeviceSubunit *AvDevice::getSubunit(unsigned char type, unsigned char id) {
316         vector<AvDeviceSubunit *>::iterator it;
317         for( it = cSubUnits.begin(); it != cSubUnits.end(); it++ ) {
318                 if ((*it) && ((*it)->getType()==type) && ((*it)->getId()==id)) {
319                         return *it;
320                 }
321         }
322         return NULL;
323
324 }
325
326 #define AVC1394_COMMAND_SIGNAL_SOURCE 0x00001A00
327
328 void AvDevice::printConnections() {
329         quadlet_t request[6];
330         quadlet_t *response;
331                         //setDebugLevel(DEBUG_LEVEL_ALL);
332
333         debugPrint (DEBUG_LEVEL_DEVICE,"AvDevice: ISO source connections:\n");
334
335         for (unsigned int i=0;i<getNbIsoSourcePlugs();i++) {
336                 request[0] = AVC1394_CTYPE_STATUS | AVC1394_SUBUNIT_TYPE_UNIT | AVC1394_SUBUNIT_ID_IGNORE
337                                                 | AVC1394_COMMAND_SIGNAL_SOURCE | 0xFF;
338                 request[1]=0xFFFEFF00 | ((i & 0xFF));
339
340                 response = avcExecuteTransaction(request, 2, 2);
341
342                 if (response != NULL) {
343                         unsigned char output_status=(response[0]&0xE0) >> 5;
344                         unsigned char conv=(response[0]&0x10) >> 4;
345                         unsigned char signal_status=(response[0]&0x0F);
346
347                         unsigned int signal_source=((response[1]>>16)&0xFFFF);
348
349                         unsigned char source_subunit_type=(signal_source>>11)&0x1F;
350                         unsigned char source_subunit_id=(signal_source>>8)&0x07;
351                         unsigned char source_plug=signal_source&0xFF;
352
353                         debugPrint (DEBUG_LEVEL_DEVICE,"AvDevice:   OPCR 0x%02X <- subunit: 0x%02X/0x%02X, plug: 0x%02X (0x%02X / %d / 0x%02X)\n",i, source_subunit_type,source_subunit_id,source_plug,output_status,conv,signal_status);
354                         // find the subunit this plug is connected to
355                         AvDeviceSubunit *tmpSubunit=getSubunit(source_subunit_type,source_subunit_id);
356                         if(tmpSubunit) {
357                                 tmpSubunit->printSourcePlugConnections(source_plug);
358                         }
359
360                 }
361         }
362
363         debugPrint (DEBUG_LEVEL_DEVICE,"AvDevice: External source connections:\n");
364
365         for (unsigned int i=0;i<getNbExtSourcePlugs();i++) {
366                 request[0] = AVC1394_CTYPE_STATUS | AVC1394_SUBUNIT_TYPE_UNIT | AVC1394_SUBUNIT_ID_IGNORE
367                                                 | AVC1394_COMMAND_SIGNAL_SOURCE | 0xFF;
368                 request[1]=0xFFFEFF00 | ((i & 0xFF)|0x80);
369
370                 response = avcExecuteTransaction(request, 2, 2);
371
372                 if (response != NULL) {
373                         unsigned char output_status=(response[0]&0xE0) >> 5;
374                         unsigned char conv=(response[0]&0x10) >> 4;
375                         unsigned char signal_status=(response[0]&0x0F);
376
377                         unsigned int signal_source=((response[1]>>16)&0xFFFF);
378
379                         unsigned char source_subunit_type=(signal_source>>11)&0x1F;
380                         unsigned char source_subunit_id=(signal_source>>8)&0x07;
381                         unsigned char source_plug=signal_source&0xFF;
382
383                         debugPrint (DEBUG_LEVEL_DEVICE,"AvDevice:   EXTOUT 0x%02X <- subunit: 0x%02X/0x%02X, plug: 0x%02X (0x%02X / %d / 0x%02X)\n",i, source_subunit_type,source_subunit_id,source_plug,output_status,conv,signal_status);
384
385                         // find the subunit this plug is connected to
386                         AvDeviceSubunit *tmpSubunit=getSubunit(source_subunit_type,source_subunit_id);
387                         if(tmpSubunit) {
388                                 tmpSubunit->printSourcePlugConnections(source_plug);
389                         }
390                 }
391         }
392
393         debugPrint (DEBUG_LEVEL_DEVICE,"AvDevice: ISO sink connections:\n");
394
395         for (unsigned int i=0;i<getNbIsoDestinationPlugs();i++) {
396                 request[0] = AVC1394_CTYPE_STATUS | AVC1394_SUBUNIT_TYPE_UNIT | AVC1394_SUBUNIT_ID_IGNORE
397                                                 | AVC1394_COMMAND_SIGNAL_SOURCE | 0xFF;
398                 request[1]=0xFFFEFF00 | ((i & 0xFF));
399
400                 response = avcExecuteTransaction(request, 2, 2);
401
402                 if (response != NULL) {
403                         unsigned char output_status=(response[0]&0xE0) >> 5;
404                         unsigned char conv=(response[0]&0x10) >> 4;
405                         unsigned char signal_status=(response[0]&0x0F);
406
407                         unsigned int signal_source=((response[1]>>16)&0xFFFF);
408
409                         unsigned char source_subunit_type=(signal_source>>11)&0x1F;
410                         unsigned char source_subunit_id=(signal_source>>8)&0x07;
411                         unsigned char source_plug=signal_source&0xFF;
412
413                         debugPrint (DEBUG_LEVEL_DEVICE,"AvDevice:   OPCR 0x%02X <- subunit: 0x%02X/0x%02X, plug: 0x%02X (0x%02X / %d / 0x%02X)\n",i, source_subunit_type,source_subunit_id,source_plug,output_status,conv,signal_status);
414                         // find the subunit this plug is connected to
415                         AvDeviceSubunit *tmpSubunit=getSubunit(source_subunit_type,source_subunit_id);
416                         if(tmpSubunit) {
417                                 //tmpSubunit->printDestinationPlugConnections(source_plug);
418                         }
419
420                 }
421         }
422
423         debugPrint (DEBUG_LEVEL_DEVICE,"AvDevice: External sink connections:\n");
424
425         for (unsigned int i=0;i<getNbExtDestinationPlugs();i++) {
426                 request[0] = AVC1394_CTYPE_STATUS | AVC1394_SUBUNIT_TYPE_UNIT | AVC1394_SUBUNIT_ID_IGNORE
427                                                 | AVC1394_COMMAND_SIGNAL_SOURCE | 0xFF;
428                 request[1]=0xFFFEFF00 | ((i & 0xFF)|0x80);
429
430                 response = avcExecuteTransaction(request, 2, 2);
431
432                 if (response != NULL) {
433                         unsigned char output_status=(response[0]&0xE0) >> 5;
434                         unsigned char conv=(response[0]&0x10) >> 4;
435                         unsigned char signal_status=(response[0]&0x0F);
436
437                         unsigned int signal_source=((response[1]>>16)&0xFFFF);
438
439                         unsigned char source_subunit_type=(signal_source>>11)&0x1F;
440                         unsigned char source_subunit_id=(signal_source>>8)&0x07;
441                         unsigned char source_plug=signal_source&0xFF;
442
443                         debugPrint (DEBUG_LEVEL_DEVICE,"AvDevice:   EXTOUT 0x%02X <- subunit: 0x%02X/0x%02X, plug: 0x%02X (0x%02X / %d / 0x%02X)\n",i, source_subunit_type,source_subunit_id,source_plug,output_status,conv,signal_status);
444
445                         // find the subunit this plug is connected to
446                         AvDeviceSubunit *tmpSubunit=getSubunit(source_subunit_type,source_subunit_id);
447                         if(tmpSubunit) {
448                                 //tmpSubunit->printDestinationPlugConnections(source_plug);
449                         }
450                 }
451         }
452
453 }
Note: See TracBrowser for help on using the browser.