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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 389, Fri Sep 11 12:16:32 2009 UTC revision 390, Mon Sep 14 08:48:56 2009 UTC
# Line 51  Line 51 
51  MmDevice::MmDevice( const std::string& name,  MmDevice::MmDevice( const std::string& name,
52                        DialogicChannelManager& channelMgr )                        DialogicChannelManager& channelMgr )
53          : DialogicDevice(name, channelMgr),          : DialogicDevice(name, channelMgr),
54            busy_ (false)            playActive_ (false),
55              recordActive_ (false),
56              mediaIsMpeg4_ (false),
57              mediaIsCif_ (false)
58  {  {
59    
60  }  }
# Line 63  Line 66 
66  bool MmDevice::open()  bool MmDevice::open()
67  {  {
68          LOGDEBUG("MmDevice::open() device: " << devName_);          LOGDEBUG("MmDevice::open() device: " << devName_);
69          /* Add code */          devHandle_ = mm_Open(devName_.c_str(), 0, NULL);
70            if ( devHandle_ == EMM_ERROR )
71            {
72                    LOGERROR("mm_Open() failed");
73                    return false;
74            }
75          return true;          return true;
76  }  }
77    
# Line 74  Line 82 
82  bool MmDevice::close()  bool MmDevice::close()
83  {  {
84          LOGDEBUG("MmDevice::close() device: " << devName_);          LOGDEBUG("MmDevice::close() device: " << devName_);
85          /* Add code */          if ( mm_Close(devHandle_, NULL) == EMM_ERROR )
86            {
87                    LOGERROR("mm_Close() failed");
88                    return false;
89            }
90          return true;          return true;
91  }  }
92    
# Line 86  Line 98 
98  {  {
99          LOGDEBUG("MmDevice::listen() device: " << devName_ <<          LOGDEBUG("MmDevice::listen() device: " << devName_ <<
100                   " other: " << other->getDeviceName());                   " other: " << other->getDeviceName());
101          /* Add code */  
102            if ( dev_Connect(devHandle_, other->getDeviceHandle(), DM_FULLDUP, EV_ASYNC) < 0 )
103            {
104                    LOGERROR("dev_Connect() failed");
105                    return false;
106            }
107          return true;          return true;
108  }  }
109    
# Line 97  Line 114 
114  bool MmDevice::unListen()  bool MmDevice::unListen()
115  {  {
116          LOGDEBUG("MmDevice::unListen() device: " << devName_);          LOGDEBUG("MmDevice::unListen() device: " << devName_);
117          /* Add code */          if ( dev_Disconnect(devHandle_, EV_ASYNC) < 0 )
118            {
119                    LOGERROR("dev_Connect() failed");
120                    return false;
121            }
122          return true;          return true;
123  }  }
124    
# Line 108  Line 129 
129  bool MmDevice::processEvent( METAEVENT& metaevent )  bool MmDevice::processEvent( METAEVENT& metaevent )
130  {  {
131          long evttype = metaevent.evttype;          long evttype = metaevent.evttype;
132          LOGDEBUG("MmDevice::processEvent() Got evttype: " << evttype << " " <<  
133                                    ATDV_NAMEP(sr_getevtdev()));          switch ( evttype )
134          /* Add code */          {
135                    case MMEV_OPEN:
136                            LOGDEBUG("MmDevice::processEvent() MMEV_OPEN device: " << devName_);
137                            break;
138    
139                    case MMEV_PLAY:
140                            onPlay();
141                            break;
142    
143                    case MMEV_PLAY_FAIL:
144                            onPlayFail();
145                            break;
146    
147                    case MMEV_PLAY_ACK_FAIL:
148                            onPlayAckFail();
149                            break;
150    
151                    case MMEV_RECORD_ACK:
152                            onRecordAck();
153                            break;
154    
155                    case MMEV_STOP_ACK:
156                            onStopAck();
157                            break;
158    
159                    case MMEV_STOP_ACK_FAIL:
160                            onStopAckFail();
161                            break;
162    
163                    case MMEV_RESET:
164                            onReset();
165                            break;
166    
167                    case MMEV_ERROR:
168                            onError();
169                            break;
170    
171                    case DMEV_PORT_CONNECT:
172                            break;
173    
174                    case DMEV_PORT_CONNECT_FAIL:
175                            break;
176    
177                    case DMEV_PORT_DISCONNECT:
178                            break;
179    
180                    case DMEV_PORT_DISCONNECT_FAIL:
181                            break;
182    
183                    default:
184                            LOGDEBUG("MmDevice::processEvent() Unhandled event: " << evttype <<
185                                     " " << ATDV_NAMEP(sr_getevtdev()));
186                            break;
187            }
188          return true;          return true;
189  }  }
190    
191    
192    /*
193     * Handle MMEV_PLAY event.
194     */
195    void MmDevice::onPlay()
196    {
197            LOGINFO("MmDevice::onPlay()");
198    }
199    
200    
201    /*
202     * Handle MMEV_PLAY_ACK_FAIL event.
203     */
204    void MmDevice::onPlayAckFail()
205    {
206            LOGINFO("MmDevice::onPlayAckFail()");
207    }
208    
209    
210    /*
211     * Handle MMEV_PLAY_FAIL event.
212     */
213    void MmDevice::onPlayFail()
214    {
215            LOGINFO("MmDevice::onPlayFail()");
216    }
217    
218    
219    /*
220     * Handle MMEV_RECORD_ACK event.
221     */
222    void MmDevice::onRecordAck()
223    {
224            LOGINFO("MmDevice::onRecordAck()");
225    }
226    
227    
228    /*
229     * Handle MMEV_STOP_ACK event.
230     */
231    void MmDevice::onStopAck()
232    {
233            LOGINFO("MmDevice::onStopAck()");
234    }
235    
236    
237    /*
238     * Handle MMEV_STOP_ACK_FAIL event.
239     */
240    void MmDevice::onStopAckFail()
241    {
242            LOGINFO("MmDevice::onStopAckFail()");
243    }
244    
245    
246    /*
247     * Handle MMEV_RESET event.
248     */
249    void MmDevice::onReset()
250    {
251            LOGINFO("MmDevice::onReset()");
252    }
253    
254    
255    /*
256     * Handle MMEV_ERROR event.
257     */
258    void MmDevice::onError()
259    {
260            LOGINFO("MmDevice::onError()");
261    }
262    
263    
264    
265    /*
266     * Start playing.
267     */
268    bool MmDevice::play( const std::string& audioFile,
269                         const std::string& videoFile )
270    {
271            LOGINFO("MmDevice::play()");
272    
273            MM_AUDIO_CODEC audioCodec;
274            if ( videoFile.empty() )
275            {
276                    INIT_MM_AUDIO_CODEC(&audioCodec);
277                    audioCodec.unCoding = MM_DATA_FORMAT_PCM;
278                    audioCodec.unSampleRate  = MM_DRT_8KHZ;
279                    audioCodec.unBitsPerSample = 16;
280    
281                    INIT_MM_MEDIA_ITEM_LIST(&audioMediaList_);
282                    INIT_MM_MEDIA_AUDIO(&audioMediaList_.item.audio);
283                    audioMediaList_.ItemChain = EMM_ITEM_EOT;
284                    audioMediaList_.item.audio.szFileName = audioFile.c_str();
285                    audioMediaList_.item.audio.codec = audioCodec;
286                    audioMediaList_.item.audio.unMode = MM_MODE_AUD_FILE_TYPE_VOX;
287                    audioMediaList_.item.audio.eFileFormat = EMM_AUD_FILEFORMAT_VOX;
288                    audioMediaList_.item.audio.unOffset = 0;
289    
290                    INIT_MM_PLAY_RECORD_LIST(&playRecordList_[0]);
291                    playRecordList_[0].ItemType = EMM_MEDIA_TYPE_AUDIO;
292                    playRecordList_[0].list = &audioMediaList_;
293                    playRecordList_[0].ItemChain = EMM_ITEM_EOT;
294    
295                    INIT_MM_PLAY_RECORD_INFO(&playInfo_);
296                    playInfo_.eFileFormat = EMM_FILE_FORMAT_UNDEFINED;
297                    playInfo_.list  = playRecordList_;
298            }
299            else
300            {
301                    /* init audio
302                     */
303                    INIT_MM_AUDIO_CODEC(&audioCodec);
304                    audioCodec.unCoding = MM_DATA_FORMAT_PCM;
305                    audioCodec.unSampleRate = MM_DRT_8KHZ;
306                    audioCodec.unBitsPerSample = 16;
307    
308                    INIT_MM_MEDIA_ITEM_LIST(&audioMediaList_);
309                    INIT_MM_MEDIA_AUDIO(&audioMediaList_.item.audio);
310                    audioMediaList_.ItemChain = EMM_ITEM_EOT;
311                    audioMediaList_.item.audio.szFileName = audioFile.c_str();
312                    audioMediaList_.item.audio.codec = audioCodec;
313                    audioMediaList_.item.audio.unMode = MM_MODE_AUD_FILE_TYPE_VOX;
314                    audioMediaList_.item.audio.eFileFormat = EMM_AUD_FILEFORMAT_VOX;
315                    audioMediaList_.item.audio.unOffset = 0;
316    
317                    /* init video
318                     */
319                    INIT_MM_MEDIA_ITEM_LIST(&videoMediaList_);
320                    INIT_MM_MEDIA_VIDEO(&videoMediaList_.item.video);
321                    videoMediaList_.ItemChain = EMM_ITEM_EOT;
322                    videoMediaList_.item.video.szFileName = videoFile.c_str();
323    
324                    if ( mediaIsMpeg4_ )
325                    {
326                            if ( mediaIsCif_ )
327                            {
328                                    LOGDEBUG("Using MPEG4 CIF Video clip");
329                                    videoMediaList_.item.video.codec.Coding = VIDEO_CODING_MP4V_ES;
330                                    videoMediaList_.item.video.codec.Profile = VIDEO_PROFILE_LEVEL_SP3_MPEG4;
331                                    videoMediaList_.item.video.codec.ImageWidth = VIDEO_IMAGE_WIDTH_352;
332                                    videoMediaList_.item.video.codec.ImageHeight = VIDEO_IMAGE_HEIGHT_288;
333                                    videoMediaList_.item.video.codec.FramesPerSec = VIDEO_FRAMESPERSEC_15;
334                            }
335                            else
336                            {
337                                    LOGDEBUG("Using MPEG4 QCIF Video clip");
338                                    videoMediaList_.item.video.codec.Coding = VIDEO_CODING_MP4V_ES;
339                                    videoMediaList_.item.video.codec.Profile = VIDEO_PROFILE_LEVEL_SP1_MPEG4;
340                                    videoMediaList_.item.video.codec.ImageWidth = VIDEO_IMAGE_WIDTH_176;
341                                    videoMediaList_.item.video.codec.ImageHeight = VIDEO_IMAGE_HEIGHT_144;
342                                    videoMediaList_.item.video.codec.FramesPerSec = VIDEO_FRAMESPERSEC_15;
343                            }
344                    }
345                    else
346                    {
347                            if ( mediaIsCif_ )
348                            {
349                                    LOGDEBUG("Using H.263 CIF Video clip");
350                                    videoMediaList_.item.video.codec.Coding = VIDEO_CODING_H263;
351                                    videoMediaList_.item.video.codec.Profile = VIDEO_PROFILE_0_H263;
352                                    videoMediaList_.item.video.codec.ImageWidth = VIDEO_IMAGE_WIDTH_352;
353                                    videoMediaList_.item.video.codec.ImageHeight = VIDEO_IMAGE_HEIGHT_288;
354                                    videoMediaList_.item.video.codec.FramesPerSec = VIDEO_FRAMESPERSEC_15;
355                            }
356                            else
357                            {
358                                    LOGDEBUG("Using H.263 QCIF Video clip");
359                                    videoMediaList_.item.video.codec.Coding = VIDEO_CODING_H263;
360                                    videoMediaList_.item.video.codec.Profile = VIDEO_PROFILE_0_H263;
361                                    videoMediaList_.item.video.codec.ImageWidth = VIDEO_IMAGE_WIDTH_176;
362                                    videoMediaList_.item.video.codec.ImageHeight = VIDEO_IMAGE_HEIGHT_144;
363                                    videoMediaList_.item.video.codec.FramesPerSec = VIDEO_FRAMESPERSEC_10;
364                            }
365                    }
366    
367                    INIT_MM_PLAY_RECORD_LIST(&playRecordList_[0]);
368                    playRecordList_[0].ItemType = EMM_MEDIA_TYPE_AUDIO;
369                    playRecordList_[0].list = &audioMediaList_;
370                    playRecordList_[0].ItemChain = EMM_ITEM_CONT;
371    
372                    INIT_MM_PLAY_RECORD_LIST(&playRecordList_[1]);
373                    playRecordList_[1].ItemType = EMM_MEDIA_TYPE_VIDEO;
374                    playRecordList_[1].list = &videoMediaList_;
375                    playRecordList_[1].ItemChain = EMM_ITEM_EOT;
376    
377                    INIT_MM_PLAY_RECORD_INFO(&playInfo_);
378                    playInfo_.eFileFormat = EMM_FILE_FORMAT_UNDEFINED;
379                    playInfo_.list  = playRecordList_;
380            }
381    
382            audioMediaList_.item.audio.szFileName = audioFile.c_str();
383            videoMediaList_.item.video.szFileName = videoFile.c_str();
384    
385            LOGINFO("Playing from: " << audioMediaList_.item.audio.szFileName << ", " << videoMediaList_.item.video.szFileName);
386            if ( mm_Play(devHandle_, &playInfo_, NULL, NULL) == EMM_ERROR )
387            {
388                    LOGERROR("mm_Play() failed on device: " << getDeviceName());
389                    return false;
390            }
391            playActive_ = true;
392            return true;
393    }
394    
395    
396    /*
397     * Start recording.
398     */
399    bool MmDevice::record(const std::string& audioFile,
400                          const std::string& videoFile )
401    {
402            LOGINFO("MmDevice::record()");
403    
404            /* init audio
405             */
406            MM_AUDIO_CODEC audioCodec;
407            INIT_MM_AUDIO_CODEC(&audioCodec);
408            audioCodec.unCoding = MM_DATA_FORMAT_PCM;
409            audioCodec.unSampleRate = MM_DRT_8KHZ;
410            audioCodec.unBitsPerSample = 16;
411    
412            INIT_MM_MEDIA_ITEM_LIST(&audioMediaList_);
413            INIT_MM_MEDIA_AUDIO(&audioMediaList_.item.audio);
414            audioMediaList_.ItemChain  = EMM_ITEM_EOT;
415            audioMediaList_.item.audio.szFileName = audioFile.c_str();
416            audioMediaList_.item.audio.codec = audioCodec;
417            audioMediaList_.item.audio.unMode = MM_MODE_AUD_FILE_TYPE_VOX;
418            audioMediaList_.item.audio.eFileFormat = EMM_AUD_FILEFORMAT_VOX;
419    
420            /* init video
421             */
422            INIT_MM_MEDIA_ITEM_LIST(&videoMediaList_);
423            INIT_MM_MEDIA_VIDEO(&videoMediaList_.item.video);
424            if ( mediaIsMpeg4_ )
425            {
426                    INIT_MM_MEDIA_ITEM_LIST(&videoMediaList_);
427                    INIT_MM_MEDIA_VIDEO(&videoMediaList_.item.video);
428                    if ( mediaIsCif_)
429                    {
430                            LOGDEBUG("Using MPEG4 CIF Video clip");
431                            videoMediaList_.item.video.codec.Coding = VIDEO_CODING_MP4V_ES;
432                            videoMediaList_.item.video.codec.Profile = VIDEO_PROFILE_LEVEL_SP3_MPEG4;
433                            videoMediaList_.item.video.codec.ImageWidth = VIDEO_IMAGE_WIDTH_352;
434                            videoMediaList_.item.video.codec.ImageHeight = VIDEO_IMAGE_HEIGHT_288;
435                            videoMediaList_.item.video.codec.FramesPerSec = VIDEO_FRAMESPERSEC_15;
436                    }
437                    else
438                    {
439                            LOGDEBUG("Using MPEG4 QCIF Video clip");
440                            videoMediaList_.item.video.codec.Coding = VIDEO_CODING_MP4V_ES;
441                            videoMediaList_.item.video.codec.Profile = VIDEO_PROFILE_LEVEL_SP1_MPEG4;
442                            videoMediaList_.item.video.codec.ImageWidth = VIDEO_IMAGE_WIDTH_176;
443                            videoMediaList_.item.video.codec.ImageHeight = VIDEO_IMAGE_HEIGHT_144;
444                            videoMediaList_.item.video.codec.FramesPerSec = VIDEO_FRAMESPERSEC_15;
445                    }
446            }
447            else
448            {
449                    if ( mediaIsCif_ )
450                    {
451                            LOGDEBUG("Using H.263 CIF Video clip");
452                            videoMediaList_.item.video.codec.Coding = VIDEO_CODING_H263;
453                            videoMediaList_.item.video.codec.Profile = VIDEO_PROFILE_0_H263;
454                            videoMediaList_.item.video.codec.ImageWidth = VIDEO_IMAGE_WIDTH_352;
455                            videoMediaList_.item.video.codec.ImageHeight = VIDEO_IMAGE_HEIGHT_288;
456                            videoMediaList_.item.video.codec.FramesPerSec = VIDEO_FRAMESPERSEC_15;
457                    }
458                    else
459                    {
460                            LOGDEBUG("Using H.263 QCIF Video clip");
461                            videoMediaList_.item.video.codec.Coding = VIDEO_CODING_H263;
462                            videoMediaList_.item.video.codec.Profile = VIDEO_PROFILE_0_H263;
463                            videoMediaList_.item.video.codec.ImageWidth = VIDEO_IMAGE_WIDTH_176;
464                            videoMediaList_.item.video.codec.ImageHeight = VIDEO_IMAGE_HEIGHT_144;
465                            videoMediaList_.item.video.codec.FramesPerSec = VIDEO_FRAMESPERSEC_10;
466                    }
467            }
468    
469            videoMediaList_.ItemChain = EMM_ITEM_EOT;
470            videoMediaList_.item.video.szFileName = videoFile.c_str();
471            videoMediaList_.item.video.eFileFormat = EMM_FILE_FORMAT_PROPRIETARY;
472            videoMediaList_.item.video.unMode = 0;
473            videoMediaList_.item.video.unOffset = 0;
474    
475            INIT_MM_PLAY_RECORD_LIST(&playRecordList_[0]);
476            playRecordList_[0].ItemType = EMM_MEDIA_TYPE_AUDIO;
477            playRecordList_[0].list = &audioMediaList_;
478            playRecordList_[0].ItemChain = EMM_ITEM_CONT;
479    
480            INIT_MM_PLAY_RECORD_LIST(&playRecordList_[1]);
481            playRecordList_[1].ItemType     = EMM_MEDIA_TYPE_VIDEO;
482            playRecordList_[1].list = &videoMediaList_;
483            playRecordList_[1].ItemChain = EMM_ITEM_EOT;
484    
485            INIT_MM_PLAY_RECORD_INFO(&recordInfo_);
486            recordInfo_.eFileFormat = EMM_FILE_FORMAT_UNDEFINED;
487            recordInfo_.list = playRecordList_;
488    
489            //sendIFrameRequest();
490    
491            LOGINFO("Recording to: " << audioMediaList_.item.audio.szFileName << ", " << videoMediaList_.item.video.szFileName);
492            if ( mm_Record(devHandle_, &recordInfo_, NULL, 0) == EMM_ERROR )
493            {
494                    LOGERROR("mm_Record() failed on device: " << getDeviceName());
495                    return false;
496            }
497    
498            recordActive_ = true;
499            return true;
500    }
501    
502    
503    /*
504     * Stop current play.
505     */
506    bool MmDevice::stopPlay()
507    {
508            if ( playActive_ )
509            {
510                    MM_STOP mmStopInfo[2];
511                    MM_STOP_DETAILS mmStopDetails;
512                    memset(&mmStopDetails, 0, sizeof(MM_STOP_DETAILS));
513    
514                    mmStopInfo[0].unVersion = 0;
515                    mmStopInfo[0].ItemChain = EMM_ITEM_CONT;
516                    mmStopInfo[0].ItemType = EMM_STOP_VIDEO_PLAY;
517                    mmStopInfo[0].details = mmStopDetails;
518                    mmStopInfo[0].next = &mmStopInfo[1];
519    
520                    mmStopInfo[1].unVersion = 0;
521                    mmStopInfo[1].ItemChain = EMM_ITEM_EOT;
522                    mmStopInfo[1].ItemType = EMM_STOP_AUDIO_PLAY;
523                    mmStopInfo[1].details = mmStopDetails;
524                    mmStopInfo[1].next = NULL;
525    
526                    if ( mm_Stop(devHandle_, mmStopInfo, NULL) == EMM_ERROR )
527                    {
528                            LOGERROR("mm_Stop() failed on device: " << getDeviceName());
529                            return false;
530                    }
531                    playActive_= false;
532            }
533            return true;
534    }
535    
536    
537    /*
538     * Stop current recording.
539     */
540    bool MmDevice::stopRecord()
541    {
542            LOGDEBUG("MmDevice::stopRecord() device: " << getDeviceName());
543    
544            if ( recordActive_ )
545            {
546                    MM_STOP mmStopInfo[2];
547                    MM_STOP_DETAILS mmStopDetails;
548                    memset(&mmStopDetails, 0, sizeof(MM_STOP_DETAILS));
549    
550                    mmStopInfo[0].unVersion = 0;
551                    mmStopInfo[0].ItemChain = EMM_ITEM_CONT;
552                    mmStopInfo[0].ItemType = EMM_STOP_VIDEO_RECORD;
553                    mmStopInfo[0].details = mmStopDetails;
554                    mmStopInfo[0].next = &mmStopInfo[1];
555    
556                    mmStopInfo[1].unVersion = 0;
557                    mmStopInfo[1].ItemChain = EMM_ITEM_EOT;
558                    mmStopInfo[1].ItemType = EMM_STOP_AUDIO_RECORD;
559                    mmStopInfo[1].details = mmStopDetails;
560                    mmStopInfo[1].next = NULL;
561    
562                    if ( mm_Stop(devHandle_, mmStopInfo, 0) == EMM_ERROR )
563                    {
564                            LOGERROR("mm_Stop() failed on device: " << getDeviceName());
565                            return false;
566                    }
567                    recordActive_ = false;
568            }
569            return true;
570    }
571    
572    
573  /* vim:ts=4:set nu:  /* vim:ts=4:set nu:
574   * EOF   * EOF

Legend:
Removed from v.389  
changed lines
  Added in v.390

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