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)

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()

// AudioDeviceModule::kPlatformDefaultAudio;

 AudioDeviceWindowsWave(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启动录音

}

 

相关文章:

  • 2021-12-08
  • 2022-01-24
  • 2021-08-17
  • 2021-12-22
  • 2022-02-26
  • 2021-11-29
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-08-29
  • 2021-10-24
  • 2021-09-24
  • 2022-12-23
  • 2021-07-25
  • 2022-01-11
相关资源
相似解决方案