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; |