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#ifndef MSILBC_LIBRARY 290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define MSILBC_LIBRARY "/usr/lib/mediastreamer/plugins/libmsilbc.so" 300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif 310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// LinphoneMediaEngine is a Linphone implementation of MediaEngine 330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgextern "C" { 340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <mediastreamer2/mediastream.h> 350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <mediastreamer2/msfilter.h> 36cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include <mediastreamer2/mssndcard.h> 370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/other/linphonemediaengine.h" 400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 41cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/media/base/rtpdump.h" 422a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/buffer.h" 432a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/event.h" 442a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/logging.h" 452a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/pathutils.h" 462a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/stream.h" 470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifndef WIN32 490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <libgen.h> 500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif 510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace cricket { 530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/////////////////////////////////////////////////////////////////////////// 550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Implementation of LinphoneMediaEngine. 560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/////////////////////////////////////////////////////////////////////////// 570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgLinphoneMediaEngine::LinphoneMediaEngine(const std::string& ringWav, const std::string& callWav) : ring_wav_(ringWav), call_wav_(callWav) { } 580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgbool LinphoneMediaEngine::Init() { 600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ortp_init(); 610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ms_init(); 620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifdef HAVE_ILBC 640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifndef WIN32 650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org char * path = strdup(MSILBC_LIBRARY); 660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org char * dirc = dirname(path); 670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ms_load_plugins(dirc); 680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif 690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (ms_filter_codec_supported("iLBC")) 700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org have_ilbc = 1; 710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org else 720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org have_ilbc = 0; 730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#else 740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org have_ilbc = 0; 750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif 760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifdef HAVE_SPEEX 780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voice_codecs_.push_back(AudioCodec(110, payload_type_speex_wb.mime_type, payload_type_speex_wb.clock_rate, 0, 1, 8)); 790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voice_codecs_.push_back(AudioCodec(111, payload_type_speex_nb.mime_type, payload_type_speex_nb.clock_rate, 0, 1, 7)); 800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif 810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifdef HAVE_ILBC 830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (have_ilbc) 840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voice_codecs_.push_back(AudioCodec(102, payload_type_ilbc.mime_type, payload_type_ilbc.clock_rate, 0, 1, 4)); 850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif 860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voice_codecs_.push_back(AudioCodec(0, payload_type_pcmu8000.mime_type, payload_type_pcmu8000.clock_rate, 0, 1, 2)); 880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org voice_codecs_.push_back(AudioCodec(101, payload_type_telephone_event.mime_type, payload_type_telephone_event.clock_rate, 0, 1, 1)); 890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid LinphoneMediaEngine::Terminate() { 930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org fflush(stdout); 940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgint LinphoneMediaEngine::GetCapabilities() { 980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int capabilities = 0; 990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org capabilities |= AUDIO_SEND; 1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org capabilities |= AUDIO_RECV; 1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return capabilities; 1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgVoiceMediaChannel* LinphoneMediaEngine::CreateChannel() { 1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return new LinphoneVoiceChannel(this); 1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgVideoMediaChannel* LinphoneMediaEngine::CreateVideoChannel(VoiceMediaChannel* voice_ch) { 1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return NULL; 1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgbool LinphoneMediaEngine::FindAudioCodec(const AudioCodec &c) { 1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (c.id == 0) 1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (c.name == payload_type_telephone_event.mime_type) 1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifdef HAVE_SPEEX 1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (c.name == payload_type_speex_wb.mime_type && c.clockrate == payload_type_speex_wb.clock_rate) 1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (c.name == payload_type_speex_nb.mime_type && c.clockrate == payload_type_speex_nb.clock_rate) 1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif 1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifdef HAVE_ILBC 1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (have_ilbc && c.name == payload_type_ilbc.mime_type) 1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif 1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/////////////////////////////////////////////////////////////////////////// 1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Implementation of LinphoneVoiceChannel. 1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/////////////////////////////////////////////////////////////////////////// 1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgLinphoneVoiceChannel::LinphoneVoiceChannel(LinphoneMediaEngine*eng) 1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : pt_(-1), 1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_stream_(0), 1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org engine_(eng), 1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ring_stream_(0) 1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org{ 1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1402a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread *thread = rtc::ThreadManager::CurrentThread(); 1412a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SocketServer *ss = thread->socketserver(); 1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org socket_.reset(ss->CreateAsyncSocket(SOCK_DGRAM)); 1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1442a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org socket_->Bind(rtc::SocketAddress("localhost",3000)); 1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org socket_->SignalReadEvent.connect(this, &LinphoneVoiceChannel::OnIncomingData); 1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgLinphoneVoiceChannel::~LinphoneVoiceChannel() 1500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org{ 1510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org fflush(stdout); 1520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org StopRing(); 1530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (audio_stream_) 1550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_stream_stop(audio_stream_); 1560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgbool LinphoneVoiceChannel::SetPlayout(bool playout) { 1590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org play_ = playout; 1600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 1610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgbool LinphoneVoiceChannel::SetSendCodecs(const std::vector<AudioCodec>& codecs) { 1640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool first = true; 1660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<AudioCodec>::const_iterator i; 1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ortp_set_log_level_mask(ORTP_MESSAGE|ORTP_WARNING|ORTP_ERROR|ORTP_FATAL); 1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (i = codecs.begin(); i < codecs.end(); i++) { 1710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!engine_->FindAudioCodec(*i)) 1730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org continue; 1740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifdef HAVE_ILBC 1750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (engine_->have_ilbc && i->name == payload_type_ilbc.mime_type) { 1760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org rtp_profile_set_payload(&av_profile, i->id, &payload_type_ilbc); 1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif 1790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifdef HAVE_SPEEX 1800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (i->name == payload_type_speex_wb.mime_type && i->clockrate == payload_type_speex_wb.clock_rate) { 1810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org rtp_profile_set_payload(&av_profile, i->id, &payload_type_speex_wb); 1820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else if (i->name == payload_type_speex_nb.mime_type && i->clockrate == payload_type_speex_nb.clock_rate) { 1830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org rtp_profile_set_payload(&av_profile, i->id, &payload_type_speex_nb); 1840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif 1860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (i->id == 0) 1880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org rtp_profile_set_payload(&av_profile, 0, &payload_type_pcmu8000); 1890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (i->name == payload_type_telephone_event.mime_type) { 1910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org rtp_profile_set_payload(&av_profile, i->id, &payload_type_telephone_event); 1920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (first) { 1950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org StopRing(); 1960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org LOG(LS_INFO) << "Using " << i->name << "/" << i->clockrate; 1970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pt_ = i->id; 1980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_stream_ = audio_stream_start(&av_profile, 2000, "127.0.0.1", 3000, i->id, 250, 0); 1990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org first = false; 2000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (first) { 2040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org StopRing(); 2050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // We're being asked to set an empty list of codecs. This will only happen when 2060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // working with a buggy client; let's try PCMU. 2070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org LOG(LS_WARNING) << "Received empty list of codces; using PCMU/8000"; 2080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_stream_ = audio_stream_start(&av_profile, 2000, "127.0.0.1", 3000, 0, 250, 0); 2090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 2120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgbool LinphoneVoiceChannel::SetSend(SendFlags flag) { 2150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mute_ = !flag; 2160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 2170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2192a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgvoid LinphoneVoiceChannel::OnPacketReceived(rtc::Buffer* packet) { 2200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const void* data = packet->data(); 2210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int len = packet->length(); 2220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint8 buf[2048]; 2230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org memcpy(buf, data, len); 2240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org /* We may receive packets with payload type 13: comfort noise. Linphone can't 2260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * handle them, so let's ignore those packets. 2270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */ 2280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int payloadtype = buf[1] & 0x7f; 2290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (play_ && payloadtype != 13) 2302a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org socket_->SendTo(buf, len, rtc::SocketAddress("localhost",2000)); 2310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid LinphoneVoiceChannel::StartRing(bool bIncomingCall) 2340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org{ 2350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MSSndCard *sndcard = NULL; 2360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sndcard=ms_snd_card_manager_get_default_card(ms_snd_card_manager_get()); 2370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (sndcard) 2380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org { 2390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (bIncomingCall) 2400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org { 2410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (engine_->GetRingWav().size() > 0) 2420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org { 2430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org LOG(LS_VERBOSE) << "incoming ring. sound file: " << engine_->GetRingWav().c_str() << "\n"; 2440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ring_stream_ = ring_start (engine_->GetRingWav().c_str(), 1, sndcard); 2450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org else 2480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org { 2490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (engine_->GetCallWav().size() > 0) 2500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org { 2510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org LOG(LS_VERBOSE) << "outgoing ring. sound file: " << engine_->GetCallWav().c_str() << "\n"; 2520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ring_stream_ = ring_start (engine_->GetCallWav().c_str(), 1, sndcard); 2530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid LinphoneVoiceChannel::StopRing() 2590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org{ 2600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (ring_stream_) { 2610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ring_stop(ring_stream_); 2620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ring_stream_ = 0; 2630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2662a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgvoid LinphoneVoiceChannel::OnIncomingData(rtc::AsyncSocket *s) 2670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org{ 2680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org char *buf[2048]; 2690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int len; 2700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org len = s->Recv(buf, sizeof(buf)); 2712a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Buffer packet(buf, len); 2720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (network_interface_ && !mute_) 2730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org network_interface_->SendPacket(&packet); 2740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 277