Index: webrtc/media/engine/webrtcvoiceengine.cc |
diff --git a/webrtc/media/engine/webrtcvoiceengine.cc b/webrtc/media/engine/webrtcvoiceengine.cc |
index 4116f42568b3201254cef20d511d8925acf52580..e78e5e04cf5234d7657e200c4b587d2970c08e98 100644 |
--- a/webrtc/media/engine/webrtcvoiceengine.cc |
+++ b/webrtc/media/engine/webrtcvoiceengine.cc |
@@ -33,7 +33,7 @@ |
#include "webrtc/call/rtc_event_log.h" |
#include "webrtc/common.h" |
#include "webrtc/media/base/audioframe.h" |
-#include "webrtc/media/base/audiorenderer.h" |
+#include "webrtc/media/base/audiosource.h" |
#include "webrtc/media/base/mediaconstants.h" |
#include "webrtc/media/base/streamparams.h" |
#include "webrtc/media/engine/webrtcmediaengine.h" |
@@ -1138,7 +1138,7 @@ int WebRtcVoiceEngine::CreateVoEChannel() { |
} |
class WebRtcVoiceMediaChannel::WebRtcAudioSendStream |
- : public AudioRenderer::Sink { |
+ : public AudioSource::Sink { |
public: |
WebRtcAudioSendStream(int ch, webrtc::AudioTransport* voe_audio_transport, |
uint32_t ssrc, const std::string& c_name, |
@@ -1160,7 +1160,7 @@ class WebRtcVoiceMediaChannel::WebRtcAudioSendStream |
~WebRtcAudioSendStream() override { |
RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
- Stop(); |
+ ClearSource(); |
call_->DestroyAudioSendStream(stream_); |
} |
@@ -1184,39 +1184,47 @@ class WebRtcVoiceMediaChannel::WebRtcAudioSendStream |
return stream_->SendTelephoneEvent(payload_type, event, duration_ms); |
} |
+ void SetSend(bool send) { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
+ send_ = send; |
+ UpdateSendState(); |
+ } |
+ |
webrtc::AudioSendStream::Stats GetStats() const { |
RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
RTC_DCHECK(stream_); |
return stream_->GetStats(); |
} |
- // Starts the rendering by setting a sink to the renderer to get data |
- // callback. |
+ // Starts the sending by setting ourselves as a sink to the AudioSource to |
+ // get data callbacks. |
// This method is called on the libjingle worker thread. |
// TODO(xians): Make sure Start() is called only once. |
- void Start(AudioRenderer* renderer) { |
+ void SetSource(AudioSource* source) { |
RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
- RTC_DCHECK(renderer); |
- if (renderer_) { |
- RTC_DCHECK(renderer_ == renderer); |
+ RTC_DCHECK(source); |
+ if (source_) { |
+ RTC_DCHECK(source_ == source); |
return; |
} |
- renderer->SetSink(this); |
- renderer_ = renderer; |
+ source->SetSink(this); |
+ source_ = source; |
+ UpdateSendState(); |
} |
- // Stops rendering by setting the sink of the renderer to nullptr. No data |
+ // Stops sending by setting the sink of the AudioSource to nullptr. No data |
// callback will be received after this method. |
// This method is called on the libjingle worker thread. |
- void Stop() { |
+ void ClearSource() { |
RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
- if (renderer_) { |
- renderer_->SetSink(nullptr); |
- renderer_ = nullptr; |
+ if (source_) { |
+ source_->SetSink(nullptr); |
+ source_ = nullptr; |
} |
+ UpdateSendState(); |
} |
- // AudioRenderer::Sink implementation. |
+ // AudioSource::Sink implementation. |
// This method is called on the audio thread. |
void OnData(const void* audio_data, |
int bits_per_sample, |
@@ -1234,13 +1242,14 @@ class WebRtcVoiceMediaChannel::WebRtcAudioSendStream |
number_of_frames); |
} |
- // Callback from the |renderer_| when it is going away. In case Start() has |
+ // Callback from the |source_| when it is going away. In case Start() has |
// never been called, this callback won't be triggered. |
void OnClose() override { |
RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
- // Set |renderer_| to nullptr to make sure no more callback will get into |
- // the renderer. |
- renderer_ = nullptr; |
+ // Set |source_| to nullptr to make sure no more callback will get into |
+ // the source. |
+ source_ = nullptr; |
+ UpdateSendState(); |
} |
// Accessor to the VoE channel ID. |
@@ -1250,6 +1259,16 @@ class WebRtcVoiceMediaChannel::WebRtcAudioSendStream |
} |
private: |
+ void UpdateSendState() { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(stream_); |
+ if (send_ && source_ != nullptr) { |
+ stream_->Start(); |
+ } else { // !send || source_ = nullptr |
+ stream_->Stop(); |
+ } |
+ } |
+ |
rtc::ThreadChecker worker_thread_checker_; |
rtc::ThreadChecker audio_capture_thread_checker_; |
webrtc::AudioTransport* const voe_audio_transport_ = nullptr; |
@@ -1259,10 +1278,11 @@ class WebRtcVoiceMediaChannel::WebRtcAudioSendStream |
// configuration changes. |
webrtc::AudioSendStream* stream_ = nullptr; |
- // Raw pointer to AudioRenderer owned by LocalAudioTrackHandler. |
+ // Raw pointer to AudioSource owned by LocalAudioTrackHandler. |
// PeerConnection will make sure invalidating the pointer before the object |
// goes away. |
- AudioRenderer* renderer_ = nullptr; |
+ AudioSource* source_ = nullptr; |
+ bool send_ = false; |
RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(WebRtcAudioSendStream); |
}; |
@@ -1827,68 +1847,32 @@ bool WebRtcVoiceMediaChannel::ChangePlayout(bool playout) { |
return true; |
} |
-bool WebRtcVoiceMediaChannel::SetSend(SendFlags send) { |
- desired_send_ = send; |
- if (!send_streams_.empty()) { |
- return ChangeSend(desired_send_); |
- } |
- return true; |
-} |
- |
-bool WebRtcVoiceMediaChannel::PauseSend() { |
- return ChangeSend(SEND_NOTHING); |
-} |
- |
-bool WebRtcVoiceMediaChannel::ResumeSend() { |
- return ChangeSend(desired_send_); |
-} |
- |
-bool WebRtcVoiceMediaChannel::ChangeSend(SendFlags send) { |
+void WebRtcVoiceMediaChannel::SetSend(bool send) { |
if (send_ == send) { |
- return true; |
+ return; |
} |
// Apply channel specific options when channel is enabled for sending. |
- if (send == SEND_MICROPHONE) { |
+ if (send) { |
engine()->ApplyOptions(options_); |
} |
// Change the settings on each send channel. |
- for (const auto& ch : send_streams_) { |
- if (!ChangeSend(ch.second->channel(), send)) { |
- return false; |
- } |
+ for (auto& kv : send_streams_) { |
+ kv.second->SetSend(send); |
} |
send_ = send; |
- return true; |
-} |
- |
-bool WebRtcVoiceMediaChannel::ChangeSend(int channel, SendFlags send) { |
- if (send == SEND_MICROPHONE) { |
- if (engine()->voe()->base()->StartSend(channel) == -1) { |
- LOG_RTCERR1(StartSend, channel); |
- return false; |
- } |
- } else { // SEND_NOTHING |
- RTC_DCHECK(send == SEND_NOTHING); |
- if (engine()->voe()->base()->StopSend(channel) == -1) { |
- LOG_RTCERR1(StopSend, channel); |
- return false; |
- } |
- } |
- |
- return true; |
} |
bool WebRtcVoiceMediaChannel::SetAudioSend(uint32_t ssrc, |
bool enable, |
const AudioOptions* options, |
- AudioRenderer* renderer) { |
+ AudioSource* source) { |
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)) { |
+ if (!SetLocalSource(ssrc, source)) { |
return false; |
} |
if (!MuteStream(ssrc, !enable)) { |
@@ -1975,7 +1959,8 @@ bool WebRtcVoiceMediaChannel::AddSendStream(const StreamParams& sp) { |
} |
} |
- return ChangeSend(channel, desired_send_); |
+ send_streams_[ssrc]->SetSend(send_); |
+ return true; |
} |
bool WebRtcVoiceMediaChannel::RemoveSendStream(uint32_t ssrc) { |
@@ -1989,10 +1974,10 @@ bool WebRtcVoiceMediaChannel::RemoveSendStream(uint32_t ssrc) { |
return false; |
} |
- int channel = it->second->channel(); |
- ChangeSend(channel, SEND_NOTHING); |
+ it->second->SetSend(false); |
// Clean up and delete the send stream+channel. |
+ int channel = it->second->channel(); |
LOG(LS_INFO) << "Removing audio send stream " << ssrc |
<< " with VoiceEngine channel #" << channel << "."; |
delete it->second; |
@@ -2001,7 +1986,7 @@ bool WebRtcVoiceMediaChannel::RemoveSendStream(uint32_t ssrc) { |
return false; |
} |
if (send_streams_.empty()) { |
- ChangeSend(SEND_NOTHING); |
+ SetSend(false); |
} |
return true; |
} |
@@ -2110,13 +2095,13 @@ bool WebRtcVoiceMediaChannel::RemoveRecvStream(uint32_t ssrc) { |
return DeleteVoEChannel(channel); |
} |
-bool WebRtcVoiceMediaChannel::SetLocalRenderer(uint32_t ssrc, |
- AudioRenderer* renderer) { |
+bool WebRtcVoiceMediaChannel::SetLocalSource(uint32_t ssrc, |
+ AudioSource* source) { |
auto it = send_streams_.find(ssrc); |
if (it == send_streams_.end()) { |
- if (renderer) { |
- // Return an error if trying to set a valid renderer with an invalid ssrc. |
- LOG(LS_ERROR) << "SetLocalRenderer failed with ssrc "<< ssrc; |
+ if (source) { |
+ // Return an error if trying to set a valid source with an invalid ssrc. |
+ LOG(LS_ERROR) << "SetLocalSource failed with ssrc " << ssrc; |
return false; |
} |
@@ -2124,10 +2109,10 @@ bool WebRtcVoiceMediaChannel::SetLocalRenderer(uint32_t ssrc, |
return true; |
} |
- if (renderer) { |
- it->second->Start(renderer); |
+ if (source) { |
+ it->second->SetSource(source); |
} else { |
- it->second->Stop(); |
+ it->second->ClearSource(); |
} |
return true; |
@@ -2445,8 +2430,7 @@ 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 = |
- (send_ == SEND_NOTHING ? false : stats.typing_noise_detected); |
+ sinfo.typing_noise_detected = (send_ ? stats.typing_noise_detected : false); |
info->senders.push_back(sinfo); |
} |