src\webrtc\examples\peerconnection\client\conductor.cc
1、bool Conductor::InitializePeerConnection()
1.1 webrtc::CreatePeerConnectionFactory();

src\talk\app\webrtc\peerconnectionfactory.cc
2、 bool PeerConnectionFactory::Initialize()
2.1.1 cricket::MediaEngineInterface* PeerConnectionFactory::CreateMediaEngine_w() {

return cricket::WebRtcMediaEngineFactory::Create(default_adm_.get(), video_encoder_factory_.get(),video_decoder_factory_.get());
}

src\talk\media\webrtc\webrtcmediaengine.cc
2.1.2
MediaEngineInterface* WebRtcMediaEngineFactory::Create(
webrtc::AudioDeviceModule* adm,WebRtcVideoEncoderFactory* encoder_factory,WebRtcVideoDecoderFactory* decoder_factory)
{
return CreateWebRtcMediaEngine(adm, encoder_factory, decoder_factory);
}
2.1.3
cricket::MediaEngineInterface* WebRtcMediaEngineFactory::CreateWebRtcMediaEngine(
webrtc::AudioDeviceModule* adm,WebRtcVideoEncoderFactory* encoder_factory,WebRtcVideoDecoderFactory* decoder_factory)
{
return new cricket::WebRtcMediaEngine2(adm, encoder_factory,
decoder_factory);
}

2.1.4
class WebRtcMediaEngine2
: public CompositeMediaEngine<WebRtcVoiceEngine, WebRtcVideoEngine2>
{

public:

WebRtcMediaEngine2(webrtc::AudioDeviceModule* adm,WebRtcVideoEncoderFactory* encoder_factory,WebRtcVideoDecoderFactory* decoder_factory)
};

2.1.5
\src\talk\media\webrtc\webrtcvoiceengine.cc
WebRtcVoiceEngine::WebRtcVoiceEngine()

: voe_wrapper_(new VoEWrapper())
{
Construct();
}

2.1.6

src\talk\media\webrtc\webrtcvoe.h
class VoEWrapper {

public:

VoEWrapper()
: engine_(webrtc::VoiceEngine::Create())
, processing_(engine_),
base_(engine_), codec_(engine_)
, dtmf_(engine_),
hw_(engine_), network_(engine_)
, rtp_(engine_), volume_(engine_){}
};

2.1.7
src\webrtc\voice_engine\voice_engine_impl.cc
VoiceEngine* VoiceEngine::Create()
{
return GetVoiceEngine(config, true);

}

VoiceEngine* GetVoiceEngine(const Config* config, bool owns_config)
{
VoiceEngineImpl* self = new VoiceEngineImpl(config, owns_config);
}

2.1.9
src\webrtc\voice_engine\voice_engine_impl.h
class VoiceEngineImpl : public voe::SharedData, public VoiceEngine, public VoEBaseImpl ,public VoEHardwareImpl
{public:

VoiceEngineImpl(const Config* config, bool owns_config)
:SharedData(*config),

VoEBaseImpl(this),

VoEHardwareImpl(this),
{}

};

2.1.10
void WebRtcVoiceEngine::Construct() 
{
// Load our audio codec list.
内部调用voe_wrapper_->codec()->NumOfCodecs() 
ConstructCodecs();

//获取是否需要回音消除,降噪,自动调节音量等
options_ = GetDefaultEngineOptions(); 
}

src\talk\session\media\channelmanager.cc
2.2
bool ChannelManager::Init()
{
initialized_ = worker_thread_->Invoke<bool>(Bind(
&ChannelManager::InitMediaEngine_w, this));
}
2.2.1
bool ChannelManager::InitMediaEngine_w()
{

return (media_engine_->Init(worker_thread_));

}

2.2.2
template<class VOICE, class VIDEO>

class CompositeMediaEngine : public MediaEngineInterface
{
public:
virtual bool Init(rtc::Thread* worker_thread)
{

if (!voice_.Init(worker_thread))

return false;

video_.Init();

return true;

}
protected:

VOICE voice_; //默认的WebRtcVoiceEngine或自定义的音频引擎
}

2.2.3
bool WebRtcVoiceEngine::Init(rtc::Thread* worker_thread)
{
bool res = InitInternal();
}

2.2.4
bool WebRtcVoiceEngine::InitInternal()
{
if (voe_wrapper_->base()->Init(adm_) == -1) // VoiceEngineImpl 的init
}

2.2.5

VoiceEngineImpl(const Config* config, bool owns_config)
:SharedData(*config)
, VoEHardwareImpl(this)

,VoEBaseImpl(this)

src\webrtc\voice_engine\voe_base_impl.cc

VoEBaseImpl::VoEBaseImpl(voe::SharedData* shared)

:shared_(shared)


int VoEBaseImpl::Init(AudioDeviceModule* external_adm,AudioProcessing* audioproc)
{
if (external_adm == nullptr)
{
// Create the internal ADM implementation. //shared_指向VoiceEngineImpl
shared_->set_audio_device(AudioDeviceModuleImpl::Create(
VoEId(shared_->instance_id(), -1), shared_->audio_device_layer())); // create函数中调用CreatePlatformSpecificObjects
}
else
{
// Use the already existing external ADM implementation.
shared_->set_audio_device(external_adm);  
}

SharedData::SharedData(const Config& config)

: _channelManager(_gInstanceCounter, config)
,_audioDevicePtr(NULL)
{
_audioDeviceLayer = AudioDeviceModule::kPlatformDefaultAudio;
}

SharedData::set_audio_device(AudioDeviceModule* audio_device){ _audioDevicePtr = audio_device;}

AudioDeviceModule* SharedData::audio_device() { return _audioDevicePtr; }

// Register the AudioObserver implementation

if (shared_->audio_device()->RegisterEventObserver(this) != 0)

// Register the AudioTransport implementation

if (shared_->audio_device()->RegisterAudioCallback(this) != 0)

// ADM initialization

if (shared_->audio_device()->Init() != 0)  // AudioDeviceModuleImpl::Init(),调用_ptrAudioDevice->Init()开启了一些音频处理线程,这些线程负责来采集音频,

// 如AudioDeviceWindowsWave::Init()中调用 _ptrThread = ThreadWrapper::CreateThread(ThreadFunc, this, threadName);

//->AudioDeviceWindowsWave::ThreadFunc

//->AudioDeviceWindowsWave::ThreadProcess()

//->AudioDeviceWindowsWave::RecProc(LONGLONG& consumedTime)

//->_ptrAudioBuffer->DeliverRecordedData();

int32_t AudioDeviceModuleImpl::CreatePlatformSpecificObjects()

{
AudioDeviceGeneric* ptrAudioDevice(NULL);
AudioLayer audioLayer(PlatformAudioLayer()); // AudioDeviceModule::kPlatformDefaultAudio;

ptrAudioDevice = new AudioDeviceWindowsWave(Id());


ptrAudioDevice = new AudioDeviceWindowsCore(Id());
_ptrAudioDevice = ptrAudioDevice;
}

// Initialize the default speaker
if (shared_->audio_device()->SetPlayoutDevice(WEBRTC_VOICE_ENGINE_DEFAULT_DEVICE) != 0)
if (shared_->audio_device()->InitSpeaker() != 0)

// Initialize the default microphone
if (shared_->audio_device()->SetRecordingDevice(WEBRTC_VOICE_ENGINE_DEFAULT_DEVICE) != 0)

int32_t AudioDeviceModuleImpl::SetRecordingDevice(WindowsDeviceType device)

{

return (_ptrAudioDevice->SetRecordingDevice(device));

}

if (shared_->audio_device()->InitMicrophone() != 0)

// Set number of channels
if (shared_->audio_device()->StereoPlayoutIsAvailable(&available) != 0)
if (shared_->audio_device()->SetStereoPlayout(available) != 0)

if (!audioproc) {
audioproc = AudioProcessing::Create();
}
shared_->set_audio_processing(audioproc);
}

VoEBaseImpl::StartSend()

{

 if (shared_->audio_device()->StartRecording() != 0)

}

int32_t AudioDeviceModuleImpl::StartRecording()

{
return (_ptrAudioDevice->StartRecording()); // AudioDeviceWindowsWave或AudioDeviceWindowsCore启动录音

}

webrtc自带client的音频引擎创建代码走读的更多相关文章

  1. webrtc自带client的视频引擎创建代码走读

    src\webrtc\examples\peerconnection\client\conductor.ccbool Conductor::InitializePeerConnection()1 we ...

  2. WebRTC源码分析:音频模块结构分析

    一.概要介绍WebRTC的音频处理流程,见下图: webRTC将音频会话抽象为一个通道Channel,譬如A与B进行音频通话,则A需要建立一个Channel与B进行音频数据传输.上图中有三个Chann ...

  3. 使用“Cocos引擎”创建的cpp工程如何在VS中调试Cocos2d-x源码

    前段时间Cocos2d-x更新了一个Cocos引擎,这是一个集合源码,IDE,Studio这一家老小的整合包,我们可以使用这个Cocos引擎来创建我们的项目. 在Cocos2d-x被整合到Cocos引 ...

  4. 基于cocos2d-x的Android游戏中使用fmod音频引擎

    cocos2d-x的音频引擎是cocosDenshion, 它的Android版比较弱, 只能播放一个背景音乐和些许音效, 如果要实现稍微复杂一点的音频播放, 比如同时播放几个音轨就不能了. 这一点远 ...

  5. 【Cocos2d入门教程八】浅析Cocoss2d下的音频引擎及封装音频类

    Cocos2d-x提供了一个音频CocosDenshion引擎,CocosDenshion引擎可以独立于Cocos2d-x单独使用,CocosDenshion引擎本质上封装了OpenAL音频处理库.具 ...

  6. 带你走近AngularJS 之创建自定义指令

    带你走近AngularJS 之创建自定义指令 为什么使用AngularJS 指令? 使用过 AngularJS 的朋友应该最感兴趣的是它的指令.现今市场上的前端框架也只有AngularJS 拥有自定义 ...

  7. 使用Three.js网页引擎创建酷炫的3D效果的标签墙

    使用Three.js引擎(这是开源的webgl三维引擎,gitgub)进行一个简单应用. 做一个酷炫的3d效果的标签墙(已经放在我的博客首页,大屏幕可见), 去我的博客首页看看实际效果 www.son ...

  8. WebRTC代码走读(八):代码目录结构

    转载注明出处http://blog.csdn.net/wanghorse ├── ./base //基础平台库,包括线程.锁.socket等 ├── ./build //编译脚本,gyp ├── ./ ...

  9. java版微信公众平台自定义菜单创建代码实现

    微信公众平台自定义菜单创建代码实现—java版 搞了两天的自定义菜单,终于搞定了,现在分享下心得,以便后来者少走弯路...... 好了,先看先微信官方的API 官方写的很详细,但是我看完后很茫然,不知 ...

随机推荐

  1. INDEL的重新比对和碱基质量分数的重新校准

    1.为什么要做这两步(why): indel的重新比对:这是由于比对软件的自身限制,其可能将包括indel的read解释为snp的read,这就导致calling的错误和后面的碱基质量分数的重新校准. ...

  2. 20145230《Java程序设计》第5周学习总结

    20145230 <Java程序设计>第5周学习总结 教材学习内容 本周主要学习的内容是关于异常处理的,感觉这部分内容对我们这种初学者 来说非常重要.举个例子,倘若你在编写一个Java程序 ...

  3. Redux API之bindActionCreators

    bindActionCreators(actionCreators,dispatch) 把 action creators 转成拥有同名 keys 的对象,但使用 dispatch 把每个 actio ...

  4. c++ boost库学习三:实用工具

    noncopyable 大家都知道定义一个空类的时候,它实际包含了构造函数,拷贝构造函数,赋值操作符和析构函数等. 这样就很容易产生一个问题,就是当用户调用A a(“^_^") 或者A c= ...

  5. freemarker 异常处理

    SSH2处理方案: freemarker文件如果出错,网站的前台页面会报出很明显的错误-焦黄的背景,血红的文字,很不利于用户体验的.如何修改这个问题呢?首先需要在struts.xml配置文件里添加下面 ...

  6. How does asp.net web api work?

    https://hub.packtpub.com/working-aspnet-web-api/ https://docs.microsoft.com/en-us/aspnet/web-api/ove ...

  7. HDU 3966 & POJ 3237 & HYSBZ 2243 & HRBUST 2064 树链剖分

    树链剖分是一个很固定的套路 一般用来解决树上两点之间的路径更改与查询 思想是将一棵树分成不想交的几条链 并且由于dfs的顺序性 给每条链上的点或边标的号必定是连着的 那么每两个点之间的路径都可以拆成几 ...

  8. linux下 stat statfs 获取 文件 磁盘 信息

    stat函数讲解 表头文件:    #include <sys/stat.h>              #include <unistd.h> 定义函数:    int st ...

  9. 怎么用API网关构建微服务

    选择将应用程序构建为微服务时,需要确定应用程序客户端如何与微服务交互.在单体应用程序中,只有一组端点.而在微服务架构中,每个微服务都会暴露一组通常是细粒度的端点.在本文中,我们将讨论一下这对客户端与应 ...

  10. UML类图(一)-------概述+结构

    类图用于描述系统中所包含的类以及它们之间的相互关系,帮助人们简化对系统的理解,它是系统分析和设计阶段的重要产物,也是系统编码和测试的重要模型依据.       1. 类       类(Class)封 ...