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

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