10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*
20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * libjingle
30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Copyright 2010 Google Inc.
40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *
50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without
60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * modification, are permitted provided that the following conditions are met:
70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *
80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *  1. Redistributions of source code must retain the above copyright notice,
90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     this list of conditions and the following disclaimer.
100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *  2. Redistributions in binary form must reproduce the above copyright notice,
110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     this list of conditions and the following disclaimer in the documentation
120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     and/or other materials provided with the distribution.
130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *  3. The name of the author may not be used to endorse or promote products
140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     derived from this software without specific prior written permission.
150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *
160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */
270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// LinphoneMediaEngine is a Linphone implementation of MediaEngine
290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifndef TALK_SESSION_PHONE_LINPHONEMEDIAENGINE_H_
310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define TALK_SESSION_PHONE_LINPHONEMEDIAENGINE_H_
320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <string>
340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <vector>
350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgextern "C" {
370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <mediastreamer2/mediastream.h>
380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/codec.h"
410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/mediachannel.h"
420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/mediaengine.h"
43cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/scoped_ptr.h"
440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
452a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgnamespace rtc {
460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass StreamInterface;
470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace cricket {
500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass LinphoneMediaEngine : public MediaEngineInterface {
520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  LinphoneMediaEngine(const std::string& ringWav,  const std::string& callWav);
540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual ~LinphoneMediaEngine() {}
550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Should be called before codecs() and video_codecs() are called. We need to
570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // set the voice and video codecs; otherwise, Jingle initiation will fail.
580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_voice_codecs(const std::vector<AudioCodec>& codecs) {
590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    voice_codecs_ = codecs;
600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_video_codecs(const std::vector<VideoCodec>& codecs) {
620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    video_codecs_ = codecs;
630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Implement pure virtual methods of MediaEngine.
660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool Init();
670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void Terminate();
680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual int GetCapabilities();
690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual VoiceMediaChannel* CreateChannel();
700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual VideoMediaChannel* CreateVideoChannel(VoiceMediaChannel* voice_ch);
710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual SoundclipMedia* CreateSoundclip() { return NULL; }
720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetAudioOptions(int options) { return true; }
730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetDefaultVideoEncoderConfig(const VideoEncoderConfig& config) {
740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetSoundDevices(const Device* in_dev, const Device* out_dev) {
770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return true;
780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetVideoCaptureDevice(const Device* cam_device) { return true; }
800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetOutputVolume(int level) { return true; }
810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual int GetInputLevel() { return 0; }
820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetLocalMonitor(bool enable) { return true; }
830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // TODO: control channel send?
840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetVideoCapture(bool capture) { return true; }
850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual const std::vector<AudioCodec>& audio_codecs() {
860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return voice_codecs_;
870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual const std::vector<VideoCodec>& video_codecs() {
890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return video_codecs_;
900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool FindAudioCodec(const AudioCodec& codec);
920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool FindVideoCodec(const VideoCodec& codec) { return true; }
930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void SetVoiceLogging(int min_sev, const char* filter) {}
940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void SetVideoLogging(int min_sev, const char* filter) {}
950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string GetRingWav(){return ring_wav_;}
970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string GetCallWav(){return call_wav_;}
980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int have_ilbc;
1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string voice_input_filename_;
1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string voice_output_filename_;
1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string video_input_filename_;
1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string video_output_filename_;
1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<AudioCodec> voice_codecs_;
1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<VideoCodec> video_codecs_;
1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string ring_wav_;
1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string call_wav_;
1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  DISALLOW_COPY_AND_ASSIGN(LinphoneMediaEngine);
1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass LinphoneVoiceChannel : public VoiceMediaChannel {
1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  LinphoneVoiceChannel(LinphoneMediaEngine *eng);
1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual ~LinphoneVoiceChannel();
1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Implement pure virtual methods of VoiceMediaChannel.
1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetRecvCodecs(const std::vector<AudioCodec>& codecs) { return true; }
1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetSendCodecs(const std::vector<AudioCodec>& codecs);
1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetPlayout(bool playout);
1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetSend(SendFlags flag);
1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool AddStream(uint32 ssrc) { return true; }
1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool RemoveStream(uint32 ssrc) { return true; }
1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool GetActiveStreams(AudioInfo::StreamList* actives) { return true; }
1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual int GetOutputLevel() { return 0; }
1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetOutputScaling(uint32 ssrc, double left, double right) {
1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return false;
1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool GetOutputScaling(uint32 ssrc, double* left, double* right) {
1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return false;
1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void SetRingbackTone(const char* buf, int len) {}
1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool PlayRingbackTone(bool play, bool loop) { return true; }
1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool PressDTMF(int event, bool playout) { return true; }
1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool GetStats(VoiceMediaInfo* info) { return true; }
1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Implement pure virtual methods of MediaChannel.
1412a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  virtual void OnPacketReceived(rtc::Buffer* packet);
1422a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  virtual void OnRtcpReceived(rtc::Buffer* packet) {}
1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void SetSendSsrc(uint32 id) {}  // TODO: change RTP packet?
1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetRtcpCName(const std::string& cname) { return true; }
1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool Mute(bool on) { return mute_; }
146f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  virtual bool SetStartSendBandwidth(int bps) { return true; }
147f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  virtual bool SetMaxSendBandwidth(int bps) { return true; }
1480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetOptions(int options) { return true; }
1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetRecvRtpHeaderExtensions(
1500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      const std::vector<RtpHeaderExtension>& extensions) { return true; }
1510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual bool SetSendRtpHeaderExtensions(
1520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      const std::vector<RtpHeaderExtension>& extensions) { return true; }
1530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void StartRing(bool bIncomingCall);
1550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void StopRing();
1560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
1580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int pt_;
1590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool mute_;
1600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool play_;
1610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  AudioStream *audio_stream_;
1620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  LinphoneMediaEngine *engine_;
1630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  RingStream* ring_stream_;
1642a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_ptr<rtc::AsyncSocket> socket_;
1652a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  void OnIncomingData(rtc::AsyncSocket *s);
1660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  DISALLOW_COPY_AND_ASSIGN(LinphoneVoiceChannel);
1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}  // namespace cricket
1710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif  // TALK_SESSION_PHONE_LINPHONEMEDIAENGINE_H_
173