[server] / trunk / server / src / ipmdevice.cxx Repository:
ViewVC logotype

Annotation of /trunk/server/src/ipmdevice.cxx

Parent Directory Parent Directory | Revision Log Revision Log


Revision 142 - (view) (download)

1 : jtarlton 41 /*
2 :     * This file is part of the Dialogic Woomera Server project.
3 :     *
4 :     *
5 :     * Copyright (C) 2009 Dialogic Corporation
6 :     * All Rights Reserved
7 :     *
8 :     */
9 :    
10 :     /*!
11 : jtarlton 45 * \file ipmdevice.cxx
12 : jtarlton 59 * \brief Dialogic IPM device
13 : jtarlton 41 * \author Antony Martin <antony.martin@dialogic.com>
14 : jtarlton 87 * \version 2-APR-2009
15 : jtarlton 41 */
16 :    
17 : jtarlton 87 /*------------------------------ Dependencies --------------------------------*/
18 : jtarlton 41
19 :     #include "logger.h"
20 :     #include "ipmdevice.h"
21 :    
22 : jtarlton 87 /*----------------------------------------------------------------------------*/
23 : jtarlton 41
24 :     /*
25 :     * ctor
26 :     */
27 : jtarlton 87 IpmDevice::IpmDevice( const std::string& name,
28 :     DialogicChannelManager& channelMgr )
29 :     : DialogicDevice(name, channelMgr)
30 : jtarlton 41 {
31 : jtarlton 103 memset(&localMediaInfo_, 0, sizeof(IPM_MEDIA_INFO));
32 : jtarlton 41
33 :     /* Number of steps in the initialisation sequence, decremented by event
34 :     * handlers. When zero state is changed to IDLE.
35 : jtarlton 64 *
36 :     * IPMEV_OPEN,
37 :     * DMEV_GET_RX_PORT_INFO,
38 :     * DMEV_GET_TX_PORT_INFO
39 : jtarlton 41 */
40 :     initStepsRemaining_ = 3;
41 :     }
42 :    
43 :    
44 :     /*
45 :     * dtor
46 :     */
47 :     IpmDevice::~IpmDevice()
48 :     {
49 :     }
50 :    
51 :    
52 :     /*
53 : jtarlton 64 * Open the device.
54 : jtarlton 41 */
55 : jtarlton 45 bool IpmDevice::open()
56 : jtarlton 41 {
57 : jtarlton 45 LOGDEBUG("IpmDevice::open() device: " << devName_);
58 :    
59 : jtarlton 41 devHandle_ = ipm_Open(devName_.c_str(), NULL, EV_ASYNC);
60 :     if ( devHandle_ < 0 )
61 :     {
62 :     LOGERROR("ipm_Open() failed");
63 :     return false;
64 :     }
65 :     state_ = IPM_OPENING;
66 :     return true;
67 :     }
68 :    
69 :    
70 :     /*
71 : jtarlton 64 * Close the device
72 : jtarlton 41 */
73 : jtarlton 45 bool IpmDevice::close()
74 : jtarlton 41 {
75 : jtarlton 45 LOGDEBUG("IpmDevice::close() device: " << devName_);
76 :    
77 : jtarlton 41 if ( devHandle_ > 0 )
78 :     {
79 :     if ( ipm_Close(devHandle_, NULL) < 0 )
80 :     {
81 : jtarlton 104 LOGERROR("ipm_Close() failed");
82 : jtarlton 41 return false;
83 :     }
84 : jtarlton 64 devHandle_ = 0;
85 : jtarlton 41 }
86 :     return true;
87 :     }
88 :    
89 :    
90 :     /*
91 : jtarlton 64 * Connect media.
92 : jtarlton 41 */
93 : jtarlton 45 bool IpmDevice::listen( DialogicDevice* other )
94 : jtarlton 41 {
95 : jtarlton 45 LOGDEBUG("IpmDevice::listen() device: " << devName_ <<
96 : jtarlton 50 " other: " << other->getDeviceName());
97 : jtarlton 41
98 :     SC_TSINFO tsinfo;
99 :     tsinfo.sc_numts = 1;
100 : jtarlton 50 tsinfo.sc_tsarrayp = other->getTimeslot();
101 : jtarlton 41
102 :     if ( ipm_Listen(devHandle_, &tsinfo, EV_SYNC) == -1 )
103 :     {
104 :     LOGERROR("ipm_Listen() failed on device: " << devName_ <<
105 :     " " << ATDV_ERRMSGP(devHandle_));
106 :     return false;
107 :     }
108 :     return true;
109 :     }
110 :    
111 :    
112 :     /*
113 : jtarlton 64 * Disconnect media.
114 : jtarlton 41 */
115 : jtarlton 45 bool IpmDevice::unListen()
116 : jtarlton 41 {
117 : jtarlton 45 LOGDEBUG("IpmDevice::unListen() device: " << devName_);
118 : jtarlton 41
119 : jtarlton 138 if ( ipm_UnListen(devHandle_, EV_SYNC) == -1)
120 : jtarlton 41 {
121 :     LOGERROR("ipm_UnListen() failed on device: " << devName_ <<
122 :     " " << ATDV_ERRMSGP(devHandle_));
123 :     return false;
124 :     }
125 :     return true;
126 :     }
127 :    
128 :    
129 :     /*
130 : jtarlton 131 * Search localMediaInfo_ for the requested information.
131 : jtarlton 41 */
132 : jtarlton 104 void IpmDevice::getLocalMediaInfo( eIPM_MEDIA_TYPE type,
133 : jtarlton 131 IpInfo& rtp_media ) const
134 : jtarlton 41 {
135 : jtarlton 103 for ( unsigned int i = 0; i < localMediaInfo_.unCount; i++ )
136 : jtarlton 41 {
137 : jtarlton 103 if ( type == localMediaInfo_.MediaData[i].eMediaType )
138 : jtarlton 41 {
139 : jtarlton 131 rtp_media.setAddress(localMediaInfo_.MediaData[i].mediaInfo.PortInfo.cIPAddress);
140 :     rtp_media.setPort(localMediaInfo_.MediaData[i].mediaInfo.PortInfo.unPortId);
141 : jtarlton 41 break;
142 :     }
143 :     }
144 :     }
145 :    
146 :    
147 :     /*
148 : jtarlton 131 * Save the remote params.
149 : jtarlton 41 */
150 : jtarlton 131 void IpmDevice::setRemoteMediaInfo( eIPM_MEDIA_TYPE type,
151 :     const IpInfo& rtp_info )
152 : jtarlton 41 {
153 : jtarlton 131 remoteRtpAudio_ = rtp_info;
154 :     remoteRtcpAudio_ = rtp_info;
155 : jtarlton 135 remoteRtcpAudio_.setPort(remoteRtpAudio_.getPort() + 1); // XXXXXXXXXx
156 : jtarlton 41 }
157 :    
158 :    
159 :     /*
160 :     * Stop the IPM streaming and/or digit reception
161 :     */
162 :     bool IpmDevice::stop( eIPM_STOP_OPERATION operation )
163 :     {
164 :     if ( state_ == IPM_IDLE )
165 :     {
166 :     return false;
167 :     }
168 :    
169 :     if ( ipm_Stop(devHandle_, operation, EV_ASYNC) == -1 )
170 :     {
171 :     LOGERROR("ipm_Stop() on device: " << devName_ << " failed: " <<
172 :     ATDV_LASTERR(devHandle_));
173 :     return false;
174 :     }
175 :     state_ = IPM_STOPPING;
176 :     return true;
177 :     }
178 :    
179 :    
180 :     /*
181 :     * Start RTP streaming to peer.
182 :     */
183 :     bool IpmDevice::startMedia()
184 :     {
185 : jtarlton 131 return startMedia(remoteRtpAudio_, remoteRtcpAudio_);
186 : jtarlton 41 }
187 :    
188 :    
189 :     /*
190 :     * Start RTP streaming using G.711 and local/remote port information.
191 :     * Will use G.711 - choose ALaw Ulaw from woomera msg?
192 : jtarlton 103 * Mu hardwired in for now.
193 : jtarlton 41 */
194 : jtarlton 131 bool IpmDevice::startMedia( const IpInfo& remote_rtp_audio,
195 :     const IpInfo& remote_rtcp_audio )
196 : jtarlton 41 {
197 :     if ( state_ != IPM_IDLE )
198 :     {
199 :     LOGERROR("IpmDevice::startMedia() device: " << devName_ << " is not in IDLE state");
200 : jtarlton 131 return false;
201 : jtarlton 41 }
202 :    
203 :     IPM_MEDIA_INFO mediaInfo;
204 :     memset(&mediaInfo, 0, sizeof(IPM_MEDIA_INFO));
205 :    
206 : jtarlton 131 int mediaCnt = 0; /* limit MAX_MEDIA_INFO */
207 : jtarlton 41
208 :     /* remote audio
209 :     */
210 :     mediaInfo.MediaData[mediaCnt].eMediaType = MEDIATYPE_AUDIO_REMOTE_CODER_INFO;
211 :     mediaInfo.MediaData[mediaCnt].mediaInfo.CoderInfo.eCoderType = CODER_TYPE_G711ULAW64K;
212 :     mediaInfo.MediaData[mediaCnt].mediaInfo.CoderInfo.eFrameSize = CODER_FRAMESIZE_20;
213 :     mediaInfo.MediaData[mediaCnt].mediaInfo.CoderInfo.unFramesPerPkt = 1;
214 : jtarlton 131 mediaInfo.MediaData[mediaCnt].mediaInfo.CoderInfo.eVadEnable = CODER_VAD_ENABLE;
215 : jtarlton 41 mediaInfo.MediaData[mediaCnt].mediaInfo.CoderInfo.unCoderPayloadType = 0;
216 :     mediaInfo.MediaData[mediaCnt].mediaInfo.CoderInfo.unRedPayloadType = 0;
217 :     mediaCnt++;
218 :    
219 :     /* local audio
220 : jtarlton 131 */
221 : jtarlton 41 mediaInfo.MediaData[mediaCnt].eMediaType = MEDIATYPE_AUDIO_LOCAL_CODER_INFO;
222 : jtarlton 131 mediaInfo.MediaData[mediaCnt].mediaInfo.CoderInfo.eCoderType = CODER_TYPE_G711ULAW64K;
223 :     mediaInfo.MediaData[mediaCnt].mediaInfo.CoderInfo.eFrameSize = CODER_FRAMESIZE_20;
224 : jtarlton 41 mediaInfo.MediaData[mediaCnt].mediaInfo.CoderInfo.unFramesPerPkt = 1;
225 : jtarlton 131 mediaInfo.MediaData[mediaCnt].mediaInfo.CoderInfo.eVadEnable = CODER_VAD_ENABLE;
226 : jtarlton 41 mediaInfo.MediaData[mediaCnt].mediaInfo.CoderInfo.unCoderPayloadType = 0;
227 :     mediaInfo.MediaData[mediaCnt].mediaInfo.CoderInfo.unRedPayloadType = 0;
228 :     mediaCnt++;
229 :    
230 :     /* remote audio ports and IP addresses
231 :     */
232 :     mediaInfo.MediaData[mediaCnt].eMediaType = MEDIATYPE_AUDIO_REMOTE_RTP_INFO;
233 : jtarlton 131 strcpy(mediaInfo.MediaData[mediaCnt].mediaInfo.PortInfo.cIPAddress,
234 :     remote_rtp_audio.getAddress().c_str());
235 :     mediaInfo.MediaData[mediaCnt].mediaInfo.PortInfo.unPortId = remote_rtp_audio.getPort();
236 : jtarlton 41 mediaCnt++;
237 :    
238 :     mediaInfo.MediaData[mediaCnt].eMediaType = MEDIATYPE_AUDIO_REMOTE_RTCP_INFO;
239 : jtarlton 131 strcpy(mediaInfo.MediaData[mediaCnt].mediaInfo.PortInfo.cIPAddress,
240 :     remote_rtcp_audio.getAddress().c_str());
241 :     mediaInfo.MediaData[mediaCnt].mediaInfo.PortInfo.unPortId = remote_rtcp_audio.getPort();
242 : jtarlton 41 mediaCnt++;
243 :    
244 :     mediaInfo.unCount = mediaCnt;
245 :    
246 : jtarlton 103 LOGDEBUG("IpmDevice::startMedia() starting RTP streaming on device: " <<
247 : jtarlton 140 devName_ << " to: " << remote_rtp_audio);
248 : jtarlton 41
249 :     if ( ipm_StartMedia(devHandle_, &mediaInfo, DATA_IP_TDM_BIDIRECTIONAL, EV_ASYNC) == -1 )
250 :     {
251 : jtarlton 131 LOGERROR("ipm_StartMedia failed for device: " << devName_ <<
252 : jtarlton 41 " with error: " << ATDV_ERRMSGP(devHandle_));
253 :     return false;
254 :     }
255 : jtarlton 131
256 :     state_ = IPM_STARTING;
257 : jtarlton 41 return true;
258 :     }
259 :    
260 :    
261 :     /*
262 : jtarlton 103 * Forward to event specific handler.
263 :     */
264 :     bool IpmDevice::processEvent( METAEVENT& metaevent )
265 :     {
266 :     switch ( metaevent.evttype )
267 :     {
268 :     case IPMEV_OPEN:
269 :     onOpen();
270 :     break;
271 :    
272 :     case IPMEV_EVENT_ENABLED:
273 : jtarlton 131 onEventEnabled();
274 : jtarlton 103 break;
275 :    
276 :     case IPMEV_GET_LOCAL_MEDIA_INFO:
277 :     onLocalMediaInfo((IPM_MEDIA_INFO*)metaevent.evtdatap);
278 :     break;
279 :    
280 :     case IPMEV_STARTMEDIA:
281 :     onStartMedia();
282 :     break;
283 :    
284 :     case IPMEV_STOPPED:
285 :     onStopped ();
286 :     break;
287 :    
288 :     case IPMEV_ERROR:
289 :     onError();
290 :     break;
291 :    
292 :     case DMEV_GET_TX_PORT_INFO:
293 :     onGetTxPortInfo((DM_PORT_INFO_LIST*)metaevent.evtdatap);
294 :     break;
295 :    
296 :     case DMEV_GET_RX_PORT_INFO:
297 :     onGetRxPortInfo((DM_PORT_INFO_LIST*)metaevent.evtdatap);
298 :     break;
299 :    
300 :     case DMEV_GET_TX_PORT_INFO_FAIL:
301 :     onPortGetFail();
302 :     break;
303 :    
304 :     case DMEV_GET_RX_PORT_INFO_FAIL:
305 :     onPortGetFail();
306 :     break;
307 :    
308 :     case DMEV_PORT_CONNECT:
309 :     onPortConnect();
310 :     break;
311 :    
312 :     default:
313 : jtarlton 131 LOGWARN("IpmDevice::processEvent() unhandled event: 0x" <<
314 :     std::hex << metaevent.evttype << " for device: " << devName_);
315 : jtarlton 103 return false;
316 :     }
317 :     return true;
318 :     }
319 :    
320 :    
321 :     /*
322 : jtarlton 64 * Handler for IPMEV_OPEN events.
323 : jtarlton 41 */
324 :     void IpmDevice::onOpen()
325 :     {
326 : jtarlton 103 LOGDEBUG("IpmDevice::onOpen() device: " << devName_);
327 : jtarlton 41
328 : jtarlton 103 SC_TSINFO tsinfo;
329 : jtarlton 41 tsinfo.sc_numts = 1;
330 : jtarlton 50 tsinfo.sc_tsarrayp = getTimeslot();
331 : jtarlton 41 if ( ipm_GetXmitSlot(devHandle_, &tsinfo, EV_SYNC) == -1 )
332 :     {
333 : jtarlton 140 LOGERROR("ipm_GetXmitSlot() failed" );
334 : jtarlton 41 }
335 :    
336 : jtarlton 103 if ( dev_GetTransmitPortInfo(devHandle_, this) == -1 )
337 : jtarlton 41 {
338 : jtarlton 140 LOGERROR("dev_GetTransmitPortInfo() failed");
339 : jtarlton 41 }
340 : jtarlton 103 if ( dev_GetReceivePortInfo(devHandle_, this) == -1 )
341 : jtarlton 41 {
342 : jtarlton 140 LOGERROR("dev_GetReceivePortInfo() failed");
343 : jtarlton 41 }
344 :    
345 : jtarlton 140 /* Request the local media information and save it in localMediaInfo_
346 : jtarlton 103 */
347 :     localMediaInfo_.unCount = 3;
348 :     localMediaInfo_.MediaData[0].eMediaType = MEDIATYPE_AUDIO_LOCAL_RTP_INFO;
349 :     localMediaInfo_.MediaData[1].eMediaType = MEDIATYPE_VIDEO_LOCAL_RTP_INFO;
350 :     localMediaInfo_.MediaData[2].eMediaType = MEDIATYPE_NBUP_LOCAL_RTP_INFO;
351 : jtarlton 41
352 : jtarlton 103 if ( ipm_GetLocalMediaInfo (devHandle_, &localMediaInfo_, EV_ASYNC) == -1 )
353 :     {
354 :     LOGERROR("ipm_GetLocalMediaInfo() failed for device: " <<
355 :     devName_ << " with error: " << ATDV_LASTERR(devHandle_));
356 :     }
357 :    
358 :     /* update init state
359 :     */
360 : jtarlton 41 state_ = IPM_INITIALIZATION_START;
361 :     initStepsRemaining_--;
362 :     if ( initStepsRemaining_ == 0 )
363 :     {
364 :     state_ = IPM_IDLE;
365 :     }
366 :     }
367 :    
368 :    
369 :     /*
370 : jtarlton 64 * Handler for DMEV_GET_TX_PORT_INFO events.
371 : jtarlton 41 */
372 :     void IpmDevice::onGetTxPortInfo( DM_PORT_INFO_LIST* portInfo )
373 :     {
374 : jtarlton 103 LOGDEBUG("IpmDevice::onGetTxPortInfo() device: " << devName_);
375 : jtarlton 41
376 :     memcpy(&txPortInfoList_, sr_getevtdatap(), sr_getevtlen());
377 :    
378 :     printPortInfo(portInfo);
379 :    
380 :     initStepsRemaining_--;
381 :     if ( initStepsRemaining_ == 0 )
382 :     {
383 :     state_ = IPM_IDLE;
384 :     }
385 :     }
386 :    
387 :    
388 :     /*
389 : jtarlton 64 * Handler for DMEV_GET_RX_PORT_INFO events.
390 : jtarlton 41 */
391 :     void IpmDevice::onGetRxPortInfo( DM_PORT_INFO_LIST* portInfo )
392 :     {
393 : jtarlton 103 LOGDEBUG("IpmDevice::onGetRxPortInfo() device: " << devName_);
394 : jtarlton 41
395 :     memcpy(&rxPortInfoList_, sr_getevtdatap(), sr_getevtlen());
396 :    
397 :     printPortInfo(portInfo);
398 :    
399 :     initStepsRemaining_--;
400 :     if ( initStepsRemaining_ == 0 )
401 :     {
402 :     state_ = IPM_IDLE;
403 :     }
404 :     }
405 :    
406 :    
407 :     /*
408 : jtarlton 64 * Handler for DMEV_PORT_CONNECT events.
409 : jtarlton 41 */
410 :     void IpmDevice::onPortConnect()
411 :     {
412 : jtarlton 103 LOGDEBUG("IpmDevice::onPortConnect() device: " << devName_);
413 : jtarlton 41 }
414 :    
415 :    
416 :     /*
417 : jtarlton 64 * Handler for DMEV_GET_TX_PORT_INFO_FAIL and DMEV_GET_RX_PORT_INFO_FAIL
418 :     * events.
419 : jtarlton 41 */
420 :     void IpmDevice::onPortGetFail()
421 :     {
422 :     LOGERROR("IpmDevice::onPortGetFail() device: " << devName_);
423 : jtarlton 103
424 : jtarlton 41 state_ = IPM_INVALID;
425 :     }
426 :    
427 :    
428 :     /*
429 : jtarlton 64 * Handler for IPMEV_ERROR events.
430 : jtarlton 41 */
431 :     void IpmDevice::onError()
432 :     {
433 :     LOGERROR("IpmDevice::onError() device: " << devName_ <<
434 :     " error: " << ATDV_ERRMSGP(devHandle_));
435 : jtarlton 103
436 : jtarlton 41 state_ = IPM_INVALID;
437 :     }
438 :    
439 :    
440 :     /*
441 : jtarlton 64 * Handler for IPMEV_EVENT_ENABLED events
442 : jtarlton 41 */
443 : jtarlton 64 void IpmDevice::onEventEnabled()
444 : jtarlton 41 {
445 : jtarlton 64 LOGDEBUG("IpmDevice::onEventEnabled() device: " << devName_);
446 : jtarlton 103
447 : jtarlton 41 initStepsRemaining_--;
448 :     if ( initStepsRemaining_ == 0 )
449 :     {
450 :     state_ = IPM_IDLE;
451 :     }
452 :     }
453 :    
454 :    
455 :     /*
456 : jtarlton 64 * Handler for IPMEV_STARTMEDIA events.
457 : jtarlton 41 */
458 :     void IpmDevice::onStartMedia()
459 :     {
460 :     LOGDEBUG("IpmDevice::onStartMedia() device: " << devName_);
461 : jtarlton 103
462 : jtarlton 41 state_ = IPM_STREAMING;
463 :     }
464 :    
465 :    
466 :     /*
467 : jtarlton 64 * Handler for IPMEV_STOPPED events.
468 : jtarlton 41 */
469 :     void IpmDevice::onStopped()
470 :     {
471 :     LOGDEBUG("IpmDevice::onStopped() device: " << devName_);
472 : jtarlton 103
473 : jtarlton 41 state_ = IPM_IDLE;
474 :     }
475 :    
476 :    
477 :     /*
478 : jtarlton 103 * Handler for IPMEV_GET_LOCAL_MEDIA_INFO events.
479 : jtarlton 41 */
480 : jtarlton 103 void IpmDevice::onLocalMediaInfo( IPM_MEDIA_INFO* mediaInfo )
481 : jtarlton 41 {
482 : jtarlton 103 LOGDEBUG("IpmDevice::onLocalMediaInfo() device: " << devName_);
483 :    
484 :     memcpy(&localMediaInfo_, mediaInfo, sizeof(IPM_MEDIA_INFO));
485 :     printMediaInfo(&localMediaInfo_);
486 : jtarlton 41 }
487 :    
488 :    
489 : jtarlton 103
490 :     /*
491 :     * Debug aid.
492 :     */
493 :     void IpmDevice::printPortInfo( DM_PORT_INFO_LIST* portInfo ) const
494 :     {
495 :     std::stringstream ss;
496 :    
497 :     for ( unsigned int i = 0; i < portInfo->unCount; i++ )
498 :     {
499 :     DM_PORT_INFO& info = portInfo->port_info[i];
500 :     ss << "Port: " << i << " MediaType: " << info.port_media_type;
501 :     if ( info.port_media_type == DM_PORT_MEDIA_TYPE_AUDIO )
502 :     {
503 :     ss << "Audio";
504 :     }
505 :     else if ( info.port_media_type == DM_PORT_MEDIA_TYPE_VIDEO )
506 :     {
507 :     ss << "Video";
508 :     }
509 :     else if ( info.port_media_type == DM_PORT_MEDIA_TYPE_NBUP )
510 :     {
511 :     ss << "NBUP";
512 :     }
513 :     else
514 :     {
515 :     ss << info.port_media_type;
516 :     }
517 :     }
518 :     LOGDEBUG(ss.str());
519 :     }
520 :    
521 :    
522 :     /*
523 :     * Debug aid
524 :     */
525 :     void IpmDevice::printMediaInfo( IPM_MEDIA_INFO* mediaInfo ) const
526 :     {
527 :     std::stringstream ss;
528 :     for ( unsigned int i = 0; i < mediaInfo->unCount; i++ )
529 :     {
530 :     ss << "MediaType = ";
531 :     switch ( mediaInfo->MediaData[i].eMediaType )
532 :     {
533 :     case MEDIATYPE_VIDEO_LOCAL_RTP_INFO:
534 :     ss << "MEDIATYPE_VIDEO_LOCAL_RTP_INFO";
535 :     break;
536 :    
537 :     case MEDIATYPE_VIDEO_LOCAL_RTCP_INFO:
538 :     ss << "MEDIATYPE_VIDEO_LOCAL_RTCP_INFO";
539 :     break;
540 :    
541 :     case MEDIATYPE_AUDIO_LOCAL_RTP_INFO:
542 :     ss << "MEDIATYPE_AUDIO_LOCAL_RTP_INFO";
543 :     break;
544 :    
545 :     case MEDIATYPE_AUDIO_LOCAL_RTCP_INFO:
546 :     ss << "MEDIATYPE_AUDIO_LOCAL_RTCP_INFO";
547 :     break;
548 :    
549 :     case MEDIATYPE_NBUP_LOCAL_RTP_INFO:
550 :     ss << "MEDIATYPE_NBUP_LOCAL_RTP_INFO";
551 :     break;
552 :    
553 :     default:
554 :     ss << "MEDIATYPE_??? " << mediaInfo->MediaData[i].eMediaType;
555 :     break;
556 :     }
557 :     ss << " IP = " << mediaInfo->MediaData[i].mediaInfo.PortInfo.cIPAddress;
558 :     ss << " Port = " << mediaInfo->MediaData[i].mediaInfo.PortInfo.unPortId;
559 :     ss << std::endl;
560 :     }
561 :     LOGDEBUG(ss.str());
562 :     }
563 :    
564 :    
565 : jtarlton 41 /* vim:ts=4:set nu:
566 :     * EOF
567 :     */

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.8