Parent Directory
|
Revision Log
Revision 419 - (view) (download)
| 1 : | jtarlton | 41 | /* |
| 2 : | jtarlton | 355 | * This file is part of Project DiaStar Server. |
| 3 : | jtarlton | 41 | * |
| 4 : | amartin | 143 | * More information about this project can be found at: |
| 5 : | jtarlton | 355 | * http://www.projectdiastar.org. |
| 6 : | jtarlton | 41 | * |
| 7 : | amartin | 143 | * Copyright (C) 2009 Dialogic Corp. |
| 8 : | jtarlton | 41 | * |
| 9 : | amartin | 143 | * This program is free software; you can redistribute it and/or |
| 10 : | * modify it under the terms of the GNU General Public License | ||
| 11 : | * as published by the Free Software Foundation; either version 2 | ||
| 12 : | * of the License, or (at your option) any later version. | ||
| 13 : | * | ||
| 14 : | * This program is distributed in the hope that it will be useful, | ||
| 15 : | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 16 : | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 17 : | * GNU General Public License for more details. | ||
| 18 : | * | ||
| 19 : | * You should have received a copy of the GNU General Public License | ||
| 20 : | * along with this program; if not, write to the Free Software | ||
| 21 : | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | ||
| 22 : | * 02110-1301, USA. | ||
| 23 : | * Alternatively see <http://www.gnu.org/licenses/>. | ||
| 24 : | * Or see the LICENSE file included within the source tree. | ||
| 25 : | * | ||
| 26 : | jtarlton | 41 | */ |
| 27 : | |||
| 28 : | /*! | ||
| 29 : | jtarlton | 45 | * \file ipmdevice.cxx |
| 30 : | jtarlton | 59 | * \brief Dialogic IPM device |
| 31 : | jtarlton | 41 | * \author Antony Martin <antony.martin@dialogic.com> |
| 32 : | jtarlton | 162 | * \author John Tarlton <john.tarlton@dialogic.com> |
| 33 : | jtarlton | 87 | * \version 2-APR-2009 |
| 34 : | jtarlton | 41 | */ |
| 35 : | |||
| 36 : | jtarlton | 87 | /*------------------------------ Dependencies --------------------------------*/ |
| 37 : | jtarlton | 41 | |
| 38 : | jtarlton | 413 | #include <iomanip> |
| 39 : | |||
| 40 : | jtarlton | 41 | #include "logger.h" |
| 41 : | jtarlton | 162 | #include "string-util.h" |
| 42 : | |||
| 43 : | jtarlton | 394 | #include "dialogicchannelmanager.h" |
| 44 : | jtarlton | 393 | #include "mmdevice.h" |
| 45 : | jtarlton | 395 | #include "gciptdevice.h" |
| 46 : | jtarlton | 41 | #include "ipmdevice.h" |
| 47 : | |||
| 48 : | jtarlton | 87 | /*----------------------------------------------------------------------------*/ |
| 49 : | jtarlton | 41 | |
| 50 : | jtarlton | 390 | |
| 51 : | jtarlton | 41 | /* |
| 52 : | * ctor | ||
| 53 : | */ | ||
| 54 : | jtarlton | 87 | IpmDevice::IpmDevice( const std::string& name, |
| 55 : | DialogicChannelManager& channelMgr ) | ||
| 56 : | : DialogicDevice(name, channelMgr) | ||
| 57 : | jtarlton | 41 | { |
| 58 : | jtarlton | 395 | ipt_ = 0; /* standalone mode */ |
| 59 : | jtarlton | 323 | busy_ = false; |
| 60 : | |||
| 61 : | jtarlton | 41 | /* Number of steps in the initialisation sequence, decremented by event |
| 62 : | jtarlton | 394 | * handlers. When zero, state is changed to IDLE. |
| 63 : | jtarlton | 64 | * |
| 64 : | * IPMEV_OPEN, | ||
| 65 : | * DMEV_GET_RX_PORT_INFO, | ||
| 66 : | * DMEV_GET_TX_PORT_INFO | ||
| 67 : | jtarlton | 41 | */ |
| 68 : | initStepsRemaining_ = 3; | ||
| 69 : | } | ||
| 70 : | |||
| 71 : | |||
| 72 : | /* | ||
| 73 : | * dtor | ||
| 74 : | */ | ||
| 75 : | IpmDevice::~IpmDevice() | ||
| 76 : | { | ||
| 77 : | } | ||
| 78 : | |||
| 79 : | |||
| 80 : | /* | ||
| 81 : | jtarlton | 321 | * Process a command that was queueued because an async operation was in progress |
| 82 : | * when it was initially requested. | ||
| 83 : | */ | ||
| 84 : | void IpmDevice::processPendingCommand() | ||
| 85 : | { | ||
| 86 : | jtarlton | 418 | while ( !busy_ && !pending_.empty() ) |
| 87 : | jtarlton | 321 | { |
| 88 : | jtarlton | 419 | LOGDEBUG("IpmDevice::processPendingCommand()"); |
| 89 : | jtarlton | 321 | switch( pending_.front().cmd ) |
| 90 : | { | ||
| 91 : | case IpmCommand::START: | ||
| 92 : | startMedia(); | ||
| 93 : | break; | ||
| 94 : | case IpmCommand::STOP: | ||
| 95 : | stop(pending_.front().operation); | ||
| 96 : | break; | ||
| 97 : | case IpmCommand::LISTEN: | ||
| 98 : | listen(pending_.front().other); | ||
| 99 : | break; | ||
| 100 : | case IpmCommand::UNLISTEN: | ||
| 101 : | unListen(); | ||
| 102 : | break; | ||
| 103 : | amartin | 402 | case IpmCommand::CONNECT: |
| 104 : | connect(pending_.front().other); | ||
| 105 : | break; | ||
| 106 : | case IpmCommand::DISCONNECT: | ||
| 107 : | disconnect(); | ||
| 108 : | break; | ||
| 109 : | jtarlton | 321 | default: |
| 110 : | break; | ||
| 111 : | } | ||
| 112 : | pending_.pop(); | ||
| 113 : | } | ||
| 114 : | } | ||
| 115 : | |||
| 116 : | |||
| 117 : | /* | ||
| 118 : | jtarlton | 64 | * Open the device. |
| 119 : | jtarlton | 41 | */ |
| 120 : | jtarlton | 45 | bool IpmDevice::open() |
| 121 : | jtarlton | 41 | { |
| 122 : | jtarlton | 45 | LOGDEBUG("IpmDevice::open() device: " << devName_); |
| 123 : | |||
| 124 : | jtarlton | 41 | devHandle_ = ipm_Open(devName_.c_str(), NULL, EV_ASYNC); |
| 125 : | if ( devHandle_ < 0 ) | ||
| 126 : | { | ||
| 127 : | LOGERROR("ipm_Open() failed"); | ||
| 128 : | return false; | ||
| 129 : | } | ||
| 130 : | state_ = IPM_OPENING; | ||
| 131 : | return true; | ||
| 132 : | } | ||
| 133 : | |||
| 134 : | |||
| 135 : | /* | ||
| 136 : | jtarlton | 64 | * Close the device |
| 137 : | jtarlton | 41 | */ |
| 138 : | jtarlton | 45 | bool IpmDevice::close() |
| 139 : | jtarlton | 41 | { |
| 140 : | jtarlton | 45 | LOGDEBUG("IpmDevice::close() device: " << devName_); |
| 141 : | |||
| 142 : | jtarlton | 41 | if ( devHandle_ > 0 ) |
| 143 : | { | ||
| 144 : | if ( ipm_Close(devHandle_, NULL) < 0 ) | ||
| 145 : | { | ||
| 146 : | jtarlton | 104 | LOGERROR("ipm_Close() failed"); |
| 147 : | jtarlton | 41 | return false; |
| 148 : | } | ||
| 149 : | jtarlton | 64 | devHandle_ = 0; |
| 150 : | jtarlton | 41 | } |
| 151 : | return true; | ||
| 152 : | } | ||
| 153 : | |||
| 154 : | |||
| 155 : | /* | ||
| 156 : | jtarlton | 64 | * Connect media. |
| 157 : | jtarlton | 41 | */ |
| 158 : | jtarlton | 45 | bool IpmDevice::listen( DialogicDevice* other ) |
| 159 : | jtarlton | 41 | { |
| 160 : | jtarlton | 413 | if ( busy_ ) |
| 161 : | { | ||
| 162 : | pending_.push(IpmCommand(IpmCommand::LISTEN, other)); | ||
| 163 : | return true; | ||
| 164 : | } | ||
| 165 : | |||
| 166 : | jtarlton | 417 | if ( other_ != other ) |
| 167 : | jtarlton | 316 | { |
| 168 : | LOGDEBUG("IpmDevice::listen() device: " << devName_ << | ||
| 169 : | jtarlton | 317 | " other: " << other->getDeviceName()); |
| 170 : | jtarlton | 401 | |
| 171 : | jtarlton | 317 | SC_TSINFO tsinfo; |
| 172 : | tsinfo.sc_numts = 1; | ||
| 173 : | tsinfo.sc_tsarrayp = other->getXmitTimeslotPtr(); | ||
| 174 : | jtarlton | 41 | |
| 175 : | jtarlton | 317 | if ( ipm_Listen(devHandle_, &tsinfo, EV_ASYNC) == -1 ) |
| 176 : | { | ||
| 177 : | LOGERROR("ipm_Listen() failed on device: " << devName_ << | ||
| 178 : | " " << ATDV_ERRMSGP(devHandle_)); | ||
| 179 : | return false; | ||
| 180 : | } | ||
| 181 : | jtarlton | 401 | |
| 182 : | jtarlton | 417 | other_ = other; |
| 183 : | jtarlton | 401 | busy_ = true; |
| 184 : | } | ||
| 185 : | return true; | ||
| 186 : | } | ||
| 187 : | |||
| 188 : | |||
| 189 : | /* | ||
| 190 : | * Disconnect media. | ||
| 191 : | */ | ||
| 192 : | bool IpmDevice::unListen() | ||
| 193 : | { | ||
| 194 : | jtarlton | 413 | if ( busy_ ) |
| 195 : | { | ||
| 196 : | pending_.push(IpmCommand(IpmCommand::UNLISTEN)); | ||
| 197 : | return true; | ||
| 198 : | } | ||
| 199 : | |||
| 200 : | jtarlton | 417 | if ( other_ ) |
| 201 : | jtarlton | 401 | { |
| 202 : | LOGDEBUG("IpmDevice::unListen() device: " << devName_); | ||
| 203 : | |||
| 204 : | if ( ipm_UnListen(devHandle_, EV_ASYNC) == -1) | ||
| 205 : | { | ||
| 206 : | LOGERROR("ipm_UnListen() failed on device: " << devName_ << | ||
| 207 : | " " << ATDV_ERRMSGP(devHandle_)); | ||
| 208 : | return false; | ||
| 209 : | } | ||
| 210 : | |||
| 211 : | jtarlton | 417 | other_ = 0; |
| 212 : | jtarlton | 401 | busy_ = true; |
| 213 : | } | ||
| 214 : | return true; | ||
| 215 : | } | ||
| 216 : | |||
| 217 : | |||
| 218 : | /* | ||
| 219 : | * Connect media. | ||
| 220 : | */ | ||
| 221 : | bool IpmDevice::connect( DialogicDevice* other ) | ||
| 222 : | { | ||
| 223 : | jtarlton | 413 | if ( busy_ ) |
| 224 : | { | ||
| 225 : | pending_.push(IpmCommand(IpmCommand::CONNECT, other)); | ||
| 226 : | return true; | ||
| 227 : | } | ||
| 228 : | |||
| 229 : | jtarlton | 417 | if ( !other_ ) |
| 230 : | jtarlton | 401 | { |
| 231 : | LOGDEBUG("IpmDevice::connect() device: " << devName_ << | ||
| 232 : | jtarlton | 413 | " to: " << other->getDeviceName()); |
| 233 : | jtarlton | 401 | |
| 234 : | jtarlton | 390 | DM_PORT_CONNECT_INFO_LIST portConnectInfoList; |
| 235 : | jtarlton | 413 | memset(&portConnectInfoList, 0, sizeof(portConnectInfoList)); |
| 236 : | jtarlton | 390 | INIT_DM_PORT_CONNECT_INFO_LIST(&portConnectInfoList); |
| 237 : | jtarlton | 393 | int count = 0; |
| 238 : | jtarlton | 390 | |
| 239 : | jtarlton | 393 | INIT_DM_PORT_CONNECT_INFO(&portConnectInfoList.port_connect_info[count]); |
| 240 : | jtarlton | 413 | portConnectInfoList.port_connect_info[count].unFlags = DMFL_TRANSCODE_ON; |
| 241 : | jtarlton | 393 | portConnectInfoList.port_connect_info[count].port_info_tx = getAudioTxPortInfo(); |
| 242 : | jtarlton | 401 | portConnectInfoList.port_connect_info[count].port_info_rx = other->getAudioRxPortInfo(); |
| 243 : | jtarlton | 393 | count++; |
| 244 : | jtarlton | 390 | |
| 245 : | jtarlton | 393 | INIT_DM_PORT_CONNECT_INFO(&portConnectInfoList.port_connect_info[count]); |
| 246 : | jtarlton | 413 | portConnectInfoList.port_connect_info[count].unFlags = DMFL_TRANSCODE_ON; |
| 247 : | jtarlton | 393 | portConnectInfoList.port_connect_info[count].port_info_tx = getVideoTxPortInfo(); |
| 248 : | jtarlton | 401 | portConnectInfoList.port_connect_info[count].port_info_rx = other->getVideoRxPortInfo(); |
| 249 : | jtarlton | 393 | count++; |
| 250 : | jtarlton | 416 | |
| 251 : | jtarlton | 393 | portConnectInfoList.unCount = count; |
| 252 : | jtarlton | 390 | if ( dev_PortConnect(devHandle_, &portConnectInfoList, NULL) != DEV_SUCCESS ) |
| 253 : | { | ||
| 254 : | amartin | 403 | LOGERROR("IpmDevice::connect() dev_PortConnect() failed on device: " << devName_ << |
| 255 : | jtarlton | 390 | " " << ATDV_ERRMSGP(devHandle_)); |
| 256 : | return false; | ||
| 257 : | } | ||
| 258 : | |||
| 259 : | jtarlton | 417 | other_ = other; |
| 260 : | jtarlton | 321 | busy_ = true; |
| 261 : | jtarlton | 41 | } |
| 262 : | amartin | 405 | else |
| 263 : | { | ||
| 264 : | jtarlton | 417 | if ( other_ != other ) |
| 265 : | { | ||
| 266 : | LOGERROR("IpmDevice::connect() " << devName_ << | ||
| 267 : | " unable to connect to device: " << other->getDeviceName() << | ||
| 268 : | " already connected to device: " << other_->getDeviceName()); | ||
| 269 : | } | ||
| 270 : | amartin | 405 | } |
| 271 : | jtarlton | 41 | return true; |
| 272 : | } | ||
| 273 : | |||
| 274 : | |||
| 275 : | /* | ||
| 276 : | jtarlton | 64 | * Disconnect media. |
| 277 : | jtarlton | 41 | */ |
| 278 : | jtarlton | 401 | bool IpmDevice::disconnect() |
| 279 : | jtarlton | 41 | { |
| 280 : | jtarlton | 413 | if ( busy_ ) |
| 281 : | { | ||
| 282 : | pending_.push(IpmCommand(IpmCommand::DISCONNECT)); | ||
| 283 : | return true; | ||
| 284 : | } | ||
| 285 : | |||
| 286 : | jtarlton | 417 | if ( other_ ) |
| 287 : | jtarlton | 316 | { |
| 288 : | jtarlton | 413 | LOGDEBUG("IpmDevice::disconnect() device: " << devName_ << |
| 289 : | jtarlton | 417 | " from: " << other_->getDeviceName()); |
| 290 : | jtarlton | 316 | |
| 291 : | jtarlton | 390 | DM_PORT_CONNECT_INFO_LIST portConnectInfoList; |
| 292 : | jtarlton | 413 | memset(&portConnectInfoList, 0, sizeof(portConnectInfoList)); |
| 293 : | jtarlton | 390 | INIT_DM_PORT_CONNECT_INFO_LIST(&portConnectInfoList); |
| 294 : | jtarlton | 393 | int count = 0; |
| 295 : | jtarlton | 390 | |
| 296 : | jtarlton | 393 | INIT_DM_PORT_CONNECT_INFO(&portConnectInfoList.port_connect_info[count]); |
| 297 : | portConnectInfoList.port_connect_info[count].port_info_tx = getAudioTxPortInfo(); | ||
| 298 : | jtarlton | 417 | portConnectInfoList.port_connect_info[count].port_info_rx = other_->getAudioRxPortInfo(); //XXX |
| 299 : | jtarlton | 393 | count++; |
| 300 : | jtarlton | 390 | |
| 301 : | jtarlton | 393 | INIT_DM_PORT_CONNECT_INFO(&portConnectInfoList.port_connect_info[count]); |
| 302 : | portConnectInfoList.port_connect_info[count].port_info_tx = getVideoTxPortInfo(); | ||
| 303 : | jtarlton | 417 | portConnectInfoList.port_connect_info[count].port_info_rx = other_->getVideoRxPortInfo(); //XXX |
| 304 : | jtarlton | 393 | count++; |
| 305 : | jtarlton | 390 | |
| 306 : | jtarlton | 393 | portConnectInfoList.unCount = count; |
| 307 : | jtarlton | 390 | if ( dev_PortDisconnect(devHandle_, &portConnectInfoList, NULL) != DEV_SUCCESS ) |
| 308 : | { | ||
| 309 : | amartin | 403 | LOGERROR("IpmDevice::disconnect() dev_PortDisconnect() failed on device: " << devName_ << |
| 310 : | jtarlton | 390 | " " << ATDV_ERRMSGP(devHandle_)); |
| 311 : | return false; | ||
| 312 : | } | ||
| 313 : | |||
| 314 : | jtarlton | 417 | other_ = 0; |
| 315 : | jtarlton | 321 | busy_ = true; |
| 316 : | jtarlton | 41 | } |
| 317 : | return true; | ||
| 318 : | } | ||
| 319 : | |||
| 320 : | |||
| 321 : | /* | ||
| 322 : | jtarlton | 131 | * Search localMediaInfo_ for the requested information. |
| 323 : | jtarlton | 41 | */ |
| 324 : | jtarlton | 390 | bool IpmDevice::getLocalMediaInfo( eIPM_MEDIA_TYPE type, |
| 325 : | jtarlton | 131 | IpInfo& rtp_media ) const |
| 326 : | jtarlton | 41 | { |
| 327 : | jtarlton | 390 | switch ( type ) |
| 328 : | jtarlton | 41 | { |
| 329 : | jtarlton | 390 | case MEDIATYPE_AUDIO_LOCAL_RTP_INFO: |
| 330 : | rtp_media = localRtpAudio_; | ||
| 331 : | jtarlton | 41 | break; |
| 332 : | jtarlton | 390 | |
| 333 : | case MEDIATYPE_AUDIO_LOCAL_RTCP_INFO: | ||
| 334 : | rtp_media = localRtcpAudio_; | ||
| 335 : | break; | ||
| 336 : | |||
| 337 : | case MEDIATYPE_VIDEO_LOCAL_RTP_INFO: | ||
| 338 : | rtp_media = localRtpVideo_; | ||
| 339 : | break; | ||
| 340 : | |||
| 341 : | case MEDIATYPE_VIDEO_LOCAL_RTCP_INFO: | ||
| 342 : | rtp_media = localRtcpVideo_; | ||
| 343 : | break; | ||
| 344 : | |||
| 345 : | default: | ||
| 346 : | return false; | ||
| 347 : | jtarlton | 41 | } |
| 348 : | jtarlton | 390 | return true; |
| 349 : | jtarlton | 41 | } |
| 350 : | |||
| 351 : | |||
| 352 : | /* | ||
| 353 : | jtarlton | 131 | * Save the remote params. |
| 354 : | jtarlton | 41 | */ |
| 355 : | jtarlton | 131 | void IpmDevice::setRemoteMediaInfo( eIPM_MEDIA_TYPE type, |
| 356 : | const IpInfo& rtp_info ) | ||
| 357 : | jtarlton | 41 | { |
| 358 : | jtarlton | 390 | if ( type == MEDIATYPE_AUDIO_REMOTE_RTP_INFO ) |
| 359 : | jtarlton | 210 | { |
| 360 : | remoteRtpAudio_ = rtp_info; | ||
| 361 : | remoteRtcpAudio_ = rtp_info; | ||
| 362 : | jtarlton | 286 | remoteRtcpAudio_.setPort(remoteRtpAudio_.getPort() + 1); |
| 363 : | jtarlton | 411 | |
| 364 : | LOGDEBUG("IpmDevice::setRemoteMediaInfo() device: " << devName_ << | ||
| 365 : | " a=" << remoteRtpAudio_); | ||
| 366 : | jtarlton | 210 | } |
| 367 : | jtarlton | 390 | if ( type == MEDIATYPE_VIDEO_REMOTE_RTP_INFO ) |
| 368 : | { | ||
| 369 : | remoteRtpVideo_ = rtp_info; | ||
| 370 : | remoteRtcpVideo_ = rtp_info; | ||
| 371 : | remoteRtcpVideo_.setPort(remoteRtpVideo_.getPort() + 1); | ||
| 372 : | jtarlton | 411 | LOGDEBUG("IpmDevice::setRemoteMediaInfo() device: " << devName_ << |
| 373 : | " v=" << remoteRtpVideo_); | ||
| 374 : | jtarlton | 390 | } |
| 375 : | jtarlton | 41 | } |
| 376 : | |||
| 377 : | |||
| 378 : | /* | ||
| 379 : | * Stop the IPM streaming and/or digit reception | ||
| 380 : | */ | ||
| 381 : | bool IpmDevice::stop( eIPM_STOP_OPERATION operation ) | ||
| 382 : | { | ||
| 383 : | if ( state_ == IPM_IDLE ) | ||
| 384 : | { | ||
| 385 : | jtarlton | 294 | return true; /* already stopped */ |
| 386 : | jtarlton | 41 | } |
| 387 : | |||
| 388 : | jtarlton | 321 | if ( busy_ ) |
| 389 : | { | ||
| 390 : | pending_.push(IpmCommand(IpmCommand::STOP, operation)); | ||
| 391 : | return true; | ||
| 392 : | } | ||
| 393 : | |||
| 394 : | jtarlton | 41 | if ( ipm_Stop(devHandle_, operation, EV_ASYNC) == -1 ) |
| 395 : | { | ||
| 396 : | LOGERROR("ipm_Stop() on device: " << devName_ << " failed: " << | ||
| 397 : | ATDV_LASTERR(devHandle_)); | ||
| 398 : | return false; | ||
| 399 : | } | ||
| 400 : | jtarlton | 411 | |
| 401 : | LOGDEBUG("IpmDevice::stopMedia() stopping RTP streaming on device: " << | ||
| 402 : | devName_); | ||
| 403 : | |||
| 404 : | jtarlton | 41 | state_ = IPM_STOPPING; |
| 405 : | jtarlton | 321 | busy_ = true; |
| 406 : | |||
| 407 : | jtarlton | 41 | return true; |
| 408 : | } | ||
| 409 : | |||
| 410 : | |||
| 411 : | /* | ||
| 412 : | * Start RTP streaming to peer. | ||
| 413 : | */ | ||
| 414 : | bool IpmDevice::startMedia() | ||
| 415 : | { | ||
| 416 : | jtarlton | 390 | return startMedia(remoteRtpAudio_, |
| 417 : | remoteRtcpAudio_, | ||
| 418 : | remoteRtpVideo_, | ||
| 419 : | remoteRtcpVideo_); | ||
| 420 : | jtarlton | 41 | } |
| 421 : | |||
| 422 : | |||
| 423 : | /* | ||
| 424 : | jtarlton | 294 | * Start RTP streaming using G.711ulaw and local/remote port information. |
| 425 : | jtarlton | 390 | * XXX codecs from config |
| 426 : | jtarlton | 41 | */ |
| 427 : | jtarlton | 131 | bool IpmDevice::startMedia( const IpInfo& remote_rtp_audio, |
| 428 : | jtarlton | 390 | const IpInfo& remote_rtcp_audio, |
| 429 : | const IpInfo& remote_rtp_video, | ||
| 430 : | const IpInfo& remote_rtcp_video ) | ||
| 431 : | jtarlton | 41 | { |
| 432 : | jtarlton | 411 | if ( busy_ ) |
| 433 : | jtarlton | 41 | { |
| 434 : | jtarlton | 411 | pending_.push(IpmCommand(IpmCommand::START)); |
| 435 : | return true; | ||
| 436 : | jtarlton | 41 | } |
| 437 : | |||
| 438 : | jtarlton | 411 | if ( state_ == IPM_STREAMING ) |
| 439 : | jtarlton | 321 | { |
| 440 : | jtarlton | 411 | /* already started, ignore */ |
| 441 : | LOGDEBUG("IpmDevice::startMedia() already streaming on device: " << | ||
| 442 : | devName_); | ||
| 443 : | jtarlton | 321 | return true; |
| 444 : | } | ||
| 445 : | |||
| 446 : | jtarlton | 419 | if ( !remote_rtp_audio.isValid() && !remote_rtp_video.isValid() ) |
| 447 : | { | ||
| 448 : | LOGERROR("IpmDevice::startMedia() invalid destination address:port for device: " << | ||
| 449 : | devName_); | ||
| 450 : | return false; | ||
| 451 : | } | ||
| 452 : | |||
| 453 : | jtarlton | 390 | setDtmfMode(DTMF_RFC2833); |
| 454 : | |||
| 455 : | jtarlton | 41 | IPM_MEDIA_INFO mediaInfo; |
| 456 : | memset(&mediaInfo, 0, sizeof(IPM_MEDIA_INFO)); | ||
| 457 : | |||
| 458 : | jtarlton | 131 | int mediaCnt = 0; /* limit MAX_MEDIA_INFO */ |
| 459 : | jtarlton | 41 | |
| 460 : | /* remote audio | ||
| 461 : | */ | ||
| 462 : | jtarlton | 311 | mediaInfo.MediaData[mediaCnt].eMediaType = MEDIATYPE_AUDIO_REMOTE_CODER_INFO; |
| 463 : | jtarlton | 41 | mediaInfo.MediaData[mediaCnt].mediaInfo.CoderInfo.eCoderType = CODER_TYPE_G711ULAW64K; |
| 464 : | mediaInfo.MediaData[mediaCnt].mediaInfo.CoderInfo.eFrameSize = CODER_FRAMESIZE_20; | ||
| 465 : | mediaInfo.MediaData[mediaCnt].mediaInfo.CoderInfo.unFramesPerPkt = 1; | ||
| 466 : | jtarlton | 131 | mediaInfo.MediaData[mediaCnt].mediaInfo.CoderInfo.eVadEnable = CODER_VAD_ENABLE; |
| 467 : | jtarlton | 41 | mediaInfo.MediaData[mediaCnt].mediaInfo.CoderInfo.unCoderPayloadType = 0; |
| 468 : | mediaInfo.MediaData[mediaCnt].mediaInfo.CoderInfo.unRedPayloadType = 0; | ||
| 469 : | mediaCnt++; | ||
| 470 : | |||
| 471 : | /* local audio | ||
| 472 : | jtarlton | 131 | */ |
| 473 : | jtarlton | 311 | mediaInfo.MediaData[mediaCnt].eMediaType = MEDIATYPE_AUDIO_LOCAL_CODER_INFO; |
| 474 : | jtarlton | 131 | mediaInfo.MediaData[mediaCnt].mediaInfo.CoderInfo.eCoderType = CODER_TYPE_G711ULAW64K; |
| 475 : | mediaInfo.MediaData[mediaCnt].mediaInfo.CoderInfo.eFrameSize = CODER_FRAMESIZE_20; | ||
| 476 : | jtarlton | 41 | mediaInfo.MediaData[mediaCnt].mediaInfo.CoderInfo.unFramesPerPkt = 1; |
| 477 : | jtarlton | 131 | mediaInfo.MediaData[mediaCnt].mediaInfo.CoderInfo.eVadEnable = CODER_VAD_ENABLE; |
| 478 : | jtarlton | 41 | mediaInfo.MediaData[mediaCnt].mediaInfo.CoderInfo.unCoderPayloadType = 0; |
| 479 : | mediaInfo.MediaData[mediaCnt].mediaInfo.CoderInfo.unRedPayloadType = 0; | ||
| 480 : | mediaCnt++; | ||
| 481 : | |||
| 482 : | /* remote audio ports and IP addresses | ||
| 483 : | */ | ||
| 484 : | mediaInfo.MediaData[mediaCnt].eMediaType = MEDIATYPE_AUDIO_REMOTE_RTP_INFO; | ||
| 485 : | jtarlton | 162 | copy_string_to_c_array(remote_rtp_audio.getAddress(), |
| 486 : | mediaInfo.MediaData[mediaCnt].mediaInfo.PortInfo.cIPAddress, | ||
| 487 : | jtarlton | 210 | IP_ADDR_SIZE); |
| 488 : | jtarlton | 131 | mediaInfo.MediaData[mediaCnt].mediaInfo.PortInfo.unPortId = remote_rtp_audio.getPort(); |
| 489 : | jtarlton | 41 | mediaCnt++; |
| 490 : | |||
| 491 : | jtarlton | 390 | mediaInfo.MediaData[mediaCnt].eMediaType = MEDIATYPE_AUDIO_REMOTE_RTCP_INFO; |
| 492 : | jtarlton | 162 | copy_string_to_c_array(remote_rtcp_audio.getAddress(), |
| 493 : | mediaInfo.MediaData[mediaCnt].mediaInfo.PortInfo.cIPAddress, | ||
| 494 : | jtarlton | 210 | IP_ADDR_SIZE); |
| 495 : | jtarlton | 131 | mediaInfo.MediaData[mediaCnt].mediaInfo.PortInfo.unPortId = remote_rtcp_audio.getPort(); |
| 496 : | jtarlton | 41 | mediaCnt++; |
| 497 : | |||
| 498 : | jtarlton | 390 | /* remote video |
| 499 : | */ | ||
| 500 : | mediaInfo.MediaData[mediaCnt].eMediaType = MEDIATYPE_VIDEO_REMOTE_CODER_INFO; | ||
| 501 : | INIT_IPM_VIDEO_CODER_INFO(&mediaInfo.MediaData[mediaCnt].mediaInfo.VideoCoderInfo); | ||
| 502 : | mediaInfo.MediaData[mediaCnt].mediaInfo.CoderInfo.eCoderType = CODER_TYPE_H263; | ||
| 503 : | mediaInfo.MediaData[mediaCnt].mediaInfo.CoderInfo.unCoderPayloadType = 34; | ||
| 504 : | |||
| 505 : | IPM_VIDEO_CODER_INFO_EX remoteVideoCoderInfoEx; | ||
| 506 : | INIT_IPM_VIDEO_CODER_INFO_EX(&remoteVideoCoderInfoEx); | ||
| 507 : | remoteVideoCoderInfoEx.eProfile = VIDEO_PROFILE_0_H263; | ||
| 508 : | remoteVideoCoderInfoEx.eLevel = VIDEO_LEVEL_10_H263; | ||
| 509 : | jtarlton | 411 | remoteVideoCoderInfoEx.eImageWidth = VIDEO_IMAGE_WIDTH_352; //176; |
| 510 : | remoteVideoCoderInfoEx.eImageHeight = VIDEO_IMAGE_HEIGHT_288; //144; | ||
| 511 : | jtarlton | 390 | remoteVideoCoderInfoEx.eFramesPerSec = VIDEO_FRAMESPERSEC_15; |
| 512 : | remoteVideoCoderInfoEx.unBitRate = 90000; | ||
| 513 : | remoteVideoCoderInfoEx.eSamplingRate = VIDEO_SAMPLING_RATE_DEFAULT; | ||
| 514 : | remoteVideoCoderInfoEx.unVisualConfigSize = 0; | ||
| 515 : | remoteVideoCoderInfoEx.szVisualConfiguration = NULL; | ||
| 516 : | mediaInfo.MediaData[mediaCnt].mediaInfo.VideoCoderInfo.pExtraCoderInfo = &remoteVideoCoderInfoEx; | ||
| 517 : | mediaCnt++; | ||
| 518 : | |||
| 519 : | /* local video | ||
| 520 : | */ | ||
| 521 : | mediaInfo.MediaData[mediaCnt].eMediaType = MEDIATYPE_VIDEO_LOCAL_CODER_INFO; | ||
| 522 : | INIT_IPM_VIDEO_CODER_INFO(&mediaInfo.MediaData[mediaCnt].mediaInfo.VideoCoderInfo); | ||
| 523 : | mediaInfo.MediaData[mediaCnt].mediaInfo.CoderInfo.eCoderType = CODER_TYPE_H263; | ||
| 524 : | mediaInfo.MediaData[mediaCnt].mediaInfo.CoderInfo.unCoderPayloadType = 34; | ||
| 525 : | |||
| 526 : | IPM_VIDEO_CODER_INFO_EX localVideoCoderInfoEx; | ||
| 527 : | INIT_IPM_VIDEO_CODER_INFO_EX(&localVideoCoderInfoEx); | ||
| 528 : | localVideoCoderInfoEx.eProfile = VIDEO_PROFILE_0_H263; | ||
| 529 : | localVideoCoderInfoEx.eLevel = VIDEO_LEVEL_10_H263; | ||
| 530 : | jtarlton | 411 | localVideoCoderInfoEx.eImageWidth = VIDEO_IMAGE_WIDTH_352; //176; |
| 531 : | localVideoCoderInfoEx.eImageHeight = VIDEO_IMAGE_HEIGHT_288; //144; | ||
| 532 : | jtarlton | 390 | localVideoCoderInfoEx.eFramesPerSec = VIDEO_FRAMESPERSEC_15; |
| 533 : | localVideoCoderInfoEx.unBitRate = 90000; | ||
| 534 : | localVideoCoderInfoEx.eSamplingRate = VIDEO_SAMPLING_RATE_DEFAULT; | ||
| 535 : | localVideoCoderInfoEx.unVisualConfigSize = 0; | ||
| 536 : | localVideoCoderInfoEx.szVisualConfiguration = NULL; | ||
| 537 : | mediaInfo.MediaData[mediaCnt].mediaInfo.VideoCoderInfo.pExtraCoderInfo = &localVideoCoderInfoEx; | ||
| 538 : | mediaCnt++; | ||
| 539 : | |||
| 540 : | /* remote video ports and IP addresses | ||
| 541 : | */ | ||
| 542 : | mediaInfo.MediaData[mediaCnt].eMediaType = MEDIATYPE_VIDEO_REMOTE_RTP_INFO; | ||
| 543 : | copy_string_to_c_array(remote_rtp_video.getAddress(), | ||
| 544 : | mediaInfo.MediaData[mediaCnt].mediaInfo.PortInfo.cIPAddress, | ||
| 545 : | IP_ADDR_SIZE); | ||
| 546 : | mediaInfo.MediaData[mediaCnt].mediaInfo.PortInfo.unPortId = remote_rtp_video.getPort(); | ||
| 547 : | mediaCnt++; | ||
| 548 : | |||
| 549 : | jtarlton | 411 | mediaInfo.MediaData[mediaCnt].eMediaType = MEDIATYPE_VIDEO_REMOTE_RTCP_INFO; |
| 550 : | jtarlton | 390 | copy_string_to_c_array(remote_rtcp_video.getAddress(), |
| 551 : | mediaInfo.MediaData[mediaCnt].mediaInfo.PortInfo.cIPAddress, | ||
| 552 : | IP_ADDR_SIZE); | ||
| 553 : | mediaInfo.MediaData[mediaCnt].mediaInfo.PortInfo.unPortId = remote_rtcp_video.getPort(); | ||
| 554 : | mediaCnt++; | ||
| 555 : | |||
| 556 : | /* done | ||
| 557 : | */ | ||
| 558 : | jtarlton | 41 | mediaInfo.unCount = mediaCnt; |
| 559 : | |||
| 560 : | jtarlton | 103 | LOGDEBUG("IpmDevice::startMedia() starting RTP streaming on device: " << |
| 561 : | jtarlton | 390 | devName_ << |
| 562 : | " remote_rtp_audio: " << remote_rtp_audio << | ||
| 563 : | " remote_rtcp_audio: " << remote_rtcp_audio << | ||
| 564 : | " remote_rtp_video: " << remote_rtp_video << | ||
| 565 : | " remote_rtcp_video: " << remote_rtcp_video); | ||
| 566 : | jtarlton | 41 | |
| 567 : | if ( ipm_StartMedia(devHandle_, &mediaInfo, DATA_IP_TDM_BIDIRECTIONAL, EV_ASYNC) == -1 ) | ||
| 568 : | { | ||
| 569 : | jtarlton | 131 | LOGERROR("ipm_StartMedia failed for device: " << devName_ << |
| 570 : | jtarlton | 41 | " with error: " << ATDV_ERRMSGP(devHandle_)); |
| 571 : | return false; | ||
| 572 : | } | ||
| 573 : | jtarlton | 131 | |
| 574 : | state_ = IPM_STARTING; | ||
| 575 : | jtarlton | 321 | busy_ = true; |
| 576 : | |||
| 577 : | jtarlton | 41 | return true; |
| 578 : | } | ||
| 579 : | |||
| 580 : | |||
| 581 : | /* | ||
| 582 : | jtarlton | 103 | * Forward to event specific handler. |
| 583 : | */ | ||
| 584 : | bool IpmDevice::processEvent( METAEVENT& metaevent ) | ||
| 585 : | { | ||
| 586 : | switch ( metaevent.evttype ) | ||
| 587 : | { | ||
| 588 : | case IPMEV_OPEN: | ||
| 589 : | onOpen(); | ||
| 590 : | break; | ||
| 591 : | |||
| 592 : | case IPMEV_EVENT_ENABLED: | ||
| 593 : | jtarlton | 131 | onEventEnabled(); |
| 594 : | jtarlton | 103 | break; |
| 595 : | |||
| 596 : | case IPMEV_GET_LOCAL_MEDIA_INFO: | ||
| 597 : | jtarlton | 154 | onLocalMediaInfo((IPM_MEDIA_INFO*)sr_getevtdatap()); |
| 598 : | jtarlton | 103 | break; |
| 599 : | |||
| 600 : | case IPMEV_STARTMEDIA: | ||
| 601 : | onStartMedia(); | ||
| 602 : | break; | ||
| 603 : | |||
| 604 : | case IPMEV_STOPPED: | ||
| 605 : | jtarlton | 275 | onStopped(); |
| 606 : | jtarlton | 103 | break; |
| 607 : | |||
| 608 : | amartin | 307 | case IPMEV_LISTEN: |
| 609 : | onListen(); | ||
| 610 : | break; | ||
| 611 : | |||
| 612 : | case IPMEV_UNLISTEN: | ||
| 613 : | onUnListen(); | ||
| 614 : | break; | ||
| 615 : | |||
| 616 : | jtarlton | 103 | case IPMEV_ERROR: |
| 617 : | onError(); | ||
| 618 : | break; | ||
| 619 : | |||
| 620 : | jtarlton | 390 | case IPMEV_TELEPHONY_EVENT: |
| 621 : | jtarlton | 394 | onTelephonyEvent((IPM_TELEPHONY_INFO*)sr_getevtdatap()); |
| 622 : | jtarlton | 390 | break; |
| 623 : | |||
| 624 : | jtarlton | 103 | case DMEV_GET_TX_PORT_INFO: |
| 625 : | jtarlton | 154 | onGetTxPortInfo((DM_PORT_INFO_LIST*)sr_getevtdatap()); |
| 626 : | jtarlton | 103 | break; |
| 627 : | |||
| 628 : | case DMEV_GET_RX_PORT_INFO: | ||
| 629 : | jtarlton | 154 | onGetRxPortInfo((DM_PORT_INFO_LIST*)sr_getevtdatap()); |
| 630 : | jtarlton | 103 | break; |
| 631 : | |||
| 632 : | case DMEV_GET_TX_PORT_INFO_FAIL: | ||
| 633 : | onPortGetFail(); | ||
| 634 : | break; | ||
| 635 : | |||
| 636 : | case DMEV_GET_RX_PORT_INFO_FAIL: | ||
| 637 : | onPortGetFail(); | ||
| 638 : | break; | ||
| 639 : | |||
| 640 : | case DMEV_PORT_CONNECT: | ||
| 641 : | onPortConnect(); | ||
| 642 : | break; | ||
| 643 : | |||
| 644 : | jtarlton | 390 | case DMEV_PORT_CONNECT_FAIL: |
| 645 : | amartin | 403 | onPortConnectFail(); |
| 646 : | jtarlton | 390 | break; |
| 647 : | |||
| 648 : | case DMEV_PORT_DISCONNECT: | ||
| 649 : | onPortDisconnect(); | ||
| 650 : | break; | ||
| 651 : | |||
| 652 : | case DMEV_PORT_DISCONNECT_FAIL: | ||
| 653 : | jtarlton | 394 | LOGERROR("IpmDevice::onPortDisconnectFail() device: " << devName_); |
| 654 : | jtarlton | 390 | break; |
| 655 : | |||
| 656 : | jtarlton | 103 | default: |
| 657 : | jtarlton | 131 | LOGWARN("IpmDevice::processEvent() unhandled event: 0x" << |
| 658 : | std::hex << metaevent.evttype << " for device: " << devName_); | ||
| 659 : | jtarlton | 103 | return false; |
| 660 : | } | ||
| 661 : | return true; | ||
| 662 : | } | ||
| 663 : | |||
| 664 : | |||
| 665 : | /* | ||
| 666 : | jtarlton | 64 | * Handler for IPMEV_OPEN events. |
| 667 : | jtarlton | 41 | */ |
| 668 : | void IpmDevice::onOpen() | ||
| 669 : | { | ||
| 670 : | jtarlton | 218 | LOGINFO("IpmDevice::onOpen() device: " << devName_); |
| 671 : | jtarlton | 41 | |
| 672 : | jtarlton | 417 | other_ = 0; |
| 673 : | jtarlton | 316 | |
| 674 : | jtarlton | 162 | /* Get and save the transmit timeslot on CTBus |
| 675 : | */ | ||
| 676 : | jtarlton | 103 | SC_TSINFO tsinfo; |
| 677 : | jtarlton | 41 | tsinfo.sc_numts = 1; |
| 678 : | jtarlton | 162 | tsinfo.sc_tsarrayp = getXmitTimeslotPtr(); |
| 679 : | jtarlton | 41 | if ( ipm_GetXmitSlot(devHandle_, &tsinfo, EV_SYNC) == -1 ) |
| 680 : | { | ||
| 681 : | jtarlton | 140 | LOGERROR("ipm_GetXmitSlot() failed" ); |
| 682 : | jtarlton | 41 | } |
| 683 : | |||
| 684 : | jtarlton | 394 | /* Enable dtmf events. |
| 685 : | */ | ||
| 686 : | eIPM_EVENT event = EVT_RFC2833; | ||
| 687 : | if ( ipm_EnableEvents(devHandle_, &event, 1, EV_ASYNC) < 0 ) | ||
| 688 : | { | ||
| 689 : | LOGERROR("ipm_EnableEvent() failed on device:" << devHandle_); | ||
| 690 : | } | ||
| 691 : | |||
| 692 : | jtarlton | 162 | /* Request port info |
| 693 : | */ | ||
| 694 : | jtarlton | 103 | if ( dev_GetTransmitPortInfo(devHandle_, this) == -1 ) |
| 695 : | jtarlton | 41 | { |
| 696 : | jtarlton | 140 | LOGERROR("dev_GetTransmitPortInfo() failed"); |
| 697 : | jtarlton | 41 | } |
| 698 : | jtarlton | 103 | if ( dev_GetReceivePortInfo(devHandle_, this) == -1 ) |
| 699 : | jtarlton | 41 | { |
| 700 : | jtarlton | 140 | LOGERROR("dev_GetReceivePortInfo() failed"); |
| 701 : | jtarlton | 41 | } |
| 702 : | |||
| 703 : | jtarlton | 390 | /* Request the local media information. |
| 704 : | jtarlton | 103 | */ |
| 705 : | jtarlton | 390 | IPM_MEDIA_INFO media_info; |
| 706 : | memset(&media_info, 0, sizeof(IPM_MEDIA_INFO)); | ||
| 707 : | media_info.unCount = 2; | ||
| 708 : | media_info.MediaData[0].eMediaType = MEDIATYPE_AUDIO_LOCAL_RTP_INFO; | ||
| 709 : | media_info.MediaData[1].eMediaType = MEDIATYPE_VIDEO_LOCAL_RTP_INFO; | ||
| 710 : | jtarlton | 41 | |
| 711 : | jtarlton | 390 | if ( ipm_GetLocalMediaInfo(devHandle_, &media_info, EV_ASYNC) == -1 ) |
| 712 : | jtarlton | 103 | { |
| 713 : | jtarlton | 390 | LOGERROR("ipm_GetLocalMediaInfo() failed for device: " << |
| 714 : | jtarlton | 103 | devName_ << " with error: " << ATDV_LASTERR(devHandle_)); |
| 715 : | } | ||
| 716 : | |||
| 717 : | /* update init state | ||
| 718 : | */ | ||
| 719 : | jtarlton | 41 | state_ = IPM_INITIALIZATION_START; |
| 720 : | initStepsRemaining_--; | ||
| 721 : | if ( initStepsRemaining_ == 0 ) | ||
| 722 : | { | ||
| 723 : | state_ = IPM_IDLE; | ||
| 724 : | } | ||
| 725 : | } | ||
| 726 : | |||
| 727 : | |||
| 728 : | /* | ||
| 729 : | jtarlton | 64 | * Handler for DMEV_GET_TX_PORT_INFO events. |
| 730 : | jtarlton | 41 | */ |
| 731 : | jtarlton | 390 | void IpmDevice::onGetTxPortInfo( DM_PORT_INFO_LIST* portInfoList ) |
| 732 : | jtarlton | 41 | { |
| 733 : | jtarlton | 218 | LOGINFO("IpmDevice::onGetTxPortInfo() device: " << devName_); |
| 734 : | jtarlton | 41 | |
| 735 : | jtarlton | 390 | txPortInfoList_ = *portInfoList; |
| 736 : | jtarlton | 413 | printPortInfoList(&txPortInfoList_); |
| 737 : | jtarlton | 41 | |
| 738 : | jtarlton | 390 | for ( unsigned int i = 0; i < txPortInfoList_.unCount; i++ ) |
| 739 : | { | ||
| 740 : | switch ( txPortInfoList_.port_info[i].port_media_type ) | ||
| 741 : | { | ||
| 742 : | case DM_PORT_MEDIA_TYPE_AUDIO: | ||
| 743 : | jtarlton | 413 | //memcpy(&audioPortTxInfo_, &txPortInfoList_.port_info[i], sizeof(DM_PORT_INFO)); |
| 744 : | audioPortTxInfo_ = txPortInfoList_.port_info[i]; | ||
| 745 : | jtarlton | 390 | break; |
| 746 : | |||
| 747 : | case DM_PORT_MEDIA_TYPE_VIDEO: | ||
| 748 : | jtarlton | 413 | //memcpy(&videoPortTxInfo_, &txPortInfoList_.port_info[i], sizeof(DM_PORT_INFO)); |
| 749 : | videoPortTxInfo_ = txPortInfoList_.port_info[i]; | ||
| 750 : | jtarlton | 390 | break; |
| 751 : | |||
| 752 : | default: | ||
| 753 : | break; | ||
| 754 : | } | ||
| 755 : | } | ||
| 756 : | |||
| 757 : | jtarlton | 41 | initStepsRemaining_--; |
| 758 : | if ( initStepsRemaining_ == 0 ) | ||
| 759 : | { | ||
| 760 : | state_ = IPM_IDLE; | ||
| 761 : | } | ||
| 762 : | } | ||
| 763 : | |||
| 764 : | |||
| 765 : | /* | ||
| 766 : | jtarlton | 64 | * Handler for DMEV_GET_RX_PORT_INFO events. |
| 767 : | jtarlton | 41 | */ |
| 768 : | jtarlton | 390 | void IpmDevice::onGetRxPortInfo( DM_PORT_INFO_LIST* portInfoList ) |
| 769 : | jtarlton | 41 | { |
| 770 : | jtarlton | 218 | LOGINFO("IpmDevice::onGetRxPortInfo() device: " << devName_); |
| 771 : | jtarlton | 41 | |
| 772 : | jtarlton | 390 | rxPortInfoList_ = *portInfoList; |
| 773 : | jtarlton | 413 | printPortInfoList(&rxPortInfoList_); |
| 774 : | jtarlton | 41 | |
| 775 : | jtarlton | 390 | for ( unsigned int i = 0; i < rxPortInfoList_.unCount; i++ ) |
| 776 : | { | ||
| 777 : | switch ( rxPortInfoList_.port_info[i].port_media_type ) | ||
| 778 : | { | ||
| 779 : | case DM_PORT_MEDIA_TYPE_AUDIO: | ||
| 780 : | jtarlton | 413 | //memcpy(&audioPortRxInfo_, &rxPortInfoList_.port_info[i], sizeof(DM_PORT_INFO)); |
| 781 : | audioPortRxInfo_ = rxPortInfoList_.port_info[i]; | ||
| 782 : | jtarlton | 390 | break; |
| 783 : | |||
| 784 : | case DM_PORT_MEDIA_TYPE_VIDEO: | ||
| 785 : | jtarlton | 413 | //memcpy(&videoPortRxInfo_, &rxPortInfoList_.port_info[i], sizeof(DM_PORT_INFO)); |
| 786 : | videoPortRxInfo_ = rxPortInfoList_.port_info[i]; | ||
| 787 : | jtarlton | 390 | break; |
| 788 : | |||
| 789 : | default: | ||
| 790 : | break; | ||
| 791 : | } | ||
| 792 : | } | ||
| 793 : | |||
| 794 : | jtarlton | 41 | initStepsRemaining_--; |
| 795 : | if ( initStepsRemaining_ == 0 ) | ||
| 796 : | { | ||
| 797 : | state_ = IPM_IDLE; | ||
| 798 : | } | ||
| 799 : | } | ||
| 800 : | |||
| 801 : | |||
| 802 : | /* | ||
| 803 : | jtarlton | 64 | * Handler for DMEV_GET_TX_PORT_INFO_FAIL and DMEV_GET_RX_PORT_INFO_FAIL |
| 804 : | * events. | ||
| 805 : | jtarlton | 41 | */ |
| 806 : | void IpmDevice::onPortGetFail() | ||
| 807 : | { | ||
| 808 : | jtarlton | 218 | LOGINFO("IpmDevice::onPortGetFail() device: " << devName_); |
| 809 : | jtarlton | 103 | |
| 810 : | jtarlton | 41 | state_ = IPM_INVALID; |
| 811 : | } | ||
| 812 : | |||
| 813 : | |||
| 814 : | /* | ||
| 815 : | jtarlton | 64 | * Handler for IPMEV_ERROR events. |
| 816 : | jtarlton | 41 | */ |
| 817 : | void IpmDevice::onError() | ||
| 818 : | { | ||
| 819 : | LOGERROR("IpmDevice::onError() device: " << devName_ << | ||
| 820 : | " error: " << ATDV_ERRMSGP(devHandle_)); | ||
| 821 : | jtarlton | 103 | |
| 822 : | jtarlton | 41 | state_ = IPM_INVALID; |
| 823 : | } | ||
| 824 : | |||
| 825 : | |||
| 826 : | /* | ||
| 827 : | jtarlton | 394 | * Handler for IPMEV_TELEPHONY_EVENT events. |
| 828 : | */ | ||
| 829 : | void IpmDevice::onTelephonyEvent( IPM_TELEPHONY_INFO* info ) | ||
| 830 : | { | ||
| 831 : | LOGINFO("IpmDevice::processEvent() IPMEV_TELEPHONY_EVENT device: " << devName_ ); | ||
| 832 : | const std::string dtmf = "0123456789*#"; | ||
| 833 : | |||
| 834 : | switch ( info->eTelInfoType ) | ||
| 835 : | { | ||
| 836 : | case TEL_INFOTYPE_EVENT: | ||
| 837 : | { | ||
| 838 : | int event_id = info->TelephonyInfo.TelEvtInfo.eTelephonyEventID; | ||
| 839 : | jtarlton | 396 | LOGDEBUG("TelephonyEventID: 0x" << std::hex << event_id); |
| 840 : | jtarlton | 394 | if ( event_id >= 0 && event_id <= 11 ) |
| 841 : | { | ||
| 842 : | jtarlton | 395 | channelMgr_.onDtmf(ipt_, dtmf.substr(event_id, 1), 100); /* fake duration */ |
| 843 : | jtarlton | 394 | } |
| 844 : | break; | ||
| 845 : | } | ||
| 846 : | |||
| 847 : | default: | ||
| 848 : | break; | ||
| 849 : | |||
| 850 : | } | ||
| 851 : | } | ||
| 852 : | |||
| 853 : | |||
| 854 : | /* | ||
| 855 : | jtarlton | 390 | * Handler for IPMEV_GET_LOCAL_MEDIA_INFO events. |
| 856 : | */ | ||
| 857 : | void IpmDevice::onLocalMediaInfo( IPM_MEDIA_INFO* mediaInfo ) | ||
| 858 : | { | ||
| 859 : | LOGINFO("IpmDevice::onLocalMediaInfo() device: " << devName_); | ||
| 860 : | printMediaInfo(mediaInfo); | ||
| 861 : | |||
| 862 : | for( unsigned int i = 0; i < mediaInfo->unCount; i++ ) | ||
| 863 : | { | ||
| 864 : | switch ( mediaInfo->MediaData[i].eMediaType ) | ||
| 865 : | { | ||
| 866 : | case MEDIATYPE_AUDIO_LOCAL_RTP_INFO: | ||
| 867 : | localRtpAudio_.setAddress(mediaInfo->MediaData[i].mediaInfo.PortInfo.cIPAddress); | ||
| 868 : | localRtpAudio_.setPort(mediaInfo->MediaData[i].mediaInfo.PortInfo.unPortId); | ||
| 869 : | break; | ||
| 870 : | |||
| 871 : | case MEDIATYPE_AUDIO_LOCAL_RTCP_INFO: | ||
| 872 : | localRtcpAudio_.setAddress(mediaInfo->MediaData[i].mediaInfo.PortInfo.cIPAddress); | ||
| 873 : | localRtcpAudio_.setPort(mediaInfo->MediaData[i].mediaInfo.PortInfo.unPortId); | ||
| 874 : | break; | ||
| 875 : | |||
| 876 : | case MEDIATYPE_VIDEO_LOCAL_RTP_INFO: | ||
| 877 : | localRtpVideo_.setAddress(mediaInfo->MediaData[i].mediaInfo.PortInfo.cIPAddress); | ||
| 878 : | localRtpVideo_.setPort(mediaInfo->MediaData[i].mediaInfo.PortInfo.unPortId); | ||
| 879 : | break; | ||
| 880 : | |||
| 881 : | case MEDIATYPE_VIDEO_LOCAL_RTCP_INFO: | ||
| 882 : | localRtcpVideo_.setAddress(mediaInfo->MediaData[i].mediaInfo.PortInfo.cIPAddress); | ||
| 883 : | localRtcpVideo_.setPort(mediaInfo->MediaData[i].mediaInfo.PortInfo.unPortId); | ||
| 884 : | break; | ||
| 885 : | |||
| 886 : | default: | ||
| 887 : | break; | ||
| 888 : | } | ||
| 889 : | } | ||
| 890 : | } | ||
| 891 : | |||
| 892 : | |||
| 893 : | /* | ||
| 894 : | jtarlton | 64 | * Handler for IPMEV_EVENT_ENABLED events |
| 895 : | jtarlton | 41 | */ |
| 896 : | jtarlton | 64 | void IpmDevice::onEventEnabled() |
| 897 : | jtarlton | 41 | { |
| 898 : | jtarlton | 218 | LOGINFO("IpmDevice::onEventEnabled() device: " << devName_); |
| 899 : | jtarlton | 103 | |
| 900 : | jtarlton | 41 | initStepsRemaining_--; |
| 901 : | if ( initStepsRemaining_ == 0 ) | ||
| 902 : | { | ||
| 903 : | state_ = IPM_IDLE; | ||
| 904 : | } | ||
| 905 : | } | ||
| 906 : | |||
| 907 : | |||
| 908 : | /* | ||
| 909 : | jtarlton | 64 | * Handler for IPMEV_STARTMEDIA events. |
| 910 : | jtarlton | 41 | */ |
| 911 : | void IpmDevice::onStartMedia() | ||
| 912 : | { | ||
| 913 : | jtarlton | 218 | LOGINFO("IpmDevice::onStartMedia() device: " << devName_); |
| 914 : | jtarlton | 321 | state_ = IPM_STREAMING; |
| 915 : | busy_ = false; | ||
| 916 : | processPendingCommand(); | ||
| 917 : | jtarlton | 41 | } |
| 918 : | |||
| 919 : | |||
| 920 : | /* | ||
| 921 : | jtarlton | 64 | * Handler for IPMEV_STOPPED events. |
| 922 : | jtarlton | 41 | */ |
| 923 : | void IpmDevice::onStopped() | ||
| 924 : | { | ||
| 925 : | jtarlton | 218 | LOGINFO("IpmDevice::onStopped() device: " << devName_); |
| 926 : | jtarlton | 41 | state_ = IPM_IDLE; |
| 927 : | jtarlton | 321 | busy_ = false; |
| 928 : | processPendingCommand(); | ||
| 929 : | jtarlton | 41 | } |
| 930 : | |||
| 931 : | |||
| 932 : | /* | ||
| 933 : | jtarlton | 390 | * Handler for IPMEV_LISTEN events. |
| 934 : | jtarlton | 41 | */ |
| 935 : | jtarlton | 390 | void IpmDevice::onListen() |
| 936 : | jtarlton | 41 | { |
| 937 : | jtarlton | 390 | LOGINFO("IpmDevice::onListen() device: " << devName_); |
| 938 : | busy_ = false; | ||
| 939 : | processPendingCommand(); | ||
| 940 : | } | ||
| 941 : | jtarlton | 103 | |
| 942 : | jtarlton | 390 | |
| 943 : | /* | ||
| 944 : | * Handler for IPMEV__UNLISTEN events. | ||
| 945 : | */ | ||
| 946 : | void IpmDevice::onUnListen() | ||
| 947 : | { | ||
| 948 : | LOGINFO("IpmDevice::onUnListen() device: " << devName_); | ||
| 949 : | busy_ = false; | ||
| 950 : | processPendingCommand(); | ||
| 951 : | jtarlton | 41 | } |
| 952 : | |||
| 953 : | jtarlton | 311 | |
| 954 : | amartin | 307 | /* |
| 955 : | jtarlton | 390 | * Handler for DMEV_PORT_CONNECT events. |
| 956 : | amartin | 307 | */ |
| 957 : | jtarlton | 390 | void IpmDevice::onPortConnect() |
| 958 : | amartin | 307 | { |
| 959 : | jtarlton | 390 | LOGINFO("IpmDevice::onPortConnect() device: " << devName_); |
| 960 : | jtarlton | 321 | busy_ = false; |
| 961 : | processPendingCommand(); | ||
| 962 : | amartin | 307 | } |
| 963 : | jtarlton | 41 | |
| 964 : | amartin | 403 | /* |
| 965 : | * Handler for DMEV_PORT_CONNECT_FAIL events. | ||
| 966 : | */ | ||
| 967 : | void IpmDevice::onPortConnectFail() | ||
| 968 : | { | ||
| 969 : | LOGERROR("IpmDevice::onPortConnectFail() device: " << devName_); | ||
| 970 : | busy_ = false; | ||
| 971 : | processPendingCommand(); | ||
| 972 : | } | ||
| 973 : | jtarlton | 311 | |
| 974 : | amartin | 307 | /* |
| 975 : | jtarlton | 390 | * Handler for DMEV_PORT_DISCONNECT events. |
| 976 : | amartin | 307 | */ |
| 977 : | jtarlton | 390 | void IpmDevice::onPortDisconnect() |
| 978 : | amartin | 307 | { |
| 979 : | jtarlton | 390 | LOGINFO("IpmDevice::onPortDisconnect() device: " << devName_); |
| 980 : | jtarlton | 321 | busy_ = false; |
| 981 : | processPendingCommand(); | ||
| 982 : | amartin | 307 | } |
| 983 : | jtarlton | 103 | |
| 984 : | jtarlton | 311 | |
| 985 : | jtarlton | 103 | /* |
| 986 : | jtarlton | 413 | * print all structs in the list |
| 987 : | jtarlton | 103 | */ |
| 988 : | jtarlton | 413 | void IpmDevice::printPortInfoList( DM_PORT_INFO_LIST* portInfoList ) const |
| 989 : | jtarlton | 103 | { |
| 990 : | jtarlton | 413 | for ( unsigned int i = 0; i < portInfoList->unCount; i++ ) |
| 991 : | { | ||
| 992 : | printPortInfo(&portInfoList->port_info[i]); | ||
| 993 : | } | ||
| 994 : | } | ||
| 995 : | |||
| 996 : | /* | ||
| 997 : | * print the struct | ||
| 998 : | */ | ||
| 999 : | void IpmDevice::printPortInfo( DM_PORT_INFO* portInfo ) const | ||
| 1000 : | { | ||
| 1001 : | jtarlton | 103 | std::stringstream ss; |
| 1002 : | |||
| 1003 : | jtarlton | 413 | ss << "MediaType: " << portInfo->port_media_type << " "; |
| 1004 : | if ( portInfo->port_media_type == DM_PORT_MEDIA_TYPE_AUDIO ) | ||
| 1005 : | jtarlton | 103 | { |
| 1006 : | jtarlton | 413 | ss << "Audio"; |
| 1007 : | jtarlton | 103 | } |
| 1008 : | jtarlton | 413 | else if ( portInfo->port_media_type == DM_PORT_MEDIA_TYPE_VIDEO ) |
| 1009 : | { | ||
| 1010 : | ss << "Video"; | ||
| 1011 : | } | ||
| 1012 : | else if ( portInfo->port_media_type == DM_PORT_MEDIA_TYPE_NBUP ) | ||
| 1013 : | { | ||
| 1014 : | ss << "NBUP"; | ||
| 1015 : | } | ||
| 1016 : | else | ||
| 1017 : | { | ||
| 1018 : | ss << portInfo->port_media_type; | ||
| 1019 : | } | ||
| 1020 : | ss << " DeviceID: "; | ||
| 1021 : | for ( size_t i = 0; i < sizeof(portInfo->device_ID); i++ ) | ||
| 1022 : | { | ||
| 1023 : | ss << std::setw(2) << std::setfill('0') << std::hex << (unsigned int)portInfo->device_ID[i]; | ||
| 1024 : | } | ||
| 1025 : | ss << " PortID: "; | ||
| 1026 : | for ( size_t i = 0; i < sizeof(portInfo->port_ID); i++ ) | ||
| 1027 : | { | ||
| 1028 : | ss << std::setw(2) << std::setfill('0') << std::hex << (unsigned int) portInfo->port_ID[i]; | ||
| 1029 : | } | ||
| 1030 : | jtarlton | 103 | LOGDEBUG(ss.str()); |
| 1031 : | } | ||
| 1032 : | |||
| 1033 : | |||
| 1034 : | /* | ||
| 1035 : | * Debug aid | ||
| 1036 : | */ | ||
| 1037 : | void IpmDevice::printMediaInfo( IPM_MEDIA_INFO* mediaInfo ) const | ||
| 1038 : | { | ||
| 1039 : | std::stringstream ss; | ||
| 1040 : | for ( unsigned int i = 0; i < mediaInfo->unCount; i++ ) | ||
| 1041 : | { | ||
| 1042 : | ss << "MediaType = "; | ||
| 1043 : | switch ( mediaInfo->MediaData[i].eMediaType ) | ||
| 1044 : | { | ||
| 1045 : | case MEDIATYPE_VIDEO_LOCAL_RTP_INFO: | ||
| 1046 : | ss << "MEDIATYPE_VIDEO_LOCAL_RTP_INFO"; | ||
| 1047 : | break; | ||
| 1048 : | |||
| 1049 : | case MEDIATYPE_VIDEO_LOCAL_RTCP_INFO: | ||
| 1050 : | ss << "MEDIATYPE_VIDEO_LOCAL_RTCP_INFO"; | ||
| 1051 : | break; | ||
| 1052 : | |||
| 1053 : | case MEDIATYPE_AUDIO_LOCAL_RTP_INFO: | ||
| 1054 : | ss << "MEDIATYPE_AUDIO_LOCAL_RTP_INFO"; | ||
| 1055 : | break; | ||
| 1056 : | |||
| 1057 : | case MEDIATYPE_AUDIO_LOCAL_RTCP_INFO: | ||
| 1058 : | ss << "MEDIATYPE_AUDIO_LOCAL_RTCP_INFO"; | ||
| 1059 : | break; | ||
| 1060 : | |||
| 1061 : | case MEDIATYPE_NBUP_LOCAL_RTP_INFO: | ||
| 1062 : | ss << "MEDIATYPE_NBUP_LOCAL_RTP_INFO"; | ||
| 1063 : | break; | ||
| 1064 : | |||
| 1065 : | default: | ||
| 1066 : | ss << "MEDIATYPE_??? " << mediaInfo->MediaData[i].eMediaType; | ||
| 1067 : | break; | ||
| 1068 : | } | ||
| 1069 : | ss << " IP = " << mediaInfo->MediaData[i].mediaInfo.PortInfo.cIPAddress; | ||
| 1070 : | ss << " Port = " << mediaInfo->MediaData[i].mediaInfo.PortInfo.unPortId; | ||
| 1071 : | ss << std::endl; | ||
| 1072 : | } | ||
| 1073 : | LOGDEBUG(ss.str()); | ||
| 1074 : | } | ||
| 1075 : | |||
| 1076 : | |||
| 1077 : | jtarlton | 390 | /* |
| 1078 : | * load local information into the sdp | ||
| 1079 : | * XXX 'response' sdpS should return all 'm' (media) headers that were 'offered' | ||
| 1080 : | * with unused/unsupported ones having their port set to 0. | ||
| 1081 : | */ | ||
| 1082 : | void IpmDevice::buildLocalSdp( sdpSessionDescription& sdp ) const | ||
| 1083 : | { | ||
| 1084 : | /* get here so it can be used for the origin address */ | ||
| 1085 : | IpInfo audio_media; | ||
| 1086 : | getLocalMediaInfo(MEDIATYPE_AUDIO_LOCAL_RTP_INFO, audio_media); | ||
| 1087 : | |||
| 1088 : | sdp.version()->setVersion("0"); | ||
| 1089 : | |||
| 1090 : | sdp.origin()->setUserName("DiaStarServer"); | ||
| 1091 : | sdp.origin()->setNetworkType("IN"); | ||
| 1092 : | sdp.origin()->setAddressType("IP4"); | ||
| 1093 : | sdp.origin()->setAddress(audio_media.getAddress().c_str()); | ||
| 1094 : | |||
| 1095 : | time_t t; | ||
| 1096 : | time(&t); | ||
| 1097 : | std::stringstream sessionIdandVersion; | ||
| 1098 : | sessionIdandVersion << t; | ||
| 1099 : | sdp.origin()->setSessionId(sessionIdandVersion.str().c_str()); | ||
| 1100 : | sdp.origin()->setVersion(sessionIdandVersion.str().c_str()); | ||
| 1101 : | |||
| 1102 : | sdp.sessionName()->setName("DiaStarServer"); | ||
| 1103 : | |||
| 1104 : | sdpTimeDescription* timeDescription = sdp.timeDescriptionList()->addItem(); | ||
| 1105 : | timeDescription->time()->setStart(0); | ||
| 1106 : | timeDescription->time()->setStop(0); | ||
| 1107 : | |||
| 1108 : | /* media | ||
| 1109 : | */ | ||
| 1110 : | sdpMediaDescriptionList* mdList = sdp.mediaDescriptionList(); | ||
| 1111 : | mdList->clear(); | ||
| 1112 : | |||
| 1113 : | /* audio | ||
| 1114 : | */ | ||
| 1115 : | sdpMediaDescription* audioMD = mdList->addItem(); | ||
| 1116 : | audioMD->connection()->setNetworkType("IN"); | ||
| 1117 : | audioMD->connection()->setAddressType("IP4"); | ||
| 1118 : | audioMD->connection()->setAddress(audio_media.getAddress().c_str()); | ||
| 1119 : | |||
| 1120 : | sdpMedia* audioMedia = audioMD->media(); | ||
| 1121 : | audioMedia->setMedia("audio"); | ||
| 1122 : | audioMedia->setPort(audio_media.getPort()); | ||
| 1123 : | audioMedia->setTransport("RTP/AVP"); | ||
| 1124 : | audioMedia->setNumPorts(1); | ||
| 1125 : | audioMedia->addFormat("0"); /* PCMU/8000 */ | ||
| 1126 : | audioMedia->addFormat("101"); /* telephone-event/8000 */ | ||
| 1127 : | |||
| 1128 : | sdpAttributeList* audioAttrList = audioMD->attributeList(); | ||
| 1129 : | sdpAttribute* audioAttribute = audioAttrList->addItem(); | ||
| 1130 : | audioAttribute->setProperty("rtpmap"); | ||
| 1131 : | audioAttribute->setPropertyValue("0 PCMU/8000"); | ||
| 1132 : | |||
| 1133 : | audioAttribute = audioAttrList->addItem(); | ||
| 1134 : | audioAttribute->setProperty("rtpmap"); | ||
| 1135 : | audioAttribute->setPropertyValue("101 telephone-event/8000"); | ||
| 1136 : | |||
| 1137 : | audioAttribute = audioAttrList->addItem(); | ||
| 1138 : | audioAttribute->setProperty("sendrecv"); | ||
| 1139 : | audioAttribute->setPropertyValue(""); | ||
| 1140 : | |||
| 1141 : | /* video | ||
| 1142 : | */ | ||
| 1143 : | IpInfo video_media; | ||
| 1144 : | if ( getLocalMediaInfo(MEDIATYPE_VIDEO_LOCAL_RTP_INFO, video_media) ) | ||
| 1145 : | { | ||
| 1146 : | sdpMediaDescription* videoMD = mdList->addItem(); | ||
| 1147 : | videoMD->connection()->setNetworkType("IN"); | ||
| 1148 : | videoMD->connection()->setAddressType("IP4"); | ||
| 1149 : | videoMD->connection()->setAddress(video_media.getAddress().c_str()); | ||
| 1150 : | |||
| 1151 : | sdpMedia* videoMedia = videoMD->media(); | ||
| 1152 : | videoMedia->setMedia("video"); | ||
| 1153 : | videoMedia->setPort(video_media.getPort()); | ||
| 1154 : | videoMedia->setTransport("RTP/AVP"); | ||
| 1155 : | videoMedia->setNumPorts(1); | ||
| 1156 : | videoMedia->addFormat("34"); /* H263/90000 */ | ||
| 1157 : | |||
| 1158 : | sdpAttributeList* videoAttrList = videoMD->attributeList(); | ||
| 1159 : | sdpAttribute* videoAttribute = videoAttrList->addItem(); | ||
| 1160 : | videoAttribute->setProperty("rtpmap"); | ||
| 1161 : | videoAttribute->setPropertyValue("34 H263/90000"); | ||
| 1162 : | |||
| 1163 : | videoAttribute = videoAttrList->addItem(); | ||
| 1164 : | videoAttribute->setProperty("fmtp"); | ||
| 1165 : | jtarlton | 412 | videoAttribute->setPropertyValue("34 CIF=2"); |
| 1166 : | jtarlton | 390 | |
| 1167 : | videoAttribute = videoAttrList->addItem(); | ||
| 1168 : | videoAttribute->setProperty("sendrecv"); | ||
| 1169 : | videoAttribute->setPropertyValue(""); | ||
| 1170 : | |||
| 1171 : | videoMD->bandwidth()->setModifier("AS"); | ||
| 1172 : | videoMD->bandwidth()->setBandwidthValue("90"); | ||
| 1173 : | } | ||
| 1174 : | } | ||
| 1175 : | |||
| 1176 : | |||
| 1177 : | /* | ||
| 1178 : | * Set the dtmf signalling mode. | ||
| 1179 : | */ | ||
| 1180 : | void IpmDevice::setDtmfMode( DtmfMode dtmf_mode ) | ||
| 1181 : | { | ||
| 1182 : | IPM_PARM_INFO parmInfo; | ||
| 1183 : | |||
| 1184 : | switch ( dtmf_mode ) | ||
| 1185 : | { | ||
| 1186 : | case DTMF_RFC2833: | ||
| 1187 : | { | ||
| 1188 : | eIPM_DTMFXFERMODE value = DTMFXFERMODE_RFC2833; | ||
| 1189 : | parmInfo.eParm = PARMCH_DTMFXFERMODE; | ||
| 1190 : | parmInfo.pvParmValue = &value; | ||
| 1191 : | LOGINFO("IpmDevice::setDtmfMode() using RFC2833"); | ||
| 1192 : | if ( ipm_SetParm(devHandle_, &parmInfo, EV_SYNC) < 0 ) | ||
| 1193 : | { | ||
| 1194 : | LOGERROR("Error in ipm_SetParm()\n"); | ||
| 1195 : | } | ||
| 1196 : | |||
| 1197 : | int rfc2833PayloadType = 101; | ||
| 1198 : | |||
| 1199 : | parmInfo.eParm = PARMCH_RFC2833EVT_TX_PLT; | ||
| 1200 : | parmInfo.pvParmValue = &rfc2833PayloadType; | ||
| 1201 : | if ( ipm_SetParm(devHandle_, &parmInfo, EV_SYNC) < 0 ) | ||
| 1202 : | { | ||
| 1203 : | LOGERROR("Error in ipm_SetParm()\n"); | ||
| 1204 : | } | ||
| 1205 : | |||
| 1206 : | parmInfo.eParm = PARMCH_RFC2833EVT_RX_PLT; | ||
| 1207 : | parmInfo.pvParmValue = &rfc2833PayloadType; | ||
| 1208 : | if ( ipm_SetParm(devHandle_, &parmInfo, EV_SYNC) < 0 ) | ||
| 1209 : | { | ||
| 1210 : | LOGERROR("Error in ipm_SetParm()\n"); | ||
| 1211 : | } | ||
| 1212 : | } | ||
| 1213 : | break; | ||
| 1214 : | |||
| 1215 : | case DTMF_INBAND: | ||
| 1216 : | { | ||
| 1217 : | eIPM_DTMFXFERMODE value = DTMFXFERMODE_INBAND; | ||
| 1218 : | parmInfo.eParm = PARMCH_DTMFXFERMODE; | ||
| 1219 : | parmInfo.pvParmValue = &value; | ||
| 1220 : | |||
| 1221 : | LOGINFO("IpmDevice::setDtmfMode() using inband audio"); | ||
| 1222 : | if ( ipm_SetParm(devHandle_, &parmInfo, EV_SYNC) < 0 ) | ||
| 1223 : | { | ||
| 1224 : | LOGERROR("Error in ipm_SetParm()\n"); | ||
| 1225 : | } | ||
| 1226 : | } | ||
| 1227 : | break; | ||
| 1228 : | } | ||
| 1229 : | } | ||
| 1230 : | |||
| 1231 : | |||
| 1232 : | jtarlton | 41 | /* vim:ts=4:set nu: |
| 1233 : | * EOF | ||
| 1234 : | */ |
| No admin address has been configured | ViewVC Help |
| Powered by ViewVC 1.0.8 |