| Index: talk/media/webrtc/webrtcvoiceengine.cc
|
| diff --git a/talk/media/webrtc/webrtcvoiceengine.cc b/talk/media/webrtc/webrtcvoiceengine.cc
|
| index 27ca1deb2d41ed2a94edea8502ee916766e39def..f3124bf8b135e0d1448761d1898456321aac4735 100644
|
| --- a/talk/media/webrtc/webrtcvoiceengine.cc
|
| +++ b/talk/media/webrtc/webrtcvoiceengine.cc
|
| @@ -388,40 +388,41 @@ AudioOptions GetDefaultEngineOptions() {
|
| std::string GetEnableString(bool enable) {
|
| return enable ? "enable" : "disable";
|
| }
|
| +
|
| +webrtc::AudioState::Config MakeAudioStateConfig(VoEWrapper* voe_wrapper) {
|
| + webrtc::AudioState::Config config;
|
| + config.voice_engine = voe_wrapper->engine();
|
| + return config;
|
| +}
|
| +
|
| } // namespace {
|
|
|
| WebRtcVoiceEngine::WebRtcVoiceEngine()
|
| : voe_wrapper_(new VoEWrapper()),
|
| tracing_(new VoETraceWrapper()),
|
| - adm_(NULL),
|
| - log_filter_(SeverityToFilter(kDefaultLogSeverity)),
|
| - is_dumping_aec_(false) {
|
| + audio_state_(webrtc::AudioState::Create(MakeAudioStateConfig(voe()))),
|
| + log_filter_(SeverityToFilter(kDefaultLogSeverity)) {
|
| Construct();
|
| }
|
|
|
| WebRtcVoiceEngine::WebRtcVoiceEngine(VoEWrapper* voe_wrapper,
|
| - VoETraceWrapper* tracing)
|
| + VoETraceWrapper* tracing,
|
| + webrtc::AudioState* audio_state)
|
| : voe_wrapper_(voe_wrapper),
|
| tracing_(tracing),
|
| - adm_(NULL),
|
| - log_filter_(SeverityToFilter(kDefaultLogSeverity)),
|
| - is_dumping_aec_(false) {
|
| + audio_state_(audio_state),
|
| + log_filter_(SeverityToFilter(kDefaultLogSeverity)) {
|
| Construct();
|
| }
|
|
|
| void WebRtcVoiceEngine::Construct() {
|
| + std::memset(&default_agc_config_, 0, sizeof(default_agc_config_));
|
| SetTraceFilter(log_filter_);
|
| - initialized_ = false;
|
| LOG(LS_VERBOSE) << "WebRtcVoiceEngine::WebRtcVoiceEngine";
|
| SetTraceOptions("");
|
| if (tracing_->SetTraceCallback(this) == -1) {
|
| LOG_RTCERR0(SetTraceCallback);
|
| }
|
| - if (voe_wrapper_->base()->RegisterVoiceEngineObserver(*this) == -1) {
|
| - LOG_RTCERR0(RegisterVoiceEngineObserver);
|
| - }
|
| - // Clear the default agc state.
|
| - memset(&default_agc_config_, 0, sizeof(default_agc_config_));
|
|
|
| // Load our audio codec list.
|
| ConstructCodecs();
|
| @@ -509,9 +510,6 @@ bool WebRtcVoiceEngine::GetVoeCodec(int index, webrtc::CodecInst* codec) {
|
|
|
| WebRtcVoiceEngine::~WebRtcVoiceEngine() {
|
| LOG(LS_VERBOSE) << "WebRtcVoiceEngine::~WebRtcVoiceEngine";
|
| - if (voe_wrapper_->base()->DeRegisterVoiceEngineObserver() == -1) {
|
| - LOG_RTCERR0(DeRegisterVoiceEngineObserver);
|
| - }
|
| if (adm_) {
|
| voe_wrapper_.reset();
|
| adm_->Release();
|
| @@ -521,8 +519,8 @@ WebRtcVoiceEngine::~WebRtcVoiceEngine() {
|
| tracing_->SetTraceCallback(NULL);
|
| }
|
|
|
| -bool WebRtcVoiceEngine::Init(rtc::Thread* worker_thread) {
|
| - RTC_DCHECK(worker_thread == rtc::Thread::Current());
|
| +bool WebRtcVoiceEngine::Init(rtc::Thread* thread) {
|
| + RTC_DCHECK(thread == rtc::Thread::Current());
|
| LOG(LS_INFO) << "WebRtcVoiceEngine::Init";
|
| bool res = InitInternal();
|
| if (res) {
|
| @@ -1201,28 +1199,15 @@ void WebRtcVoiceEngine::Print(webrtc::TraceLevel level, const char* trace,
|
| }
|
| }
|
|
|
| -void WebRtcVoiceEngine::CallbackOnError(int channel_id, int err_code) {
|
| - RTC_DCHECK(channel_id == -1);
|
| - LOG(LS_WARNING) << "VoiceEngine error " << err_code << " reported on channel "
|
| - << channel_id << ".";
|
| - rtc::CritScope lock(&channels_cs_);
|
| - for (WebRtcVoiceMediaChannel* channel : channels_) {
|
| - channel->OnError(err_code);
|
| - }
|
| -}
|
| -
|
| void WebRtcVoiceEngine::RegisterChannel(WebRtcVoiceMediaChannel* channel) {
|
| - RTC_DCHECK(channel != NULL);
|
| - rtc::CritScope lock(&channels_cs_);
|
| + RTC_DCHECK(channel);
|
| channels_.push_back(channel);
|
| }
|
|
|
| void WebRtcVoiceEngine::UnregisterChannel(WebRtcVoiceMediaChannel* channel) {
|
| - rtc::CritScope lock(&channels_cs_);
|
| auto it = std::find(channels_.begin(), channels_.end(), channel);
|
| - if (it != channels_.end()) {
|
| - channels_.erase(it);
|
| - }
|
| + RTC_DCHECK(it != channels_.end());
|
| + channels_.erase(it);
|
| }
|
|
|
| // Adjusts the default AGC target level by the specified delta.
|
| @@ -1333,7 +1318,7 @@ class WebRtcVoiceMediaChannel::WebRtcAudioSendStream
|
| RTC_DCHECK(stream_);
|
| }
|
| ~WebRtcAudioSendStream() override {
|
| - RTC_DCHECK(signal_thread_checker_.CalledOnValidThread());
|
| + RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| Stop();
|
| call_->DestroyAudioSendStream(stream_);
|
| }
|
| @@ -1343,7 +1328,7 @@ class WebRtcVoiceMediaChannel::WebRtcAudioSendStream
|
| // This method is called on the libjingle worker thread.
|
| // TODO(xians): Make sure Start() is called only once.
|
| void Start(AudioRenderer* renderer) {
|
| - RTC_DCHECK(signal_thread_checker_.CalledOnValidThread());
|
| + RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| RTC_DCHECK(renderer);
|
| if (renderer_) {
|
| RTC_DCHECK(renderer_ == renderer);
|
| @@ -1354,7 +1339,7 @@ class WebRtcVoiceMediaChannel::WebRtcAudioSendStream
|
| }
|
|
|
| webrtc::AudioSendStream::Stats GetStats() const {
|
| - RTC_DCHECK(signal_thread_checker_.CalledOnValidThread());
|
| + RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| return stream_->GetStats();
|
| }
|
|
|
| @@ -1362,7 +1347,7 @@ class WebRtcVoiceMediaChannel::WebRtcAudioSendStream
|
| // callback will be received after this method.
|
| // This method is called on the libjingle worker thread.
|
| void Stop() {
|
| - RTC_DCHECK(signal_thread_checker_.CalledOnValidThread());
|
| + RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| if (renderer_) {
|
| renderer_->SetSink(nullptr);
|
| renderer_ = nullptr;
|
| @@ -1376,6 +1361,7 @@ class WebRtcVoiceMediaChannel::WebRtcAudioSendStream
|
| int sample_rate,
|
| int number_of_channels,
|
| size_t number_of_frames) override {
|
| + RTC_DCHECK(!thread_checker_.CalledOnValidThread());
|
| RTC_DCHECK(audio_capture_thread_checker_.CalledOnValidThread());
|
| RTC_DCHECK(voe_audio_transport_);
|
| voe_audio_transport_->OnData(channel_,
|
| @@ -1389,7 +1375,7 @@ class WebRtcVoiceMediaChannel::WebRtcAudioSendStream
|
| // Callback from the |renderer_| when it is going away. In case Start() has
|
| // never been called, this callback won't be triggered.
|
| void OnClose() override {
|
| - RTC_DCHECK(signal_thread_checker_.CalledOnValidThread());
|
| + RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| // Set |renderer_| to nullptr to make sure no more callback will get into
|
| // the renderer.
|
| renderer_ = nullptr;
|
| @@ -1397,12 +1383,12 @@ class WebRtcVoiceMediaChannel::WebRtcAudioSendStream
|
|
|
| // Accessor to the VoE channel ID.
|
| int channel() const {
|
| - RTC_DCHECK(signal_thread_checker_.CalledOnValidThread());
|
| + RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| return channel_;
|
| }
|
|
|
| private:
|
| - rtc::ThreadChecker signal_thread_checker_;
|
| + rtc::ThreadChecker thread_checker_;
|
| rtc::ThreadChecker audio_capture_thread_checker_;
|
| const int channel_ = -1;
|
| webrtc::AudioTransport* const voe_audio_transport_ = nullptr;
|
| @@ -1434,20 +1420,9 @@ class WebRtcVoiceMediaChannel::WebRtcAudioReceiveStream {
|
| WebRtcVoiceMediaChannel::WebRtcVoiceMediaChannel(WebRtcVoiceEngine* engine,
|
| const AudioOptions& options,
|
| webrtc::Call* call)
|
| - : engine_(engine),
|
| - send_bitrate_setting_(false),
|
| - send_bitrate_bps_(0),
|
| - options_(),
|
| - dtmf_allowed_(false),
|
| - desired_playout_(false),
|
| - nack_enabled_(false),
|
| - playout_(false),
|
| - typing_noise_detected_(false),
|
| - desired_send_(SEND_NOTHING),
|
| - send_(SEND_NOTHING),
|
| - call_(call) {
|
| + : engine_(engine), call_(call) {
|
| LOG(LS_VERBOSE) << "WebRtcVoiceMediaChannel::WebRtcVoiceMediaChannel";
|
| - RTC_DCHECK(nullptr != call);
|
| + RTC_DCHECK(call);
|
| engine->RegisterChannel(this);
|
| SetOptions(options);
|
| }
|
| @@ -2652,9 +2627,8 @@ bool WebRtcVoiceMediaChannel::GetStats(VoiceMediaInfo* info) {
|
| sinfo.echo_delay_std_ms = stats.echo_delay_std_ms;
|
| sinfo.echo_return_loss = stats.echo_return_loss;
|
| sinfo.echo_return_loss_enhancement = stats.echo_return_loss_enhancement;
|
| - sinfo.typing_noise_detected = typing_noise_detected_;
|
| - // TODO(solenberg): Move to AudioSendStream.
|
| - // sinfo.typing_noise_detected = stats.typing_noise_detected;
|
| + sinfo.typing_noise_detected =
|
| + (send_ == SEND_NOTHING ? false : stats.typing_noise_detected);
|
| info->senders.push_back(sinfo);
|
| }
|
|
|
| @@ -2694,17 +2668,6 @@ bool WebRtcVoiceMediaChannel::GetStats(VoiceMediaInfo* info) {
|
| return true;
|
| }
|
|
|
| -void WebRtcVoiceMediaChannel::OnError(int error) {
|
| - if (send_ == SEND_NOTHING) {
|
| - return;
|
| - }
|
| - if (error == VE_TYPING_NOISE_WARNING) {
|
| - typing_noise_detected_ = true;
|
| - } else if (error == VE_TYPING_NOISE_OFF_WARNING) {
|
| - typing_noise_detected_ = false;
|
| - }
|
| -}
|
| -
|
| int WebRtcVoiceMediaChannel::GetOutputLevel(int channel) {
|
| unsigned int ulevel = 0;
|
| int ret = engine()->voe()->volume()->GetSpeechOutputLevel(channel, ulevel);
|
| @@ -2787,39 +2750,6 @@ bool WebRtcVoiceMediaChannel::SetPlayout(int channel, bool playout) {
|
| return true;
|
| }
|
|
|
| -// Convert VoiceEngine error code into VoiceMediaChannel::Error enum.
|
| -VoiceMediaChannel::Error
|
| - WebRtcVoiceMediaChannel::WebRtcErrorToChannelError(int err_code) {
|
| - switch (err_code) {
|
| - case 0:
|
| - return ERROR_NONE;
|
| - case VE_CANNOT_START_RECORDING:
|
| - case VE_MIC_VOL_ERROR:
|
| - case VE_GET_MIC_VOL_ERROR:
|
| - case VE_CANNOT_ACCESS_MIC_VOL:
|
| - return ERROR_REC_DEVICE_OPEN_FAILED;
|
| - case VE_SATURATION_WARNING:
|
| - return ERROR_REC_DEVICE_SATURATION;
|
| - case VE_REC_DEVICE_REMOVED:
|
| - return ERROR_REC_DEVICE_REMOVED;
|
| - case VE_RUNTIME_REC_WARNING:
|
| - case VE_RUNTIME_REC_ERROR:
|
| - return ERROR_REC_RUNTIME_ERROR;
|
| - case VE_CANNOT_START_PLAYOUT:
|
| - case VE_SPEAKER_VOL_ERROR:
|
| - case VE_GET_SPEAKER_VOL_ERROR:
|
| - case VE_CANNOT_ACCESS_SPEAKER_VOL:
|
| - return ERROR_PLAY_DEVICE_OPEN_FAILED;
|
| - case VE_RUNTIME_PLAY_WARNING:
|
| - case VE_RUNTIME_PLAY_ERROR:
|
| - return ERROR_PLAY_RUNTIME_ERROR;
|
| - case VE_TYPING_NOISE_WARNING:
|
| - return ERROR_REC_TYPING_NOISE_DETECTED;
|
| - default:
|
| - return VoiceMediaChannel::ERROR_OTHER;
|
| - }
|
| -}
|
| -
|
| bool WebRtcVoiceMediaChannel::SetHeaderExtension(ExtensionSetterFunction setter,
|
| int channel_id, const RtpHeaderExtension* extension) {
|
| bool enable = false;
|
|
|