diff --git a/webrtc/audio/audio_receive_stream.cc b/webrtc/audio/audio_receive_stream.cc index 8dc14e850f..8c073d9c8c 100644 --- a/webrtc/audio/audio_receive_stream.cc +++ b/webrtc/audio/audio_receive_stream.cc @@ -207,6 +207,11 @@ webrtc::AudioReceiveStream::Stats AudioReceiveStream::GetStats() const { return stats; } +int AudioReceiveStream::GetOutputLevel() const { + RTC_DCHECK_RUN_ON(&worker_thread_checker_); + return channel_proxy_->GetSpeechOutputLevel(); +} + void AudioReceiveStream::SetSink(std::unique_ptr sink) { RTC_DCHECK_RUN_ON(&worker_thread_checker_); channel_proxy_->SetSink(std::move(sink)); diff --git a/webrtc/audio/audio_receive_stream.h b/webrtc/audio/audio_receive_stream.h index e344e229a4..adac883876 100644 --- a/webrtc/audio/audio_receive_stream.h +++ b/webrtc/audio/audio_receive_stream.h @@ -46,6 +46,7 @@ class AudioReceiveStream final : public webrtc::AudioReceiveStream, void Start() override; void Stop() override; webrtc::AudioReceiveStream::Stats GetStats() const override; + int GetOutputLevel() const override; void SetSink(std::unique_ptr sink) override; void SetGain(float gain) override; diff --git a/webrtc/audio/audio_send_stream.cc b/webrtc/audio/audio_send_stream.cc index ec18125427..2d0c99b33a 100644 --- a/webrtc/audio/audio_send_stream.cc +++ b/webrtc/audio/audio_send_stream.cc @@ -25,7 +25,7 @@ #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" #include "webrtc/voice_engine/channel_proxy.h" #include "webrtc/voice_engine/include/voe_base.h" -#include "webrtc/voice_engine/include/voe_volume_control.h" +#include "webrtc/voice_engine/transmit_mixer.h" #include "webrtc/voice_engine/voice_engine_impl.h" namespace webrtc { @@ -193,16 +193,11 @@ webrtc::AudioSendStream::Stats AudioSendStream::GetStats() const { } } - // Local speech level. - { - ScopedVoEInterface volume(voice_engine()); - unsigned int level = 0; - int error = volume->GetSpeechInputLevelFullRange(level); - RTC_DCHECK_EQ(0, error); - stats.audio_level = static_cast(level); - } - ScopedVoEInterface base(voice_engine()); + RTC_DCHECK(base->transmit_mixer()); + stats.audio_level = base->transmit_mixer()->AudioLevelFullRange(); + RTC_DCHECK_LE(0, stats.audio_level); + RTC_DCHECK(base->audio_processing()); auto audio_processing_stats = base->audio_processing()->GetStatistics(); stats.echo_delay_median_ms = audio_processing_stats.delay_median; diff --git a/webrtc/audio/audio_send_stream_unittest.cc b/webrtc/audio/audio_send_stream_unittest.cc index 8e8b0e965e..b1a2401c6b 100644 --- a/webrtc/audio/audio_send_stream_unittest.cc +++ b/webrtc/audio/audio_send_stream_unittest.cc @@ -26,6 +26,7 @@ #include "webrtc/test/gtest.h" #include "webrtc/test/mock_voe_channel_proxy.h" #include "webrtc/test/mock_voice_engine.h" +#include "webrtc/voice_engine/transmit_mixer.h" namespace webrtc { namespace test { @@ -46,7 +47,7 @@ const int kEchoDelayStdDev = -3; const int kEchoReturnLoss = -65; const int kEchoReturnLossEnhancement = 101; const float kResidualEchoLikelihood = -1.0f; -const unsigned int kSpeechInputLevel = 96; +const int32_t kSpeechInputLevel = 96; const CallStatistics kCallStats = { 1345, 1678, 1901, 1234, 112, 13456, 17890, 1567, -1890, -1123}; const ReportBlock kReportBlock = {456, 780, 123, 567, 890, 132, 143, 13354}; @@ -63,6 +64,11 @@ class MockLimitObserver : public BitrateAllocator::LimitObserver { uint32_t max_padding_bitrate_bps)); }; +class MockTransmitMixer : public voe::TransmitMixer { + public: + MOCK_CONST_METHOD0(AudioLevelFullRange, int16_t()); +}; + struct ConfigHelper { explicit ConfigHelper(bool audio_bwe_enabled) : simulated_clock_(123456), @@ -213,11 +219,14 @@ struct ConfigHelper { .WillRepeatedly(Return(report_blocks)); EXPECT_CALL(*channel_proxy_, GetSendCodec(_)) .WillRepeatedly(DoAll(SetArgPointee<0>(kIsacCodec), Return(true))); - EXPECT_CALL(voice_engine_, GetSpeechInputLevelFullRange(_)) - .WillRepeatedly(DoAll(SetArgReferee<0>(kSpeechInputLevel), Return(0))); + EXPECT_CALL(voice_engine_, transmit_mixer()) + .WillRepeatedly(Return(&transmit_mixer_)); EXPECT_CALL(voice_engine_, audio_processing()) .WillRepeatedly(Return(&audio_processing_)); + EXPECT_CALL(transmit_mixer_, AudioLevelFullRange()) + .WillRepeatedly(Return(kSpeechInputLevel)); + // We have to set the instantaneous value, the average, min and max. We only // care about the instantaneous value, so we set all to the same value. audio_processing_stats_.echo_return_loss.Set( @@ -241,6 +250,7 @@ struct ConfigHelper { testing::NiceMock bitrate_observer_; testing::NiceMock remote_bitrate_observer_; MockAudioProcessing audio_processing_; + MockTransmitMixer transmit_mixer_; AudioProcessing::AudioProcessingStatistics audio_processing_stats_; PacketRouter packet_router_; CongestionController congestion_controller_; diff --git a/webrtc/call/audio_receive_stream.h b/webrtc/call/audio_receive_stream.h index f441c315a3..3959da1369 100644 --- a/webrtc/call/audio_receive_stream.h +++ b/webrtc/call/audio_receive_stream.h @@ -116,6 +116,8 @@ class AudioReceiveStream { virtual void Stop() = 0; virtual Stats GetStats() const = 0; + // TODO(solenberg): Remove, once AudioMonitor is gone. + virtual int GetOutputLevel() const = 0; // Sets an audio sink that receives unmixed audio from the receive stream. // Ownership of the sink is passed to the stream and can be used by the diff --git a/webrtc/media/engine/fakewebrtccall.h b/webrtc/media/engine/fakewebrtccall.h index 8a1547be19..1c9212d02a 100644 --- a/webrtc/media/engine/fakewebrtccall.h +++ b/webrtc/media/engine/fakewebrtccall.h @@ -94,6 +94,7 @@ class FakeAudioReceiveStream final : public webrtc::AudioReceiveStream { void Stop() override { started_ = false; } webrtc::AudioReceiveStream::Stats GetStats() const override; + int GetOutputLevel() const override { return 0; } void SetSink(std::unique_ptr sink) override; void SetGain(float gain) override; diff --git a/webrtc/media/engine/fakewebrtcvoiceengine.h b/webrtc/media/engine/fakewebrtcvoiceengine.h index 18c77663a2..e44e44da75 100644 --- a/webrtc/media/engine/fakewebrtcvoiceengine.h +++ b/webrtc/media/engine/fakewebrtcvoiceengine.h @@ -60,8 +60,7 @@ static const int kOpusBandwidthFb = 20000; class FakeWebRtcVoiceEngine : public webrtc::VoEBase, public webrtc::VoECodec, - public webrtc::VoEHardware, - public webrtc::VoEVolumeControl { + public webrtc::VoEHardware { public: struct Channel { std::vector recv_codecs; @@ -224,22 +223,6 @@ class FakeWebRtcVoiceEngine WEBRTC_STUB(EnableBuiltInNS, (bool enable)); bool BuiltInNSIsAvailable() const override { return false; } - // webrtc::VoEVolumeControl - WEBRTC_STUB(SetSpeakerVolume, (unsigned int)); - WEBRTC_STUB(GetSpeakerVolume, (unsigned int&)); - WEBRTC_STUB(SetMicVolume, (unsigned int)); - WEBRTC_STUB(GetMicVolume, (unsigned int&)); - WEBRTC_STUB(SetInputMute, (int, bool)); - WEBRTC_STUB(GetInputMute, (int, bool&)); - WEBRTC_STUB(GetSpeechInputLevel, (unsigned int&)); - WEBRTC_STUB(GetSpeechOutputLevel, (int, unsigned int&)); - WEBRTC_STUB(GetSpeechInputLevelFullRange, (unsigned int&)); - WEBRTC_STUB(GetSpeechOutputLevelFullRange, (int, unsigned int&)); - WEBRTC_STUB(SetChannelOutputVolumeScaling, (int channel, float scale)); - WEBRTC_STUB(GetChannelOutputVolumeScaling, (int channel, float& scale)); - WEBRTC_STUB(SetOutputVolumePan, (int channel, float left, float right)); - WEBRTC_STUB(GetOutputVolumePan, (int channel, float& left, float& right)); - size_t GetNetEqCapacity() const { auto ch = channels_.find(last_channel_); RTC_DCHECK(ch != channels_.end()); diff --git a/webrtc/media/engine/webrtcvoe.h b/webrtc/media/engine/webrtcvoe.h index eabde3659b..6d99b5cbf1 100644 --- a/webrtc/media/engine/webrtcvoe.h +++ b/webrtc/media/engine/webrtcvoe.h @@ -21,7 +21,6 @@ #include "webrtc/voice_engine/include/voe_codec.h" #include "webrtc/voice_engine/include/voe_errors.h" #include "webrtc/voice_engine/include/voe_hardware.h" -#include "webrtc/voice_engine/include/voe_volume_control.h" namespace cricket { // automatically handles lifetime of WebRtc VoiceEngine @@ -78,25 +77,21 @@ class VoEWrapper { public: VoEWrapper() : engine_(webrtc::VoiceEngine::Create()), - base_(engine_), codec_(engine_), hw_(engine_), - volume_(engine_) { + base_(engine_), codec_(engine_), hw_(engine_) { } VoEWrapper(webrtc::VoEBase* base, webrtc::VoECodec* codec, - webrtc::VoEHardware* hw, - webrtc::VoEVolumeControl* volume) + webrtc::VoEHardware* hw) : engine_(NULL), base_(base), codec_(codec), - hw_(hw), - volume_(volume) { + hw_(hw) { } ~VoEWrapper() {} webrtc::VoiceEngine* engine() const { return engine_.get(); } webrtc::VoEBase* base() const { return base_.get(); } webrtc::VoECodec* codec() const { return codec_.get(); } webrtc::VoEHardware* hw() const { return hw_.get(); } - webrtc::VoEVolumeControl* volume() const { return volume_.get(); } int error() { return base_->LastError(); } private: @@ -104,7 +99,6 @@ class VoEWrapper { scoped_voe_ptr base_; scoped_voe_ptr codec_; scoped_voe_ptr hw_; - scoped_voe_ptr volume_; }; } // namespace cricket diff --git a/webrtc/media/engine/webrtcvoiceengine.cc b/webrtc/media/engine/webrtcvoiceengine.cc index 996bc5accc..ae4867883a 100644 --- a/webrtc/media/engine/webrtcvoiceengine.cc +++ b/webrtc/media/engine/webrtcvoiceengine.cc @@ -962,11 +962,12 @@ void WebRtcVoiceEngine::SetDefaultDevices() { #endif // !WEBRTC_IOS } +// TODO(solenberg): Remove, once AudioMonitor is gone. int WebRtcVoiceEngine::GetInputLevel() { RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); - unsigned int ulevel; - return (voe_wrapper_->volume()->GetSpeechInputLevel(ulevel) != -1) ? - static_cast(ulevel) : -1; + int8_t level = transmit_mixer()->AudioLevel(); + RTC_DCHECK_LE(0, level); + return level; } const std::vector& WebRtcVoiceEngine::send_codecs() const { @@ -1577,6 +1578,12 @@ class WebRtcVoiceMediaChannel::WebRtcAudioReceiveStream { return stream_->GetStats(); } + int GetOutputLevel() const { + RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); + RTC_DCHECK(stream_); + return stream_->GetOutputLevel(); + } + int channel() const { RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); return config_.voe_channel_id; @@ -2341,12 +2348,13 @@ bool WebRtcVoiceMediaChannel::SetLocalSource(uint32_t ssrc, return true; } +// TODO(solenberg): Remove, once AudioMonitor is gone. bool WebRtcVoiceMediaChannel::GetActiveStreams( AudioInfo::StreamList* actives) { RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); actives->clear(); for (const auto& ch : recv_streams_) { - int level = GetOutputLevel(ch.second->channel()); + int level = ch.second->GetOutputLevel(); if (level > 0) { actives->push_back(std::make_pair(ch.first, level)); } @@ -2354,11 +2362,12 @@ bool WebRtcVoiceMediaChannel::GetActiveStreams( return true; } +// TODO(solenberg): Remove, once AudioMonitor is gone. int WebRtcVoiceMediaChannel::GetOutputLevel() { RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); int highest = 0; for (const auto& ch : recv_streams_) { - highest = std::max(GetOutputLevel(ch.second->channel()), highest); + highest = std::max(ch.second->GetOutputLevel(), highest); } return highest; } @@ -2657,12 +2666,6 @@ void WebRtcVoiceMediaChannel::SetRawAudioSink( it->second->SetRawAudioSink(std::move(sink)); } -int WebRtcVoiceMediaChannel::GetOutputLevel(int channel) { - unsigned int ulevel = 0; - int ret = engine()->voe()->volume()->GetSpeechOutputLevel(channel, ulevel); - return (ret == 0) ? static_cast(ulevel) : -1; -} - int WebRtcVoiceMediaChannel::GetReceiveChannelId(uint32_t ssrc) const { RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); const auto it = recv_streams_.find(ssrc); diff --git a/webrtc/media/engine/webrtcvoiceengine.h b/webrtc/media/engine/webrtcvoiceengine.h index ac3c989ee6..33e53f1f39 100644 --- a/webrtc/media/engine/webrtcvoiceengine.h +++ b/webrtc/media/engine/webrtcvoiceengine.h @@ -237,7 +237,6 @@ class WebRtcVoiceMediaChannel final : public VoiceMediaChannel, WebRtcVoiceEngine* engine() { return engine_; } int GetLastEngineError() { return engine()->GetLastEngineError(); } - int GetOutputLevel(int channel); void ChangePlayout(bool playout); int CreateVoEChannel(); bool DeleteVoEChannel(int channel); diff --git a/webrtc/media/engine/webrtcvoiceengine_unittest.cc b/webrtc/media/engine/webrtcvoiceengine_unittest.cc index 751d41b6aa..e72a9a0152 100644 --- a/webrtc/media/engine/webrtcvoiceengine_unittest.cc +++ b/webrtc/media/engine/webrtcvoiceengine_unittest.cc @@ -63,8 +63,7 @@ class FakeVoEWrapper : public cricket::VoEWrapper { explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine) : cricket::VoEWrapper(engine, // base engine, // codec - engine, // hw - engine) { // volume + engine) { // hw } }; diff --git a/webrtc/test/mock_voe_channel_proxy.h b/webrtc/test/mock_voe_channel_proxy.h index a2053f04a6..58fddb049c 100644 --- a/webrtc/test/mock_voe_channel_proxy.h +++ b/webrtc/test/mock_voe_channel_proxy.h @@ -42,6 +42,7 @@ class MockVoEChannelProxy : public voe::ChannelProxy { MOCK_CONST_METHOD0(GetRemoteRTCPReportBlocks, std::vector()); MOCK_CONST_METHOD0(GetNetworkStatistics, NetworkStatistics()); MOCK_CONST_METHOD0(GetDecodingCallStatistics, AudioDecodingCallStats()); + MOCK_CONST_METHOD0(GetSpeechOutputLevel, int32_t()); MOCK_CONST_METHOD0(GetSpeechOutputLevelFullRange, int32_t()); MOCK_CONST_METHOD0(GetDelayEstimate, uint32_t()); MOCK_METHOD2(SetSendTelephoneEventPayloadType, bool(int payload_type, diff --git a/webrtc/test/mock_voice_engine.h b/webrtc/test/mock_voice_engine.h index 6177304372..406b58f69d 100644 --- a/webrtc/test/mock_voice_engine.h +++ b/webrtc/test/mock_voice_engine.h @@ -21,6 +21,10 @@ #include "webrtc/voice_engine/voice_engine_impl.h" namespace webrtc { +namespace voe { +class TransmitMixer; +} // namespace voe + namespace test { // NOTE: This class inherits from VoiceEngineImpl so that its clients will be @@ -122,6 +126,7 @@ class MockVoiceEngine : public VoiceEngineImpl { const rtc::scoped_refptr& decoder_factory)); MOCK_METHOD0(audio_processing, AudioProcessing*()); MOCK_METHOD0(audio_device_module, AudioDeviceModule*()); + MOCK_METHOD0(transmit_mixer, voe::TransmitMixer*()); MOCK_METHOD0(Terminate, int()); MOCK_METHOD0(CreateChannel, int()); MOCK_METHOD1(CreateChannel, int(const ChannelConfig& config)); @@ -289,23 +294,6 @@ class MockVoiceEngine : public VoiceEngineImpl { int(int channel, bool& enable, int& redPayloadtype)); MOCK_METHOD3(SetNACKStatus, int(int channel, bool enable, int maxNoPackets)); - // VoEVolumeControl - MOCK_METHOD1(SetSpeakerVolume, int(unsigned int volume)); - MOCK_METHOD1(GetSpeakerVolume, int(unsigned int& volume)); - MOCK_METHOD1(SetMicVolume, int(unsigned int volume)); - MOCK_METHOD1(GetMicVolume, int(unsigned int& volume)); - MOCK_METHOD2(SetInputMute, int(int channel, bool enable)); - MOCK_METHOD2(GetInputMute, int(int channel, bool& enabled)); - MOCK_METHOD1(GetSpeechInputLevel, int(unsigned int& level)); - MOCK_METHOD2(GetSpeechOutputLevel, int(int channel, unsigned int& level)); - MOCK_METHOD1(GetSpeechInputLevelFullRange, int(unsigned int& level)); - MOCK_METHOD2(GetSpeechOutputLevelFullRange, - int(int channel, unsigned& level)); - MOCK_METHOD2(SetChannelOutputVolumeScaling, int(int channel, float scaling)); - MOCK_METHOD2(GetChannelOutputVolumeScaling, int(int channel, float& scaling)); - MOCK_METHOD3(SetOutputVolumePan, int(int channel, float left, float right)); - MOCK_METHOD3(GetOutputVolumePan, int(int channel, float& left, float& right)); - private: // TODO(ossu): I'm not particularly happy about keeping the decoder factory // here, but due to how gmock is implemented, I cannot just keep it in the diff --git a/webrtc/voice_engine/channel.cc b/webrtc/voice_engine/channel.cc index 60e213d291..0573245aee 100644 --- a/webrtc/voice_engine/channel.cc +++ b/webrtc/voice_engine/channel.cc @@ -39,7 +39,6 @@ #include "webrtc/voice_engine/include/voe_rtp_rtcp.h" #include "webrtc/voice_engine/output_mixer.h" #include "webrtc/voice_engine/statistics.h" -#include "webrtc/voice_engine/transmit_mixer.h" #include "webrtc/voice_engine/utility.h" namespace webrtc { @@ -908,7 +907,6 @@ Channel::Channel(int32_t channelId, capture_start_ntp_time_ms_(-1), _engineStatisticsPtr(NULL), _outputMixerPtr(NULL), - _transmitMixerPtr(NULL), _moduleProcessThreadPtr(NULL), _audioDeviceModulePtr(NULL), _voiceEngineObserverPtr(NULL), @@ -1119,7 +1117,6 @@ int32_t Channel::Init() { int32_t Channel::SetEngineInformation(Statistics& engineStatistics, OutputMixer& outputMixer, - voe::TransmitMixer& transmitMixer, ProcessThread& moduleProcessThread, AudioDeviceModule& audioDeviceModule, VoiceEngineObserver* voiceEngineObserver, @@ -1128,7 +1125,6 @@ int32_t Channel::SetEngineInformation(Statistics& engineStatistics, "Channel::SetEngineInformation()"); _engineStatisticsPtr = &engineStatistics; _outputMixerPtr = &outputMixer; - _transmitMixerPtr = &transmitMixer, _moduleProcessThreadPtr = &moduleProcessThread; _audioDeviceModulePtr = &audioDeviceModule; _voiceEngineObserverPtr = voiceEngineObserver; diff --git a/webrtc/voice_engine/channel.h b/webrtc/voice_engine/channel.h index e4e819c76f..0426adfea2 100644 --- a/webrtc/voice_engine/channel.h +++ b/webrtc/voice_engine/channel.h @@ -71,7 +71,6 @@ class RtcpRttStatsProxy; class RtpPacketSenderProxy; class Statistics; class TransportFeedbackProxy; -class TransmitMixer; class TransportSequenceNumberProxy; class VoERtcpObserver; @@ -155,7 +154,6 @@ class Channel int32_t Init(); int32_t SetEngineInformation(Statistics& engineStatistics, OutputMixer& outputMixer, - TransmitMixer& transmitMixer, ProcessThread& moduleProcessThread, AudioDeviceModule& audioDeviceModule, VoiceEngineObserver* voiceEngineObserver, @@ -478,7 +476,6 @@ class Channel // uses Statistics* _engineStatisticsPtr; OutputMixer* _outputMixerPtr; - TransmitMixer* _transmitMixerPtr; ProcessThread* _moduleProcessThreadPtr; AudioDeviceModule* _audioDeviceModulePtr; VoiceEngineObserver* _voiceEngineObserverPtr; // owned by base diff --git a/webrtc/voice_engine/channel_proxy.cc b/webrtc/voice_engine/channel_proxy.cc index 5538d9ee9e..ca1d3596c8 100644 --- a/webrtc/voice_engine/channel_proxy.cc +++ b/webrtc/voice_engine/channel_proxy.cc @@ -128,6 +128,14 @@ AudioDecodingCallStats ChannelProxy::GetDecodingCallStatistics() const { return stats; } +int32_t ChannelProxy::GetSpeechOutputLevel() const { + RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); + uint32_t level = 0; + int error = channel()->GetSpeechOutputLevel(level); + RTC_DCHECK_EQ(0, error); + return static_cast(level); +} + int32_t ChannelProxy::GetSpeechOutputLevelFullRange() const { RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); uint32_t level = 0; diff --git a/webrtc/voice_engine/channel_proxy.h b/webrtc/voice_engine/channel_proxy.h index aa7cef1e02..d8cc00b82c 100644 --- a/webrtc/voice_engine/channel_proxy.h +++ b/webrtc/voice_engine/channel_proxy.h @@ -73,6 +73,7 @@ class ChannelProxy { virtual std::vector GetRemoteRTCPReportBlocks() const; virtual NetworkStatistics GetNetworkStatistics() const; virtual AudioDecodingCallStats GetDecodingCallStatistics() const; + virtual int32_t GetSpeechOutputLevel() const; virtual int32_t GetSpeechOutputLevelFullRange() const; virtual uint32_t GetDelayEstimate() const; virtual bool SetSendTelephoneEventPayloadType(int payload_type, diff --git a/webrtc/voice_engine/transmit_mixer.h b/webrtc/voice_engine/transmit_mixer.h index 5353f97f3e..3ccf251771 100644 --- a/webrtc/voice_engine/transmit_mixer.h +++ b/webrtc/voice_engine/transmit_mixer.h @@ -87,7 +87,8 @@ public: int8_t AudioLevel() const; - int16_t AudioLevelFullRange() const; + // 'virtual' to allow mocking. + virtual int16_t AudioLevelFullRange() const; bool IsRecordingCall(); diff --git a/webrtc/voice_engine/voe_base_impl.cc b/webrtc/voice_engine/voe_base_impl.cc index 5a037bf8ca..ecf5b94e7d 100644 --- a/webrtc/voice_engine/voe_base_impl.cc +++ b/webrtc/voice_engine/voe_base_impl.cc @@ -374,9 +374,8 @@ int VoEBaseImpl::CreateChannel(const ChannelConfig& config) { int VoEBaseImpl::InitializeChannel(voe::ChannelOwner* channel_owner) { if (channel_owner->channel()->SetEngineInformation( shared_->statistics(), *shared_->output_mixer(), - *shared_->transmit_mixer(), *shared_->process_thread(), - *shared_->audio_device(), voiceEngineObserverPtr_, - &callbackCritSect_) != 0) { + *shared_->process_thread(), *shared_->audio_device(), + voiceEngineObserverPtr_, &callbackCritSect_) != 0) { shared_->SetLastError( VE_CHANNEL_NOT_CREATED, kTraceError, "CreateChannel() failed to associate engine and channel."