Index: talk/media/webrtc/webrtcvoiceengine.cc |
diff --git a/talk/media/webrtc/webrtcvoiceengine.cc b/talk/media/webrtc/webrtcvoiceengine.cc |
index a5c8089d1020dd0d4a6ec41530fd757bd39021b2..37df244f4f1613d23a80cc60be2a0fc45085e93d 100644 |
--- a/talk/media/webrtc/webrtcvoiceengine.cc |
+++ b/talk/media/webrtc/webrtcvoiceengine.cc |
@@ -388,14 +388,20 @@ 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(); |
} |
@@ -403,25 +409,20 @@ WebRtcVoiceEngine::WebRtcVoiceEngine(VoEWrapper* voe_wrapper, |
VoETraceWrapper* tracing) |
: voe_wrapper_(voe_wrapper), |
tracing_(tracing), |
- adm_(NULL), |
- log_filter_(SeverityToFilter(kDefaultLogSeverity)), |
- is_dumping_aec_(false) { |
+ log_filter_(SeverityToFilter(kDefaultLogSeverity)) { |
Construct(); |
} |
void WebRtcVoiceEngine::Construct() { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
+ signal_thread_checker_.DetachFromThread(); |
+ 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(); |
@@ -442,6 +443,7 @@ void WebRtcVoiceEngine::Construct() { |
} |
void WebRtcVoiceEngine::ConstructCodecs() { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
LOG(LS_INFO) << "WebRtc VoiceEngine codecs:"; |
int ncodecs = voe_wrapper_->codec()->NumOfCodecs(); |
for (int i = 0; i < ncodecs; ++i) { |
@@ -499,6 +501,7 @@ void WebRtcVoiceEngine::ConstructCodecs() { |
} |
bool WebRtcVoiceEngine::GetVoeCodec(int index, webrtc::CodecInst* codec) { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
if (voe_wrapper_->codec()->GetCodec(index, *codec) == -1) { |
return false; |
} |
@@ -508,10 +511,8 @@ bool WebRtcVoiceEngine::GetVoeCodec(int index, webrtc::CodecInst* codec) { |
} |
WebRtcVoiceEngine::~WebRtcVoiceEngine() { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
LOG(LS_VERBOSE) << "WebRtcVoiceEngine::~WebRtcVoiceEngine"; |
- if (voe_wrapper_->base()->DeRegisterVoiceEngineObserver() == -1) { |
- LOG_RTCERR0(DeRegisterVoiceEngineObserver); |
- } |
if (adm_) { |
voe_wrapper_.reset(); |
adm_->Release(); |
@@ -522,6 +523,7 @@ WebRtcVoiceEngine::~WebRtcVoiceEngine() { |
} |
bool WebRtcVoiceEngine::Init(rtc::Thread* worker_thread) { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
RTC_DCHECK(worker_thread == rtc::Thread::Current()); |
LOG(LS_INFO) << "WebRtcVoiceEngine::Init"; |
bool res = InitInternal(); |
@@ -535,6 +537,7 @@ bool WebRtcVoiceEngine::Init(rtc::Thread* worker_thread) { |
} |
bool WebRtcVoiceEngine::InitInternal() { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
// Temporarily turn logging level up for the Init call |
int old_filter = log_filter_; |
int extended_filter = log_filter_ | SeverityToFilter(rtc::LS_INFO); |
@@ -588,6 +591,7 @@ bool WebRtcVoiceEngine::InitInternal() { |
} |
void WebRtcVoiceEngine::Terminate() { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
LOG(LS_INFO) << "WebRtcVoiceEngine::Terminate"; |
initialized_ = false; |
@@ -596,12 +600,20 @@ void WebRtcVoiceEngine::Terminate() { |
voe_wrapper_->base()->Terminate(); |
} |
+rtc::scoped_refptr<webrtc::AudioState> |
+ WebRtcVoiceEngine::GetAudioState() const { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
+ return audio_state_; |
+} |
+ |
VoiceMediaChannel* WebRtcVoiceEngine::CreateChannel(webrtc::Call* call, |
const AudioOptions& options) { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
return new WebRtcVoiceMediaChannel(this, options, call); |
} |
bool WebRtcVoiceEngine::SetOptions(const AudioOptions& options) { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
if (!ApplyOptions(options)) { |
return false; |
} |
@@ -612,6 +624,7 @@ bool WebRtcVoiceEngine::SetOptions(const AudioOptions& options) { |
// AudioOptions defaults are set in InitInternal (for options with corresponding |
// MediaEngineInterface flags) and in SetOptions(int) for flagless options. |
bool WebRtcVoiceEngine::ApplyOptions(const AudioOptions& options_in) { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
LOG(LS_INFO) << "ApplyOptions: " << options_in.ToString(); |
AudioOptions options = options_in; // The options are modified below. |
// kEcConference is AEC with high suppression. |
@@ -887,6 +900,7 @@ bool WebRtcVoiceEngine::ApplyOptions(const AudioOptions& options_in) { |
// soundclip device. At that time, reinstate the soundclip pause/resume code. |
bool WebRtcVoiceEngine::SetDevices(const Device* in_device, |
const Device* out_device) { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
#if !defined(IOS) |
int in_id = in_device ? rtc::FromString<int>(in_device->id) : |
kDefaultAudioDeviceId; |
@@ -976,6 +990,7 @@ bool WebRtcVoiceEngine::SetDevices(const Device* in_device, |
bool WebRtcVoiceEngine::FindWebRtcAudioDeviceId( |
bool is_input, const std::string& dev_name, int dev_id, int* rtc_id) { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
// In Linux, VoiceEngine uses the same device dev_id as the device manager. |
#if defined(LINUX) || defined(ANDROID) |
*rtc_id = dev_id; |
@@ -1025,6 +1040,7 @@ bool WebRtcVoiceEngine::FindWebRtcAudioDeviceId( |
} |
bool WebRtcVoiceEngine::GetOutputVolume(int* level) { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
unsigned int ulevel; |
if (voe_wrapper_->volume()->GetSpeakerVolume(ulevel) == -1) { |
LOG_RTCERR1(GetSpeakerVolume, level); |
@@ -1035,6 +1051,7 @@ bool WebRtcVoiceEngine::GetOutputVolume(int* level) { |
} |
bool WebRtcVoiceEngine::SetOutputVolume(int level) { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
RTC_DCHECK(level >= 0 && level <= 255); |
if (voe_wrapper_->volume()->SetSpeakerVolume(level) == -1) { |
LOG_RTCERR1(SetSpeakerVolume, level); |
@@ -1044,22 +1061,26 @@ bool WebRtcVoiceEngine::SetOutputVolume(int level) { |
} |
int WebRtcVoiceEngine::GetInputLevel() { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
unsigned int ulevel; |
return (voe_wrapper_->volume()->GetSpeechInputLevel(ulevel) != -1) ? |
static_cast<int>(ulevel) : -1; |
} |
const std::vector<AudioCodec>& WebRtcVoiceEngine::codecs() { |
+ RTC_DCHECK(signal_thread_checker_.CalledOnValidThread()); |
return codecs_; |
} |
bool WebRtcVoiceEngine::FindCodec(const AudioCodec& in) { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
return FindWebRtcCodec(in, NULL); |
} |
// Get the VoiceEngine codec that matches |in|, with the supplied settings. |
bool WebRtcVoiceEngine::FindWebRtcCodec(const AudioCodec& in, |
webrtc::CodecInst* out) { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
int ncodecs = voe_wrapper_->codec()->NumOfCodecs(); |
for (int i = 0; i < ncodecs; ++i) { |
webrtc::CodecInst voe_codec; |
@@ -1101,10 +1122,12 @@ bool WebRtcVoiceEngine::FindWebRtcCodec(const AudioCodec& in, |
} |
const std::vector<RtpHeaderExtension>& |
WebRtcVoiceEngine::rtp_header_extensions() const { |
+ RTC_DCHECK(signal_thread_checker_.CalledOnValidThread()); |
return rtp_header_extensions_; |
} |
void WebRtcVoiceEngine::SetLogging(int min_sev, const char* filter) { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
// if min_sev == -1, we keep the current log level. |
if (min_sev >= 0) { |
SetTraceFilter(SeverityToFilter(min_sev)); |
@@ -1114,10 +1137,12 @@ void WebRtcVoiceEngine::SetLogging(int min_sev, const char* filter) { |
} |
int WebRtcVoiceEngine::GetLastEngineError() { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
return voe_wrapper_->error(); |
} |
void WebRtcVoiceEngine::SetTraceFilter(int filter) { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
log_filter_ = filter; |
tracing_->SetTraceFilter(filter); |
} |
@@ -1135,6 +1160,7 @@ void WebRtcVoiceEngine::SetTraceFilter(int filter) { |
// For more details see: "https://sites.google.com/a/google.com/wavelet/Home/ |
// Magic-Flute--RTC-Engine-/Magic-Flute-Command-Line-Parameters" |
void WebRtcVoiceEngine::SetTraceOptions(const std::string& options) { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
// Set encrypted trace file. |
std::vector<std::string> opts; |
rtc::tokenize(options, ' ', '"', '"', &opts); |
@@ -1174,6 +1200,7 @@ void WebRtcVoiceEngine::SetTraceOptions(const std::string& options) { |
void WebRtcVoiceEngine::Print(webrtc::TraceLevel level, const char* trace, |
int length) { |
+ // Note: This callback can happen on any thread! |
rtc::LoggingSeverity sev = rtc::LS_VERBOSE; |
if (level == webrtc::kTraceError || level == webrtc::kTraceCritical) |
sev = rtc::LS_ERROR; |
@@ -1195,34 +1222,24 @@ 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(worker_thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(channel); |
channels_.push_back(channel); |
} |
void WebRtcVoiceEngine::UnregisterChannel(WebRtcVoiceMediaChannel* channel) { |
- rtc::CritScope lock(&channels_cs_); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
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. |
// NB: If we start messing with other config fields, we'll want |
// to save the current webrtc::AgcConfig as well. |
bool WebRtcVoiceEngine::AdjustAgcLevel(int delta) { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
webrtc::AgcConfig config = default_agc_config_; |
config.targetLeveldBOv -= delta; |
@@ -1238,6 +1255,7 @@ bool WebRtcVoiceEngine::AdjustAgcLevel(int delta) { |
} |
bool WebRtcVoiceEngine::SetAudioDeviceModule(webrtc::AudioDeviceModule* adm) { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
if (initialized_) { |
LOG(LS_WARNING) << "SetAudioDeviceModule can not be called after Init."; |
return false; |
@@ -1254,6 +1272,7 @@ bool WebRtcVoiceEngine::SetAudioDeviceModule(webrtc::AudioDeviceModule* adm) { |
} |
bool WebRtcVoiceEngine::StartAecDump(rtc::PlatformFile file) { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
FILE* aec_dump_file_stream = rtc::FdopenPlatformFileForWriting(file); |
if (!aec_dump_file_stream) { |
LOG(LS_ERROR) << "Could not open AEC dump file stream."; |
@@ -1273,6 +1292,7 @@ bool WebRtcVoiceEngine::StartAecDump(rtc::PlatformFile file) { |
} |
void WebRtcVoiceEngine::StartAecDump(const std::string& filename) { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
if (!is_dumping_aec_) { |
// Start dumping AEC when we are not dumping. |
if (voe_wrapper_->processing()->StartDebugRecording( |
@@ -1285,6 +1305,7 @@ void WebRtcVoiceEngine::StartAecDump(const std::string& filename) { |
} |
void WebRtcVoiceEngine::StopAecDump() { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
if (is_dumping_aec_) { |
// Stop dumping AEC when we are dumping. |
if (voe_wrapper_->processing()->StopDebugRecording() != |
@@ -1296,14 +1317,17 @@ void WebRtcVoiceEngine::StopAecDump() { |
} |
bool WebRtcVoiceEngine::StartRtcEventLog(rtc::PlatformFile file) { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
return voe_wrapper_->codec()->GetEventLog()->StartLogging(file); |
} |
void WebRtcVoiceEngine::StopRtcEventLog() { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
voe_wrapper_->codec()->GetEventLog()->StopLogging(); |
} |
int WebRtcVoiceEngine::CreateVoEChannel() { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
return voe_wrapper_->base()->CreateChannel(voe_config_); |
} |
@@ -1327,7 +1351,7 @@ class WebRtcVoiceMediaChannel::WebRtcAudioSendStream |
RTC_DCHECK(stream_); |
} |
~WebRtcAudioSendStream() override { |
- RTC_DCHECK(signal_thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
Stop(); |
call_->DestroyAudioSendStream(stream_); |
} |
@@ -1337,7 +1361,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(worker_thread_checker_.CalledOnValidThread()); |
RTC_DCHECK(renderer); |
if (renderer_) { |
RTC_DCHECK(renderer_ == renderer); |
@@ -1348,7 +1372,7 @@ class WebRtcVoiceMediaChannel::WebRtcAudioSendStream |
} |
webrtc::AudioSendStream::Stats GetStats() const { |
- RTC_DCHECK(signal_thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
return stream_->GetStats(); |
} |
@@ -1356,7 +1380,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(worker_thread_checker_.CalledOnValidThread()); |
if (renderer_) { |
renderer_->SetSink(nullptr); |
renderer_ = nullptr; |
@@ -1370,6 +1394,7 @@ class WebRtcVoiceMediaChannel::WebRtcAudioSendStream |
int sample_rate, |
int number_of_channels, |
size_t number_of_frames) override { |
+ RTC_DCHECK(!worker_thread_checker_.CalledOnValidThread()); |
RTC_DCHECK(audio_capture_thread_checker_.CalledOnValidThread()); |
RTC_DCHECK(voe_audio_transport_); |
voe_audio_transport_->OnData(channel_, |
@@ -1383,7 +1408,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(worker_thread_checker_.CalledOnValidThread()); |
// Set |renderer_| to nullptr to make sure no more callback will get into |
// the renderer. |
renderer_ = nullptr; |
@@ -1391,12 +1416,12 @@ class WebRtcVoiceMediaChannel::WebRtcAudioSendStream |
// Accessor to the VoE channel ID. |
int channel() const { |
- RTC_DCHECK(signal_thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
return channel_; |
} |
private: |
- rtc::ThreadChecker signal_thread_checker_; |
+ rtc::ThreadChecker worker_thread_checker_; |
rtc::ThreadChecker audio_capture_thread_checker_; |
const int channel_ = -1; |
webrtc::AudioTransport* const voe_audio_transport_ = nullptr; |
@@ -1428,26 +1453,15 @@ 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); |
} |
WebRtcVoiceMediaChannel::~WebRtcVoiceMediaChannel() { |
- RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
LOG(LS_VERBOSE) << "WebRtcVoiceMediaChannel::~WebRtcVoiceMediaChannel"; |
// Remove any remaining send streams. |
@@ -1467,7 +1481,7 @@ WebRtcVoiceMediaChannel::~WebRtcVoiceMediaChannel() { |
bool WebRtcVoiceMediaChannel::SetSendParameters( |
const AudioSendParameters& params) { |
- RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
// TODO(pthatcher): Refactor this to be more clean now that we have |
// all the information at once. |
return (SetSendCodecs(params.codecs) && |
@@ -1478,7 +1492,7 @@ bool WebRtcVoiceMediaChannel::SetSendParameters( |
bool WebRtcVoiceMediaChannel::SetRecvParameters( |
const AudioRecvParameters& params) { |
- RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
// TODO(pthatcher): Refactor this to be more clean now that we have |
// all the information at once. |
return (SetRecvCodecs(params.codecs) && |
@@ -1486,7 +1500,7 @@ bool WebRtcVoiceMediaChannel::SetRecvParameters( |
} |
bool WebRtcVoiceMediaChannel::SetOptions(const AudioOptions& options) { |
- RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
LOG(LS_INFO) << "Setting voice channel options: " |
<< options.ToString(); |
@@ -1525,7 +1539,7 @@ bool WebRtcVoiceMediaChannel::SetOptions(const AudioOptions& options) { |
bool WebRtcVoiceMediaChannel::SetRecvCodecs( |
const std::vector<AudioCodec>& codecs) { |
- RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
// Set the payload types to be used for incoming media. |
LOG(LS_INFO) << "Setting receive voice codecs."; |
@@ -1783,7 +1797,7 @@ bool WebRtcVoiceMediaChannel::SetSendCodecs( |
bool WebRtcVoiceMediaChannel::SetSendCodecs( |
const std::vector<AudioCodec>& codecs) { |
- RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
dtmf_allowed_ = false; |
for (const AudioCodec& codec : codecs) { |
@@ -1840,7 +1854,7 @@ bool WebRtcVoiceMediaChannel::SetSendCodec( |
bool WebRtcVoiceMediaChannel::SetRecvRtpHeaderExtensions( |
const std::vector<RtpHeaderExtension>& extensions) { |
- RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
if (receive_extensions_ == extensions) { |
return true; |
} |
@@ -1901,7 +1915,7 @@ bool WebRtcVoiceMediaChannel::SetChannelRecvRtpHeaderExtensions( |
bool WebRtcVoiceMediaChannel::SetSendRtpHeaderExtensions( |
const std::vector<RtpHeaderExtension>& extensions) { |
- RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
if (send_extensions_ == extensions) { |
return true; |
} |
@@ -1952,7 +1966,7 @@ bool WebRtcVoiceMediaChannel::ResumePlayout() { |
} |
bool WebRtcVoiceMediaChannel::ChangePlayout(bool playout) { |
- RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
if (playout_ == playout) { |
return true; |
} |
@@ -2033,7 +2047,7 @@ bool WebRtcVoiceMediaChannel::SetAudioSend(uint32_t ssrc, |
bool enable, |
const AudioOptions* options, |
AudioRenderer* renderer) { |
- RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
// TODO(solenberg): The state change should be fully rolled back if any one of |
// these calls fail. |
if (!SetLocalRenderer(ssrc, renderer)) { |
@@ -2074,7 +2088,7 @@ bool WebRtcVoiceMediaChannel::DeleteChannel(int channel) { |
} |
bool WebRtcVoiceMediaChannel::AddSendStream(const StreamParams& sp) { |
- RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
LOG(LS_INFO) << "AddSendStream: " << sp.ToString(); |
uint32_t ssrc = sp.first_ssrc(); |
@@ -2148,7 +2162,7 @@ bool WebRtcVoiceMediaChannel::AddSendStream(const StreamParams& sp) { |
} |
bool WebRtcVoiceMediaChannel::RemoveSendStream(uint32_t ssrc) { |
- RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
auto it = send_streams_.find(ssrc); |
if (it == send_streams_.end()) { |
LOG(LS_WARNING) << "Try to remove stream with ssrc " << ssrc |
@@ -2177,7 +2191,7 @@ bool WebRtcVoiceMediaChannel::RemoveSendStream(uint32_t ssrc) { |
} |
bool WebRtcVoiceMediaChannel::AddRecvStream(const StreamParams& sp) { |
- RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
LOG(LS_INFO) << "AddRecvStream: " << sp.ToString(); |
if (!ValidateStreamParams(sp)) { |
@@ -2224,7 +2238,7 @@ bool WebRtcVoiceMediaChannel::AddRecvStream(const StreamParams& sp) { |
} |
bool WebRtcVoiceMediaChannel::ConfigureRecvChannel(int channel) { |
- RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
int send_channel = GetSendChannelId(receiver_reports_ssrc_); |
if (send_channel != -1) { |
@@ -2279,7 +2293,7 @@ bool WebRtcVoiceMediaChannel::ConfigureRecvChannel(int channel) { |
} |
bool WebRtcVoiceMediaChannel::RemoveRecvStream(uint32_t ssrc) { |
- RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
LOG(LS_INFO) << "RemoveRecvStream: " << ssrc; |
auto it = receive_channels_.find(ssrc); |
@@ -2331,7 +2345,7 @@ bool WebRtcVoiceMediaChannel::SetLocalRenderer(uint32_t ssrc, |
bool WebRtcVoiceMediaChannel::GetActiveStreams( |
AudioInfo::StreamList* actives) { |
- RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
actives->clear(); |
for (const auto& ch : receive_channels_) { |
int level = GetOutputLevel(ch.second->channel()); |
@@ -2343,7 +2357,7 @@ bool WebRtcVoiceMediaChannel::GetActiveStreams( |
} |
int WebRtcVoiceMediaChannel::GetOutputLevel() { |
- RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
int highest = 0; |
for (const auto& ch : receive_channels_) { |
highest = std::max(GetOutputLevel(ch.second->channel()), highest); |
@@ -2377,7 +2391,7 @@ void WebRtcVoiceMediaChannel::SetTypingDetectionParameters(int time_window, |
} |
bool WebRtcVoiceMediaChannel::SetOutputVolume(uint32_t ssrc, double volume) { |
- RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
if (ssrc == 0) { |
default_recv_volume_ = volume; |
if (default_recv_ssrc_ == -1) { |
@@ -2409,7 +2423,7 @@ bool WebRtcVoiceMediaChannel::InsertDtmf(uint32_t ssrc, |
int event, |
int duration, |
int flags) { |
- RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
if (!dtmf_allowed_) { |
return false; |
} |
@@ -2451,7 +2465,7 @@ bool WebRtcVoiceMediaChannel::InsertDtmf(uint32_t ssrc, |
void WebRtcVoiceMediaChannel::OnPacketReceived( |
rtc::Buffer* packet, const rtc::PacketTime& packet_time) { |
- RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
uint32_t ssrc = 0; |
if (!GetRtpSsrc(packet->data(), packet->size(), &ssrc)) { |
@@ -2494,7 +2508,7 @@ void WebRtcVoiceMediaChannel::OnPacketReceived( |
void WebRtcVoiceMediaChannel::OnRtcpReceived( |
rtc::Buffer* packet, const rtc::PacketTime& packet_time) { |
- RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
// Forward packet to Call as well. |
const webrtc::PacketTime webrtc_packet_time(packet_time.timestamp, |
@@ -2536,7 +2550,7 @@ void WebRtcVoiceMediaChannel::OnRtcpReceived( |
} |
bool WebRtcVoiceMediaChannel::MuteStream(uint32_t ssrc, bool muted) { |
- RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
int channel = GetSendChannelId(ssrc); |
if (channel == -1) { |
LOG(LS_WARNING) << "The specified ssrc " << ssrc << " is not in use."; |
@@ -2623,7 +2637,7 @@ bool WebRtcVoiceMediaChannel::SetSendBitrateInternal(int bps) { |
} |
bool WebRtcVoiceMediaChannel::GetStats(VoiceMediaInfo* info) { |
- RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
RTC_DCHECK(info); |
// Get SSRC and stats for each sender. |
@@ -2646,9 +2660,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); |
} |
@@ -2688,17 +2701,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); |
@@ -2706,7 +2708,7 @@ int WebRtcVoiceMediaChannel::GetOutputLevel(int channel) { |
} |
int WebRtcVoiceMediaChannel::GetReceiveChannelId(uint32_t ssrc) const { |
- RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
const auto it = receive_channels_.find(ssrc); |
if (it != receive_channels_.end()) { |
return it->second->channel(); |
@@ -2715,7 +2717,7 @@ int WebRtcVoiceMediaChannel::GetReceiveChannelId(uint32_t ssrc) const { |
} |
int WebRtcVoiceMediaChannel::GetSendChannelId(uint32_t ssrc) const { |
- RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
const auto it = send_streams_.find(ssrc); |
if (it != send_streams_.end()) { |
return it->second->channel(); |
@@ -2781,39 +2783,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; |
@@ -2832,7 +2801,7 @@ bool WebRtcVoiceMediaChannel::SetHeaderExtension(ExtensionSetterFunction setter, |
} |
void WebRtcVoiceMediaChannel::RecreateAudioReceiveStreams() { |
- RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
for (const auto& it : receive_channels_) { |
RemoveAudioReceiveStream(it.first); |
} |
@@ -2842,7 +2811,7 @@ void WebRtcVoiceMediaChannel::RecreateAudioReceiveStreams() { |
} |
void WebRtcVoiceMediaChannel::AddAudioReceiveStream(uint32_t ssrc) { |
- RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
WebRtcAudioReceiveStream* stream = receive_channels_[ssrc]; |
RTC_DCHECK(stream != nullptr); |
RTC_DCHECK(receive_streams_.find(ssrc) == receive_streams_.end()); |
@@ -2859,7 +2828,7 @@ void WebRtcVoiceMediaChannel::AddAudioReceiveStream(uint32_t ssrc) { |
} |
void WebRtcVoiceMediaChannel::RemoveAudioReceiveStream(uint32_t ssrc) { |
- RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
auto stream_it = receive_streams_.find(ssrc); |
if (stream_it != receive_streams_.end()) { |
call_->DestroyAudioReceiveStream(stream_it->second); |
@@ -2869,7 +2838,7 @@ void WebRtcVoiceMediaChannel::RemoveAudioReceiveStream(uint32_t ssrc) { |
bool WebRtcVoiceMediaChannel::SetRecvCodecsInternal( |
const std::vector<AudioCodec>& new_codecs) { |
- RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
for (const AudioCodec& codec : new_codecs) { |
webrtc::CodecInst voe_codec; |
if (engine()->FindWebRtcCodec(codec, &voe_codec)) { |