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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 403 - (view) (download)

1 : amartin 378 /*
2 :     * This file is part of Project DiaStar Server.
3 :     *
4 :     * More information about this project can be found at:
5 :     * http://www.projectdiastar.org.
6 :     *
7 :     * Copyright (C) 2009 Dialogic Corp.
8 :     *
9 :     * 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 :     */
27 :    
28 :     /*!
29 :     * \file mmdevice.cxx
30 :     * \brief Dialogic Multimedia device
31 :     * \author Antony Martin <antony.martin@dialogic.com>
32 :     * \author John Tarlton <john.tarlton@dialogic.com>
33 :     * \version 19-AUG-2009
34 :     */
35 :    
36 :     /*------------------------------ Dependencies --------------------------------*/
37 :    
38 :     #include <srllib.h>
39 :     #include <dxxxlib.h>
40 :    
41 :     #include "logger.h"
42 :    
43 :     #include "dialogicchannelmanager.h"
44 :     #include "mmdevice.h"
45 :    
46 :     /*----------------------------------------------------------------------------*/
47 :    
48 :     /*
49 :     * ctor
50 :     */
51 :     MmDevice::MmDevice( const std::string& name,
52 :     DialogicChannelManager& channelMgr )
53 :     : DialogicDevice(name, channelMgr),
54 : jtarlton 390 playActive_ (false),
55 :     recordActive_ (false),
56 :     mediaIsMpeg4_ (false),
57 :     mediaIsCif_ (false)
58 : amartin 378 {
59 : amartin 403 busy_ = false;
60 :     }
61 : amartin 378
62 : amartin 403 /*
63 :     * Process a command that was queueued because an async operation was in progress
64 :     * when it was initially requested.
65 :     */
66 :     void MmDevice::processPendingCommand()
67 :     {
68 :     if ( !pending_.empty() )
69 :     {
70 :     switch( pending_.front().cmd )
71 :     {
72 :     case MmCommand::CONNECT:
73 :     connect(pending_.front().other);
74 :     break;
75 :     case MmCommand::DISCONNECT:
76 :     disconnect();
77 :     break;
78 :     case MmCommand::PLAY:
79 :     play(pending_.front().audioFile, pending_.front().videoFile);
80 :     break;
81 :     case MmCommand::RECORD:
82 :     record(pending_.front().audioFile, pending_.front().videoFile);
83 :     break;
84 :     case MmCommand::STOPPLAY:
85 :     stopPlay();
86 :     break;
87 :     case MmCommand::STOPRECORD:
88 :     stopRecord();
89 :     break;
90 :     default:
91 :     break;
92 :     }
93 :     pending_.pop();
94 :     }
95 : amartin 378 }
96 :    
97 :     /*
98 :     * Open the device.
99 :     */
100 :     bool MmDevice::open()
101 :     {
102 :     LOGDEBUG("MmDevice::open() device: " << devName_);
103 : jtarlton 390 devHandle_ = mm_Open(devName_.c_str(), 0, NULL);
104 :     if ( devHandle_ == EMM_ERROR )
105 :     {
106 :     LOGERROR("mm_Open() failed");
107 :     return false;
108 :     }
109 : amartin 378 return true;
110 :     }
111 :    
112 :    
113 :     /*
114 :     * Close the device.
115 :     */
116 :     bool MmDevice::close()
117 :     {
118 :     LOGDEBUG("MmDevice::close() device: " << devName_);
119 : jtarlton 400 if ( devHandle_ > 0 )
120 : jtarlton 390 {
121 : jtarlton 400 if ( mm_Close(devHandle_, NULL) == EMM_ERROR )
122 :     {
123 :     LOGERROR("mm_Close() failed");
124 :     return false;
125 :     }
126 :     devHandle_ = 0;
127 : jtarlton 390 }
128 : amartin 378 return true;
129 :     }
130 :    
131 :    
132 :     /*
133 :     * Connect media.
134 :     */
135 : jtarlton 401 bool MmDevice::connect( DialogicDevice* other )
136 : amartin 378 {
137 : amartin 403 if ( listening_ != other )
138 :     {
139 :     if ( busy_ )
140 :     {
141 :     pending_.push(MmCommand(MmCommand::CONNECT, other));
142 :     return true;
143 :     }
144 :     LOGDEBUG("MmDevice::connect() device: " << devName_ <<
145 : amartin 378 " other: " << other->getDeviceName());
146 : jtarlton 390
147 : jtarlton 393 DM_PORT_CONNECT_INFO_LIST portConnectInfoList;
148 :     INIT_DM_PORT_CONNECT_INFO_LIST(&portConnectInfoList);
149 :    
150 :     int count = 0;
151 :    
152 :     INIT_DM_PORT_CONNECT_INFO(&portConnectInfoList.port_connect_info[count]);
153 :     portConnectInfoList.port_connect_info[count].unFlags = DMFL_TRANSCODE_ON;
154 :     portConnectInfoList.port_connect_info[count].port_info_tx = getAudioTxPortInfo();
155 : jtarlton 401 portConnectInfoList.port_connect_info[count].port_info_rx = other->getAudioRxPortInfo();
156 : jtarlton 393 count++;
157 :    
158 :     INIT_DM_PORT_CONNECT_INFO(&portConnectInfoList.port_connect_info[count]);
159 :     portConnectInfoList.port_connect_info[count].unFlags = DMFL_TRANSCODE_ON;
160 :     portConnectInfoList.port_connect_info[count].port_info_tx = getVideoTxPortInfo();
161 : jtarlton 401 portConnectInfoList.port_connect_info[count].port_info_rx = other->getVideoRxPortInfo();
162 : jtarlton 393 count++;
163 :    
164 :     portConnectInfoList.unCount = count;;
165 :     if ( dev_PortConnect(devHandle_, &portConnectInfoList, NULL) != DEV_SUCCESS )
166 :     {
167 : amartin 403 LOGERROR("MmDevice::connect() dev_PortConnect() failed on device: " << devName_ <<
168 : jtarlton 393 " " << ATDV_ERRMSGP(devHandle_));
169 :     return false;
170 :     }
171 :    
172 :     listening_ = other;
173 : amartin 403 busy_ = true;
174 : jtarlton 393 }
175 :     return true;
176 : amartin 378 }
177 :    
178 :    
179 :     /*
180 :     * Disconnect media.
181 :     */
182 : jtarlton 401 bool MmDevice::disconnect()
183 : amartin 378 {
184 : jtarlton 393 if ( listening_ )
185 :     {
186 : amartin 403 if ( busy_ )
187 :     {
188 :     pending_.push(MmCommand(MmCommand::DISCONNECT));
189 :     return true;
190 :     }
191 :    
192 :     LOGDEBUG("MmDevice::disconnect() device: " << devName_);
193 : jtarlton 393 DM_PORT_CONNECT_INFO_LIST portConnectInfoList;
194 :     INIT_DM_PORT_CONNECT_INFO_LIST(&portConnectInfoList);
195 :     int count = 0;
196 :    
197 :     INIT_DM_PORT_CONNECT_INFO(&portConnectInfoList.port_connect_info[count]);
198 :     portConnectInfoList.port_connect_info[count].port_info_tx = getAudioTxPortInfo();
199 : jtarlton 401 portConnectInfoList.port_connect_info[count].port_info_rx = listening_->getAudioRxPortInfo();
200 : jtarlton 393 count++;
201 :    
202 :     INIT_DM_PORT_CONNECT_INFO(&portConnectInfoList.port_connect_info[count]);
203 :     portConnectInfoList.port_connect_info[count].port_info_tx = getVideoTxPortInfo();
204 : jtarlton 401 portConnectInfoList.port_connect_info[count].port_info_rx = listening_->getVideoRxPortInfo();
205 : jtarlton 393 count++;
206 :    
207 :     portConnectInfoList.unCount = count;
208 :     if ( dev_PortDisconnect(devHandle_, &portConnectInfoList, NULL) != DEV_SUCCESS )
209 :     {
210 : amartin 403 LOGERROR("MmDevice::disconnect() dev_PortDisconnect() failed on device: " << devName_ <<
211 : jtarlton 393 " " << ATDV_ERRMSGP(devHandle_));
212 :     return false;
213 :     }
214 :    
215 :     listening_ = 0;
216 : amartin 403 busy_ = true;
217 : jtarlton 393 }
218 :     return true;
219 : amartin 378 }
220 :    
221 :    
222 :     /*
223 :     * handle events from Dialogic apiS
224 :     */
225 :     bool MmDevice::processEvent( METAEVENT& metaevent )
226 :     {
227 :     long evttype = metaevent.evttype;
228 : jtarlton 390
229 :     switch ( evttype )
230 :     {
231 :     case MMEV_OPEN:
232 : jtarlton 393 onOpen();
233 : jtarlton 390 break;
234 :    
235 : jtarlton 393 case MMEV_PLAY: /* mm_Play() completed successfully */
236 : jtarlton 390 onPlay();
237 :     break;
238 :    
239 : jtarlton 393 case MMEV_PLAY_ACK: /* mm_Play() started successfully */
240 : amartin 403 onPlayAck();
241 : jtarlton 393 break;
242 :    
243 : jtarlton 390 case MMEV_PLAY_FAIL:
244 :     onPlayFail();
245 :     break;
246 :    
247 :     case MMEV_PLAY_ACK_FAIL:
248 :     onPlayAckFail();
249 :     break;
250 :    
251 : jtarlton 399 case MMEV_RECORD:
252 :     onRecord();
253 :     break;
254 :    
255 : jtarlton 390 case MMEV_RECORD_ACK:
256 : jtarlton 399 LOGDEBUG("MmDevice::processEvent() MMEV_RECORD_ACK device: " << devName_);
257 : jtarlton 390 break;
258 :    
259 : jtarlton 399 case MMEV_RECORD_FAIL:
260 :     onRecordFail();
261 :     break;
262 :    
263 :     case MMEV_RECORD_ACK_FAIL:
264 : amartin 403 LOGWARN("MmDevice::processEvent() MMEV_RECORD_ACK_FAIL device: " << devName_);
265 : jtarlton 399 break;
266 :    
267 :     case MMEV_VIDEO_RECORD_STARTED:
268 : amartin 403 LOGWARN("MmDevice::processEvent() MMEV_VIDEO_RECORD_STARTED device: " << devName_);
269 : jtarlton 399 break;
270 :    
271 :     case MMEV_VIDEO_RECORD_STARTED_FAIL:
272 :     onRecordFail();
273 :     break;
274 :    
275 : jtarlton 390 case MMEV_STOP_ACK:
276 :     onStopAck();
277 :     break;
278 :    
279 :     case MMEV_STOP_ACK_FAIL:
280 :     onStopAckFail();
281 :     break;
282 :    
283 :     case MMEV_RESET:
284 :     onReset();
285 :     break;
286 :    
287 :     case MMEV_ERROR:
288 :     onError();
289 :     break;
290 :    
291 :     case DMEV_PORT_CONNECT:
292 : amartin 403 onPortConnect();
293 : jtarlton 390 break;
294 :    
295 :     case DMEV_PORT_CONNECT_FAIL:
296 : amartin 403 onPortConnectFail();
297 : jtarlton 390 break;
298 :    
299 :     case DMEV_PORT_DISCONNECT:
300 : amartin 403 onPortDisconnect();
301 : jtarlton 390 break;
302 :    
303 :     case DMEV_PORT_DISCONNECT_FAIL:
304 : amartin 403 onPortDisconnectFail();
305 : jtarlton 390 break;
306 :    
307 : jtarlton 393 case DMEV_GET_TX_PORT_INFO:
308 :     onGetTxPortInfo((DM_PORT_INFO_LIST*)sr_getevtdatap());
309 :     break;
310 :    
311 :     case DMEV_GET_RX_PORT_INFO:
312 :     onGetRxPortInfo((DM_PORT_INFO_LIST*)sr_getevtdatap());
313 :     break;
314 :    
315 : jtarlton 390 default:
316 : jtarlton 393 LOGDEBUG("MmDevice::processEvent() Unhandled event: " <<
317 :     std::hex << evttype << " " << ATDV_NAMEP(sr_getevtdev()));
318 : jtarlton 390 break;
319 :     }
320 : amartin 378 return true;
321 :     }
322 :    
323 :    
324 : jtarlton 390 /*
325 : jtarlton 393 * Handle MMEV_OPEN event.
326 :     */
327 :     void MmDevice::onOpen()
328 :     {
329 :     LOGDEBUG("MmDevice::processEvent() MMEV_OPEN device: " << devName_);
330 :    
331 :     /* Request port info
332 :     */
333 :     if ( dev_GetTransmitPortInfo(devHandle_, this) == -1 )
334 :     {
335 :     LOGERROR("dev_GetTransmitPortInfo() failed");
336 :     }
337 :     if ( dev_GetReceivePortInfo(devHandle_, this) == -1 )
338 :     {
339 :     LOGERROR("dev_GetReceivePortInfo() failed");
340 :     }
341 :     }
342 :    
343 : amartin 403 /*
344 :     * Handle DMEV_PORT_CONNECT event.
345 :     */
346 :     void MmDevice::onPortConnect()
347 :     {
348 :     LOGINFO("MmDevice::onPortConnect() device: " << devName_);
349 :     busy_ = false;
350 :     processPendingCommand();
351 :     }
352 : jtarlton 393
353 :     /*
354 : amartin 403 * Handle DMEV_PORT_CONNECT_FAIL event.
355 :     */
356 :     void MmDevice::onPortConnectFail()
357 :     {
358 :     LOGWARN("MmDevice::onPortConnectFail() device: " << devName_);
359 :     busy_ = false;
360 :     processPendingCommand();
361 :     }
362 :    
363 :     /*
364 :     * Handle DMEV_PORT_DISCONNECT event.
365 :     */
366 :     void MmDevice::onPortDisconnect()
367 :     {
368 :     LOGINFO("MmDevice::onPortDisconnect() device: " << devName_);
369 :     busy_ = false;
370 :     processPendingCommand();
371 :     }
372 :    
373 :     /*
374 :     * Handle DMEV_PORT_DISCONNECT_FAIL event.
375 :     */
376 :     void MmDevice::onPortDisconnectFail()
377 :     {
378 :     LOGWARN("MmDevice::onPortDisconnectFail() device: " << devName_);
379 :     busy_ = false;
380 :     processPendingCommand();
381 :     }
382 :    
383 :     /*
384 : jtarlton 390 * Handle MMEV_PLAY event.
385 :     */
386 :     void MmDevice::onPlay()
387 :     {
388 : jtarlton 393 LOGINFO("MmDevice::onPlay() device: " << devName_);
389 : amartin 403 if (playActive_)
390 :     {
391 :     playActive_ = false;
392 :     channelMgr_.onPlayCompleted(this);
393 :    
394 :     }
395 :     busy_ = false;
396 :     processPendingCommand();
397 : jtarlton 390 }
398 : amartin 378
399 : amartin 403 /*
400 :     * Handle MMEV_PLAY_ACK event.
401 :     */
402 :     void MmDevice::onPlayAck()
403 :     {
404 :     LOGINFO("MmDevice::onPlayAck() device: " << devName_);
405 :     busy_ = false;
406 :     processPendingCommand();
407 :     }
408 : jtarlton 390
409 : amartin 403
410 : jtarlton 390 /*
411 :     * Handle MMEV_PLAY_ACK_FAIL event.
412 :     */
413 :     void MmDevice::onPlayAckFail()
414 :     {
415 : jtarlton 393 LOGWARN("MmDevice::onPlayAckFail() device: " << devName_);
416 : jtarlton 399 playActive_ = false;
417 : amartin 403 busy_ = false;
418 :     processPendingCommand();
419 : jtarlton 390 }
420 :    
421 :    
422 :     /*
423 :     * Handle MMEV_PLAY_FAIL event.
424 :     */
425 :     void MmDevice::onPlayFail()
426 :     {
427 : jtarlton 399 LOGWARN("MmDevice::onPlayFail() device: " << devName_);
428 :     playActive_ = false;
429 :     channelMgr_.onPlayCompleted(this);
430 : amartin 403 busy_ = false;
431 :     processPendingCommand();
432 : jtarlton 390 }
433 :    
434 :    
435 :     /*
436 : jtarlton 399 * Handle MMEV_RECORD event.
437 : jtarlton 390 */
438 : jtarlton 399 void MmDevice::onRecord()
439 : jtarlton 390 {
440 : jtarlton 399 LOGINFO("MmDevice::onRecord() device: " << devName_);
441 :     channelMgr_.onRecordCompleted(this);
442 : amartin 403 busy_ = false;
443 :     processPendingCommand();
444 : jtarlton 390 }
445 :    
446 :    
447 :     /*
448 : jtarlton 399 * Handle MMEV_RECORD_FAIL event.
449 :     */
450 :     void MmDevice::onRecordFail()
451 :     {
452 :     LOGWARN("MmDevice::onRecordFail() device: " << devName_);
453 :     recordActive_ = false;
454 :     channelMgr_.onRecordCompleted(this);
455 : amartin 403 busy_ = false;
456 :     processPendingCommand();
457 : jtarlton 399 }
458 :    
459 :    
460 :     /*
461 : jtarlton 390 * Handle MMEV_STOP_ACK event.
462 :     */
463 :     void MmDevice::onStopAck()
464 :     {
465 : jtarlton 393 LOGINFO("MmDevice::onStopAck() device: " << devName_);
466 : amartin 403 if (playActive_)
467 :     {
468 :     playActive_ = false;
469 :     channelMgr_.onPlayCompleted(this);
470 :     busy_ = false;
471 :     processPendingCommand();
472 :     }
473 : jtarlton 390 }
474 :    
475 :    
476 :     /*
477 :     * Handle MMEV_STOP_ACK_FAIL event.
478 :     */
479 :     void MmDevice::onStopAckFail()
480 :     {
481 : jtarlton 393 LOGWARN("MmDevice::onStopAckFail() device: " << devName_);
482 : amartin 403 busy_ = false;
483 :     processPendingCommand();
484 : jtarlton 390 }
485 :    
486 :    
487 :     /*
488 :     * Handle MMEV_RESET event.
489 :     */
490 :     void MmDevice::onReset()
491 :     {
492 : jtarlton 393 LOGINFO("MmDevice::onReset() device: " << devName_);
493 : jtarlton 390 }
494 :    
495 :    
496 :     /*
497 :     * Handle MMEV_ERROR event.
498 :     */
499 :     void MmDevice::onError()
500 :     {
501 : jtarlton 393 LOGINFO("MmDevice::onError() device: " << devName_);
502 : jtarlton 390 }
503 :    
504 :    
505 : jtarlton 393 /*
506 :     * Handler for DMEV_GET_TX_PORT_INFO events.
507 :     */
508 :     void MmDevice::onGetTxPortInfo(DM_PORT_INFO_LIST* portInfoList )
509 :     {
510 :     LOGINFO("MmDevice::onGetTxPortInfo() device: " << devName_);
511 : jtarlton 390
512 : jtarlton 393 txPortInfoList_ = *portInfoList;
513 :     printPortInfo(&txPortInfoList_);
514 :    
515 :     for ( unsigned int i = 0; i < txPortInfoList_.unCount; i++ )
516 :     {
517 :     switch ( txPortInfoList_.port_info[i].port_media_type )
518 :     {
519 :     case DM_PORT_MEDIA_TYPE_AUDIO:
520 :     memcpy(&audioPortTxInfo_, &txPortInfoList_.port_info[i], sizeof(DM_PORT_INFO));
521 :     break;
522 :    
523 :     case DM_PORT_MEDIA_TYPE_VIDEO:
524 :     memcpy(&videoPortTxInfo_, &txPortInfoList_.port_info[i], sizeof(DM_PORT_INFO));
525 :     break;
526 :    
527 :     default:
528 :     break;
529 :     }
530 :     }
531 :     }
532 :    
533 :    
534 : jtarlton 390 /*
535 : jtarlton 393 * Handler for DMEV_GET_RX_PORT_INFO events.
536 :     */
537 :     void MmDevice::onGetRxPortInfo(DM_PORT_INFO_LIST* portInfoList )
538 :     {
539 :     LOGINFO("MmDevice::onGetRxPortInfo() device: " << devName_);
540 :    
541 :     rxPortInfoList_ = *portInfoList;
542 :     printPortInfo(&rxPortInfoList_);
543 :    
544 :     for ( unsigned int i = 0; i < rxPortInfoList_.unCount; i++ )
545 :     {
546 :     switch ( rxPortInfoList_.port_info[i].port_media_type )
547 :     {
548 :     case DM_PORT_MEDIA_TYPE_AUDIO:
549 :     memcpy(&audioPortRxInfo_, &rxPortInfoList_.port_info[i], sizeof(DM_PORT_INFO));
550 :     break;
551 :    
552 :     case DM_PORT_MEDIA_TYPE_VIDEO:
553 :     memcpy(&videoPortRxInfo_, &rxPortInfoList_.port_info[i], sizeof(DM_PORT_INFO));
554 :     break;
555 :    
556 :     default:
557 :     break;
558 :     }
559 :     }
560 :     }
561 :    
562 :    
563 :     /*
564 :     * Debug aid.
565 :     */
566 :     void MmDevice::printPortInfo( DM_PORT_INFO_LIST* portInfo ) const
567 :     {
568 :     std::stringstream ss;
569 :    
570 :     for ( unsigned int i = 0; i < portInfo->unCount; i++ )
571 :     {
572 :     DM_PORT_INFO& info = portInfo->port_info[i];
573 :     ss << "Port: " << i << " MediaType: " << info.port_media_type << " ";
574 :     if ( info.port_media_type == DM_PORT_MEDIA_TYPE_AUDIO )
575 :     {
576 :     ss << "Audio";
577 :     }
578 :     else if ( info.port_media_type == DM_PORT_MEDIA_TYPE_VIDEO )
579 :     {
580 :     ss << "Video";
581 :     }
582 :     else if ( info.port_media_type == DM_PORT_MEDIA_TYPE_NBUP )
583 :     {
584 :     ss << "NBUP";
585 :     }
586 :     else
587 :     {
588 :     ss << info.port_media_type;
589 :     }
590 :     ss << std::endl;
591 :     }
592 :     LOGDEBUG(ss.str());
593 :     }
594 :    
595 :    
596 :     /*
597 : jtarlton 390 * Start playing.
598 :     */
599 :     bool MmDevice::play( const std::string& audioFile,
600 :     const std::string& videoFile )
601 :     {
602 : amartin 403 if ( busy_ )
603 :     {
604 :     pending_.push(MmCommand(MmCommand::PLAY, audioFile, videoFile));
605 :     return true;
606 :     }
607 : jtarlton 390 LOGINFO("MmDevice::play()");
608 :    
609 :     MM_AUDIO_CODEC audioCodec;
610 :     if ( videoFile.empty() )
611 :     {
612 :     INIT_MM_AUDIO_CODEC(&audioCodec);
613 :     audioCodec.unCoding = MM_DATA_FORMAT_PCM;
614 :     audioCodec.unSampleRate = MM_DRT_8KHZ;
615 :     audioCodec.unBitsPerSample = 16;
616 :    
617 :     INIT_MM_MEDIA_ITEM_LIST(&audioMediaList_);
618 :     INIT_MM_MEDIA_AUDIO(&audioMediaList_.item.audio);
619 :     audioMediaList_.ItemChain = EMM_ITEM_EOT;
620 :     audioMediaList_.item.audio.szFileName = audioFile.c_str();
621 :     audioMediaList_.item.audio.codec = audioCodec;
622 :     audioMediaList_.item.audio.unMode = MM_MODE_AUD_FILE_TYPE_VOX;
623 :     audioMediaList_.item.audio.eFileFormat = EMM_AUD_FILEFORMAT_VOX;
624 :     audioMediaList_.item.audio.unOffset = 0;
625 :    
626 :     INIT_MM_PLAY_RECORD_LIST(&playRecordList_[0]);
627 :     playRecordList_[0].ItemType = EMM_MEDIA_TYPE_AUDIO;
628 :     playRecordList_[0].list = &audioMediaList_;
629 :     playRecordList_[0].ItemChain = EMM_ITEM_EOT;
630 :    
631 : jtarlton 393 INIT_MM_PLAY_INFO(&playInfo_);
632 : jtarlton 390 playInfo_.eFileFormat = EMM_FILE_FORMAT_UNDEFINED;
633 : jtarlton 393 playInfo_.list = playRecordList_;
634 : jtarlton 390 }
635 :     else
636 :     {
637 :     /* init audio
638 :     */
639 :     INIT_MM_AUDIO_CODEC(&audioCodec);
640 :     audioCodec.unCoding = MM_DATA_FORMAT_PCM;
641 :     audioCodec.unSampleRate = MM_DRT_8KHZ;
642 :     audioCodec.unBitsPerSample = 16;
643 :    
644 :     INIT_MM_MEDIA_ITEM_LIST(&audioMediaList_);
645 :     INIT_MM_MEDIA_AUDIO(&audioMediaList_.item.audio);
646 :     audioMediaList_.ItemChain = EMM_ITEM_EOT;
647 :     audioMediaList_.item.audio.szFileName = audioFile.c_str();
648 :     audioMediaList_.item.audio.codec = audioCodec;
649 :     audioMediaList_.item.audio.unMode = MM_MODE_AUD_FILE_TYPE_VOX;
650 :     audioMediaList_.item.audio.eFileFormat = EMM_AUD_FILEFORMAT_VOX;
651 :     audioMediaList_.item.audio.unOffset = 0;
652 :    
653 :     /* init video
654 :     */
655 :     INIT_MM_MEDIA_ITEM_LIST(&videoMediaList_);
656 :     INIT_MM_MEDIA_VIDEO(&videoMediaList_.item.video);
657 :     videoMediaList_.ItemChain = EMM_ITEM_EOT;
658 :     videoMediaList_.item.video.szFileName = videoFile.c_str();
659 :    
660 :     if ( mediaIsMpeg4_ )
661 :     {
662 :     if ( mediaIsCif_ )
663 :     {
664 :     LOGDEBUG("Using MPEG4 CIF Video clip");
665 :     videoMediaList_.item.video.codec.Coding = VIDEO_CODING_MP4V_ES;
666 :     videoMediaList_.item.video.codec.Profile = VIDEO_PROFILE_LEVEL_SP3_MPEG4;
667 :     videoMediaList_.item.video.codec.ImageWidth = VIDEO_IMAGE_WIDTH_352;
668 :     videoMediaList_.item.video.codec.ImageHeight = VIDEO_IMAGE_HEIGHT_288;
669 :     videoMediaList_.item.video.codec.FramesPerSec = VIDEO_FRAMESPERSEC_15;
670 :     }
671 :     else
672 :     {
673 :     LOGDEBUG("Using MPEG4 QCIF Video clip");
674 :     videoMediaList_.item.video.codec.Coding = VIDEO_CODING_MP4V_ES;
675 :     videoMediaList_.item.video.codec.Profile = VIDEO_PROFILE_LEVEL_SP1_MPEG4;
676 :     videoMediaList_.item.video.codec.ImageWidth = VIDEO_IMAGE_WIDTH_176;
677 :     videoMediaList_.item.video.codec.ImageHeight = VIDEO_IMAGE_HEIGHT_144;
678 :     videoMediaList_.item.video.codec.FramesPerSec = VIDEO_FRAMESPERSEC_15;
679 :     }
680 :     }
681 :     else
682 :     {
683 :     if ( mediaIsCif_ )
684 :     {
685 :     LOGDEBUG("Using H.263 CIF Video clip");
686 :     videoMediaList_.item.video.codec.Coding = VIDEO_CODING_H263;
687 :     videoMediaList_.item.video.codec.Profile = VIDEO_PROFILE_0_H263;
688 :     videoMediaList_.item.video.codec.ImageWidth = VIDEO_IMAGE_WIDTH_352;
689 :     videoMediaList_.item.video.codec.ImageHeight = VIDEO_IMAGE_HEIGHT_288;
690 :     videoMediaList_.item.video.codec.FramesPerSec = VIDEO_FRAMESPERSEC_15;
691 :     }
692 :     else
693 :     {
694 :     LOGDEBUG("Using H.263 QCIF Video clip");
695 :     videoMediaList_.item.video.codec.Coding = VIDEO_CODING_H263;
696 :     videoMediaList_.item.video.codec.Profile = VIDEO_PROFILE_0_H263;
697 :     videoMediaList_.item.video.codec.ImageWidth = VIDEO_IMAGE_WIDTH_176;
698 :     videoMediaList_.item.video.codec.ImageHeight = VIDEO_IMAGE_HEIGHT_144;
699 :     videoMediaList_.item.video.codec.FramesPerSec = VIDEO_FRAMESPERSEC_10;
700 :     }
701 :     }
702 :    
703 :     INIT_MM_PLAY_RECORD_LIST(&playRecordList_[0]);
704 :     playRecordList_[0].ItemType = EMM_MEDIA_TYPE_AUDIO;
705 :     playRecordList_[0].list = &audioMediaList_;
706 :     playRecordList_[0].ItemChain = EMM_ITEM_CONT;
707 :    
708 :     INIT_MM_PLAY_RECORD_LIST(&playRecordList_[1]);
709 :     playRecordList_[1].ItemType = EMM_MEDIA_TYPE_VIDEO;
710 :     playRecordList_[1].list = &videoMediaList_;
711 :     playRecordList_[1].ItemChain = EMM_ITEM_EOT;
712 :    
713 :     INIT_MM_PLAY_RECORD_INFO(&playInfo_);
714 :     playInfo_.eFileFormat = EMM_FILE_FORMAT_UNDEFINED;
715 :     playInfo_.list = playRecordList_;
716 :     }
717 :    
718 :     audioMediaList_.item.audio.szFileName = audioFile.c_str();
719 :     videoMediaList_.item.video.szFileName = videoFile.c_str();
720 :    
721 : jtarlton 393 LOGDEBUG("Playing: a=" << audioMediaList_.item.audio.szFileName <<
722 :     ", v=" << videoMediaList_.item.video.szFileName);
723 : jtarlton 390 if ( mm_Play(devHandle_, &playInfo_, NULL, NULL) == EMM_ERROR )
724 :     {
725 :     LOGERROR("mm_Play() failed on device: " << getDeviceName());
726 :     return false;
727 :     }
728 :     playActive_ = true;
729 : amartin 403 busy_ = true;
730 : jtarlton 390 return true;
731 :     }
732 :    
733 :    
734 :     /*
735 :     * Start recording.
736 :     */
737 :     bool MmDevice::record(const std::string& audioFile,
738 :     const std::string& videoFile )
739 :     {
740 : amartin 403 if ( busy_ )
741 :     {
742 :     pending_.push(MmCommand(MmCommand::RECORD, audioFile, videoFile));
743 :     return true;
744 :     }
745 :    
746 : jtarlton 390 LOGINFO("MmDevice::record()");
747 :    
748 :     /* init audio
749 :     */
750 :     MM_AUDIO_CODEC audioCodec;
751 :     INIT_MM_AUDIO_CODEC(&audioCodec);
752 :     audioCodec.unCoding = MM_DATA_FORMAT_PCM;
753 :     audioCodec.unSampleRate = MM_DRT_8KHZ;
754 :     audioCodec.unBitsPerSample = 16;
755 :    
756 :     INIT_MM_MEDIA_ITEM_LIST(&audioMediaList_);
757 :     INIT_MM_MEDIA_AUDIO(&audioMediaList_.item.audio);
758 :     audioMediaList_.ItemChain = EMM_ITEM_EOT;
759 :     audioMediaList_.item.audio.szFileName = audioFile.c_str();
760 :     audioMediaList_.item.audio.codec = audioCodec;
761 :     audioMediaList_.item.audio.unMode = MM_MODE_AUD_FILE_TYPE_VOX;
762 :     audioMediaList_.item.audio.eFileFormat = EMM_AUD_FILEFORMAT_VOX;
763 :    
764 :     /* init video
765 :     */
766 :     INIT_MM_MEDIA_ITEM_LIST(&videoMediaList_);
767 :     INIT_MM_MEDIA_VIDEO(&videoMediaList_.item.video);
768 :     if ( mediaIsMpeg4_ )
769 :     {
770 :     INIT_MM_MEDIA_ITEM_LIST(&videoMediaList_);
771 :     INIT_MM_MEDIA_VIDEO(&videoMediaList_.item.video);
772 :     if ( mediaIsCif_)
773 :     {
774 :     LOGDEBUG("Using MPEG4 CIF Video clip");
775 :     videoMediaList_.item.video.codec.Coding = VIDEO_CODING_MP4V_ES;
776 :     videoMediaList_.item.video.codec.Profile = VIDEO_PROFILE_LEVEL_SP3_MPEG4;
777 :     videoMediaList_.item.video.codec.ImageWidth = VIDEO_IMAGE_WIDTH_352;
778 :     videoMediaList_.item.video.codec.ImageHeight = VIDEO_IMAGE_HEIGHT_288;
779 :     videoMediaList_.item.video.codec.FramesPerSec = VIDEO_FRAMESPERSEC_15;
780 :     }
781 :     else
782 :     {
783 :     LOGDEBUG("Using MPEG4 QCIF Video clip");
784 :     videoMediaList_.item.video.codec.Coding = VIDEO_CODING_MP4V_ES;
785 :     videoMediaList_.item.video.codec.Profile = VIDEO_PROFILE_LEVEL_SP1_MPEG4;
786 :     videoMediaList_.item.video.codec.ImageWidth = VIDEO_IMAGE_WIDTH_176;
787 :     videoMediaList_.item.video.codec.ImageHeight = VIDEO_IMAGE_HEIGHT_144;
788 :     videoMediaList_.item.video.codec.FramesPerSec = VIDEO_FRAMESPERSEC_15;
789 :     }
790 :     }
791 :     else
792 :     {
793 :     if ( mediaIsCif_ )
794 :     {
795 :     LOGDEBUG("Using H.263 CIF Video clip");
796 :     videoMediaList_.item.video.codec.Coding = VIDEO_CODING_H263;
797 :     videoMediaList_.item.video.codec.Profile = VIDEO_PROFILE_0_H263;
798 :     videoMediaList_.item.video.codec.ImageWidth = VIDEO_IMAGE_WIDTH_352;
799 :     videoMediaList_.item.video.codec.ImageHeight = VIDEO_IMAGE_HEIGHT_288;
800 :     videoMediaList_.item.video.codec.FramesPerSec = VIDEO_FRAMESPERSEC_15;
801 :     }
802 :     else
803 :     {
804 :     LOGDEBUG("Using H.263 QCIF Video clip");
805 :     videoMediaList_.item.video.codec.Coding = VIDEO_CODING_H263;
806 :     videoMediaList_.item.video.codec.Profile = VIDEO_PROFILE_0_H263;
807 :     videoMediaList_.item.video.codec.ImageWidth = VIDEO_IMAGE_WIDTH_176;
808 :     videoMediaList_.item.video.codec.ImageHeight = VIDEO_IMAGE_HEIGHT_144;
809 :     videoMediaList_.item.video.codec.FramesPerSec = VIDEO_FRAMESPERSEC_10;
810 :     }
811 :     }
812 :    
813 :     videoMediaList_.ItemChain = EMM_ITEM_EOT;
814 :     videoMediaList_.item.video.szFileName = videoFile.c_str();
815 :     videoMediaList_.item.video.eFileFormat = EMM_FILE_FORMAT_PROPRIETARY;
816 :     videoMediaList_.item.video.unMode = 0;
817 :     videoMediaList_.item.video.unOffset = 0;
818 :    
819 :     INIT_MM_PLAY_RECORD_LIST(&playRecordList_[0]);
820 :     playRecordList_[0].ItemType = EMM_MEDIA_TYPE_AUDIO;
821 :     playRecordList_[0].list = &audioMediaList_;
822 :     playRecordList_[0].ItemChain = EMM_ITEM_CONT;
823 :    
824 :     INIT_MM_PLAY_RECORD_LIST(&playRecordList_[1]);
825 :     playRecordList_[1].ItemType = EMM_MEDIA_TYPE_VIDEO;
826 :     playRecordList_[1].list = &videoMediaList_;
827 :     playRecordList_[1].ItemChain = EMM_ITEM_EOT;
828 :    
829 : jtarlton 393 INIT_MM_RECORD_INFO(&recordInfo_);
830 : jtarlton 390 recordInfo_.eFileFormat = EMM_FILE_FORMAT_UNDEFINED;
831 :     recordInfo_.list = playRecordList_;
832 :    
833 : jtarlton 393 // XXX sendIFrameRequest();
834 : jtarlton 390
835 : jtarlton 393 LOGDEBUG("Recording: a=" << audioMediaList_.item.audio.szFileName <<
836 :     ", v=" << videoMediaList_.item.video.szFileName);
837 : jtarlton 390 if ( mm_Record(devHandle_, &recordInfo_, NULL, 0) == EMM_ERROR )
838 :     {
839 :     LOGERROR("mm_Record() failed on device: " << getDeviceName());
840 :     return false;
841 :     }
842 :    
843 :     recordActive_ = true;
844 : amartin 403 busy_ = true;
845 : jtarlton 390 return true;
846 :     }
847 :    
848 :    
849 :     /*
850 :     * Stop current play.
851 :     */
852 :     bool MmDevice::stopPlay()
853 :     {
854 :     if ( playActive_ )
855 :     {
856 : amartin 403 if ( busy_ )
857 :     {
858 :     pending_.push(MmCommand(MmCommand::STOPPLAY));
859 :     return true;
860 :     }
861 :    
862 :     LOGINFO("MmDevice::stopPlay()");
863 : jtarlton 390 MM_STOP mmStopInfo[2];
864 :     MM_STOP_DETAILS mmStopDetails;
865 :     memset(&mmStopDetails, 0, sizeof(MM_STOP_DETAILS));
866 :    
867 :     mmStopInfo[0].unVersion = 0;
868 :     mmStopInfo[0].ItemChain = EMM_ITEM_CONT;
869 :     mmStopInfo[0].ItemType = EMM_STOP_VIDEO_PLAY;
870 :     mmStopInfo[0].details = mmStopDetails;
871 :     mmStopInfo[0].next = &mmStopInfo[1];
872 :    
873 :     mmStopInfo[1].unVersion = 0;
874 :     mmStopInfo[1].ItemChain = EMM_ITEM_EOT;
875 :     mmStopInfo[1].ItemType = EMM_STOP_AUDIO_PLAY;
876 :     mmStopInfo[1].details = mmStopDetails;
877 :     mmStopInfo[1].next = NULL;
878 :    
879 :     if ( mm_Stop(devHandle_, mmStopInfo, NULL) == EMM_ERROR )
880 :     {
881 :     LOGERROR("mm_Stop() failed on device: " << getDeviceName());
882 :     return false;
883 :     }
884 :     playActive_= false;
885 : amartin 403 busy_ = true;
886 : jtarlton 390 }
887 :     return true;
888 :     }
889 :    
890 :    
891 :     /*
892 :     * Stop current recording.
893 :     */
894 :     bool MmDevice::stopRecord()
895 :     {
896 :     LOGDEBUG("MmDevice::stopRecord() device: " << getDeviceName());
897 :    
898 :     if ( recordActive_ )
899 :     {
900 : amartin 403 if ( busy_ )
901 :     {
902 :     pending_.push(MmCommand(MmCommand::STOPRECORD));
903 :     return true;
904 :     }
905 :    
906 :     LOGINFO("MmDevice::stopRecord()");
907 : jtarlton 390 MM_STOP mmStopInfo[2];
908 :     MM_STOP_DETAILS mmStopDetails;
909 :     memset(&mmStopDetails, 0, sizeof(MM_STOP_DETAILS));
910 :    
911 :     mmStopInfo[0].unVersion = 0;
912 :     mmStopInfo[0].ItemChain = EMM_ITEM_CONT;
913 :     mmStopInfo[0].ItemType = EMM_STOP_VIDEO_RECORD;
914 :     mmStopInfo[0].details = mmStopDetails;
915 :     mmStopInfo[0].next = &mmStopInfo[1];
916 :    
917 :     mmStopInfo[1].unVersion = 0;
918 :     mmStopInfo[1].ItemChain = EMM_ITEM_EOT;
919 :     mmStopInfo[1].ItemType = EMM_STOP_AUDIO_RECORD;
920 :     mmStopInfo[1].details = mmStopDetails;
921 :     mmStopInfo[1].next = NULL;
922 :    
923 :     if ( mm_Stop(devHandle_, mmStopInfo, 0) == EMM_ERROR )
924 :     {
925 :     LOGERROR("mm_Stop() failed on device: " << getDeviceName());
926 :     return false;
927 :     }
928 :     recordActive_ = false;
929 : amartin 403 busy_ = true;
930 : jtarlton 390 }
931 :     return true;
932 :     }
933 :    
934 :    
935 : amartin 378 /* vim:ts=4:set nu:
936 :     * EOF
937 :     */

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