Removed calls to VoE::SetPlayout() from WebRTCVoiceEngine.
This is part of rewriting the ConferenceMixer and OutputMixer.
Calls are instead routed through AudioReceiveStream::Start/Stop.
NOTRY=True
Review-Url: https://codereview.webrtc.org/2206223002
Cr-Commit-Position: refs/heads/master@{#13636}
diff --git a/webrtc/audio/audio_receive_stream.cc b/webrtc/audio/audio_receive_stream.cc
index 0a2bc2b..ca2c08b 100644
--- a/webrtc/audio/audio_receive_stream.cc
+++ b/webrtc/audio/audio_receive_stream.cc
@@ -154,10 +154,17 @@
void AudioReceiveStream::Start() {
RTC_DCHECK(thread_checker_.CalledOnValidThread());
+ ScopedVoEInterface<VoEBase> base(voice_engine());
+ int error = base->StartPlayout(config_.voe_channel_id);
+ if (error != 0) {
+ LOG(LS_ERROR) << "AudioReceiveStream::Start failed with error: " << error;
+ }
}
void AudioReceiveStream::Stop() {
RTC_DCHECK(thread_checker_.CalledOnValidThread());
+ ScopedVoEInterface<VoEBase> base(voice_engine());
+ base->StopPlayout(config_.voe_channel_id);
}
webrtc::AudioReceiveStream::Stats AudioReceiveStream::GetStats() const {
diff --git a/webrtc/media/base/fakemediaengine.h b/webrtc/media/base/fakemediaengine.h
index a86dcbd..dfc7a1c 100644
--- a/webrtc/media/base/fakemediaengine.h
+++ b/webrtc/media/base/fakemediaengine.h
@@ -319,10 +319,7 @@
SetRecvRtpHeaderExtensions(params.extensions));
}
- virtual bool SetPlayout(bool playout) {
- set_playout(playout);
- return true;
- }
+ virtual void SetPlayout(bool playout) { set_playout(playout); }
virtual void SetSend(bool send) { set_sending(send); }
virtual bool SetAudioSend(uint32_t ssrc,
bool enable,
diff --git a/webrtc/media/base/mediachannel.h b/webrtc/media/base/mediachannel.h
index 5a4124a..1355b36 100644
--- a/webrtc/media/base/mediachannel.h
+++ b/webrtc/media/base/mediachannel.h
@@ -908,7 +908,7 @@
uint32_t ssrc,
const webrtc::RtpParameters& parameters) = 0;
// Starts or stops playout of received audio.
- virtual bool SetPlayout(bool playout) = 0;
+ virtual void SetPlayout(bool playout) = 0;
// Starts or stops sending (and potentially capture) of local audio.
virtual void SetSend(bool send) = 0;
// Configure stream for sending.
diff --git a/webrtc/media/engine/fakewebrtccall.h b/webrtc/media/engine/fakewebrtccall.h
index a2ac079..8581d82 100644
--- a/webrtc/media/engine/fakewebrtccall.h
+++ b/webrtc/media/engine/fakewebrtccall.h
@@ -79,11 +79,12 @@
bool DeliverRtp(const uint8_t* packet,
size_t length,
const webrtc::PacketTime& packet_time);
+ bool started() const { return started_; }
private:
// webrtc::AudioReceiveStream implementation.
- void Start() override {}
- void Stop() override {}
+ void Start() override { started_ = true; }
+ void Stop() override { started_ = false; }
webrtc::AudioReceiveStream::Stats GetStats() const override;
void SetSink(std::unique_ptr<webrtc::AudioSinkInterface> sink) override;
@@ -95,6 +96,7 @@
std::unique_ptr<webrtc::AudioSinkInterface> sink_;
float gain_ = 1.0f;
rtc::Buffer last_packet_;
+ bool started_ = false;
};
class FakeVideoSendStream final : public webrtc::VideoSendStream,
diff --git a/webrtc/media/engine/fakewebrtcvoiceengine.h b/webrtc/media/engine/fakewebrtcvoiceengine.h
index e745f13..c8fb9cf 100644
--- a/webrtc/media/engine/fakewebrtcvoiceengine.h
+++ b/webrtc/media/engine/fakewebrtcvoiceengine.h
@@ -128,7 +128,6 @@
Channel() {
memset(&send_codec, 0, sizeof(send_codec));
}
- bool playout = false;
bool vad = false;
bool codec_fec = false;
int max_encoding_bandwidth = 0;
@@ -154,9 +153,6 @@
bool IsInited() const { return inited_; }
int GetLastChannel() const { return last_channel_; }
int GetNumChannels() const { return static_cast<int>(channels_.size()); }
- bool GetPlayout(int channel) {
- return channels_[channel]->playout;
- }
bool GetVAD(int channel) {
return channels_[channel]->vad;
}
@@ -174,9 +170,6 @@
channels_[channel]->cn16_type :
channels_[channel]->cn8_type;
}
- void set_playout_fail_channel(int channel) {
- playout_fail_channel_ = channel;
- }
void set_fail_create_channel(bool fail_create_channel) {
fail_create_channel_ = fail_create_channel;
}
@@ -245,24 +238,10 @@
return 0;
}
WEBRTC_STUB(StartReceive, (int channel));
- WEBRTC_FUNC(StartPlayout, (int channel)) {
- if (playout_fail_channel_ != channel) {
- WEBRTC_CHECK_CHANNEL(channel);
- channels_[channel]->playout = true;
- return 0;
- } else {
- // When playout_fail_channel_ == channel, fail the StartPlayout on this
- // channel.
- return -1;
- }
- }
+ WEBRTC_STUB(StartPlayout, (int channel));
WEBRTC_STUB(StartSend, (int channel));
WEBRTC_STUB(StopReceive, (int channel));
- WEBRTC_FUNC(StopPlayout, (int channel)) {
- WEBRTC_CHECK_CHANNEL(channel);
- channels_[channel]->playout = false;
- return 0;
- }
+ WEBRTC_STUB(StopPlayout, (int channel));
WEBRTC_STUB(StopSend, (int channel));
WEBRTC_STUB(GetVersion, (char version[1024]));
WEBRTC_STUB(LastError, ());
@@ -300,8 +279,6 @@
const webrtc::CodecInst& codec)) {
WEBRTC_CHECK_CHANNEL(channel);
Channel* ch = channels_[channel];
- if (ch->playout)
- return -1; // Channel is in use.
// Check if something else already has this slot.
if (codec.pltype != -1) {
for (std::vector<webrtc::CodecInst>::iterator it =
@@ -583,7 +560,6 @@
webrtc::NsModes ns_mode_ = webrtc::kNsDefault;
webrtc::AgcModes agc_mode_ = webrtc::kAgcDefault;
webrtc::AgcConfig agc_config_;
- int playout_fail_channel_ = -1;
FakeAudioProcessing audio_processing_;
};
diff --git a/webrtc/media/engine/webrtcvoiceengine.cc b/webrtc/media/engine/webrtcvoiceengine.cc
index 2aa0552..be1888e 100644
--- a/webrtc/media/engine/webrtcvoiceengine.cc
+++ b/webrtc/media/engine/webrtcvoiceengine.cc
@@ -1363,6 +1363,18 @@
stream_->SetGain(volume);
}
+ void SetPlayout(bool playout) {
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
+ RTC_DCHECK(stream_);
+ if (playout) {
+ LOG(LS_INFO) << "Starting playout for channel #" << channel();
+ stream_->Start();
+ } else {
+ LOG(LS_INFO) << "Stopping playout for channel #" << channel();
+ stream_->Stop();
+ }
+ }
+
private:
void RecreateAudioReceiveStream(
uint32_t local_ssrc,
@@ -1642,7 +1654,7 @@
if (playout_) {
// Receive codecs can not be changed while playing. So we temporarily
// pause playout.
- PausePlayout();
+ ChangePlayout(false);
}
bool result = true;
@@ -1670,7 +1682,7 @@
}
if (desired_playout_ && !playout_) {
- ResumePlayout();
+ ChangePlayout(desired_playout_);
}
return result;
}
@@ -1925,35 +1937,22 @@
return true;
}
-bool WebRtcVoiceMediaChannel::SetPlayout(bool playout) {
+void WebRtcVoiceMediaChannel::SetPlayout(bool playout) {
desired_playout_ = playout;
return ChangePlayout(desired_playout_);
}
-bool WebRtcVoiceMediaChannel::PausePlayout() {
- return ChangePlayout(false);
-}
-
-bool WebRtcVoiceMediaChannel::ResumePlayout() {
- return ChangePlayout(desired_playout_);
-}
-
-bool WebRtcVoiceMediaChannel::ChangePlayout(bool playout) {
+void WebRtcVoiceMediaChannel::ChangePlayout(bool playout) {
TRACE_EVENT0("webrtc", "WebRtcVoiceMediaChannel::ChangePlayout");
RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
if (playout_ == playout) {
- return true;
+ return;
}
- for (const auto& ch : recv_streams_) {
- if (!SetPlayout(ch.second->channel(), playout)) {
- LOG(LS_ERROR) << "SetPlayout " << playout << " on channel "
- << ch.second->channel() << " failed";
- return false;
- }
+ for (const auto& kv : recv_streams_) {
+ kv.second->SetPlayout(playout);
}
playout_ = playout;
- return true;
}
void WebRtcVoiceMediaChannel::SetSend(bool send) {
@@ -2180,7 +2179,7 @@
sp.sync_label, recv_rtp_extensions_,
call_, this,
engine()->decoder_factory_)));
- SetPlayout(channel, playout_);
+ recv_streams_[ssrc]->SetPlayout(playout_);
return true;
}
@@ -2614,20 +2613,6 @@
}
return -1;
}
-
-bool WebRtcVoiceMediaChannel::SetPlayout(int channel, bool playout) {
- if (playout) {
- LOG(LS_INFO) << "Starting playout for channel #" << channel;
- if (engine()->voe()->base()->StartPlayout(channel) == -1) {
- LOG_RTCERR1(StartPlayout, channel);
- return false;
- }
- } else {
- LOG(LS_INFO) << "Stopping playout for channel #" << channel;
- engine()->voe()->base()->StopPlayout(channel);
- }
- return true;
-}
} // namespace cricket
#endif // HAVE_WEBRTC_VOICE
diff --git a/webrtc/media/engine/webrtcvoiceengine.h b/webrtc/media/engine/webrtcvoiceengine.h
index 64e0f5b..ec7eb95 100644
--- a/webrtc/media/engine/webrtcvoiceengine.h
+++ b/webrtc/media/engine/webrtcvoiceengine.h
@@ -177,9 +177,7 @@
uint32_t ssrc,
const webrtc::RtpParameters& parameters) override;
- bool SetPlayout(bool playout) override;
- bool PausePlayout();
- bool ResumePlayout();
+ void SetPlayout(bool playout) override;
void SetSend(bool send) override;
bool SetAudioSend(uint32_t ssrc,
bool enable,
@@ -245,8 +243,7 @@
WebRtcVoiceEngine* engine() { return engine_; }
int GetLastEngineError() { return engine()->GetLastEngineError(); }
int GetOutputLevel(int channel);
- bool SetPlayout(int channel, bool playout);
- bool ChangePlayout(bool playout);
+ void ChangePlayout(bool playout);
int CreateVoEChannel();
bool DeleteVoEChannel(int channel);
bool IsDefaultRecvStream(uint32_t ssrc) {
diff --git a/webrtc/media/engine/webrtcvoiceengine_unittest.cc b/webrtc/media/engine/webrtcvoiceengine_unittest.cc
index 2db70d1..f7cd071 100644
--- a/webrtc/media/engine/webrtcvoiceengine_unittest.cc
+++ b/webrtc/media/engine/webrtcvoiceengine_unittest.cc
@@ -753,14 +753,13 @@
parameters.codecs.push_back(kIsacCodec);
parameters.codecs.push_back(kCn16000Codec);
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
- EXPECT_TRUE(channel_->SetPlayout(true));
+ channel_->SetPlayout(true);
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
// Changing the payload type of a codec should fail.
parameters.codecs[0].id = 127;
EXPECT_FALSE(channel_->SetRecvParameters(parameters));
- int channel_num = voe_.GetLastChannel();
- EXPECT_TRUE(voe_.GetPlayout(channel_num));
+ EXPECT_TRUE(GetRecvStream(kSsrc1).started());
}
// Test that we can add a codec while playing.
@@ -770,12 +769,11 @@
parameters.codecs.push_back(kIsacCodec);
parameters.codecs.push_back(kCn16000Codec);
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
- EXPECT_TRUE(channel_->SetPlayout(true));
+ channel_->SetPlayout(true);
parameters.codecs.push_back(kOpusCodec);
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
- int channel_num = voe_.GetLastChannel();
- EXPECT_TRUE(voe_.GetPlayout(channel_num));
+ EXPECT_TRUE(GetRecvStream(kSsrc1).started());
webrtc::CodecInst gcodec;
EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
@@ -2173,12 +2171,11 @@
// Test that we can create a channel and start playing out on it.
TEST_F(WebRtcVoiceEngineTestFake, Playout) {
EXPECT_TRUE(SetupRecvStream());
- int channel_num = voe_.GetLastChannel();
EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
- EXPECT_TRUE(channel_->SetPlayout(true));
- EXPECT_TRUE(voe_.GetPlayout(channel_num));
- EXPECT_TRUE(channel_->SetPlayout(false));
- EXPECT_FALSE(voe_.GetPlayout(channel_num));
+ channel_->SetPlayout(true);
+ EXPECT_TRUE(GetRecvStream(kSsrc1).started());
+ channel_->SetPlayout(false);
+ EXPECT_FALSE(GetRecvStream(kSsrc1).started());
}
// Test that we can add and remove send streams.
@@ -2332,50 +2329,41 @@
// We can receive on multiple streams while sending one stream.
TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
EXPECT_TRUE(SetupSendStream());
- int channel_num1 = voe_.GetLastChannel();
// Start playout without a receive stream.
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
- EXPECT_TRUE(channel_->SetPlayout(true));
- EXPECT_FALSE(voe_.GetPlayout(channel_num1));
+ channel_->SetPlayout(true);
// Adding another stream should enable playout on the new stream only.
EXPECT_TRUE(AddRecvStream(kSsrc2));
- int channel_num2 = voe_.GetLastChannel();
SetSend(channel_, true);
EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
// Make sure only the new stream is played out.
- EXPECT_FALSE(voe_.GetPlayout(channel_num1));
- EXPECT_TRUE(voe_.GetPlayout(channel_num2));
+ EXPECT_TRUE(GetRecvStream(kSsrc2).started());
// Adding yet another stream should have stream 2 and 3 enabled for playout.
EXPECT_TRUE(AddRecvStream(kSsrc3));
- int channel_num3 = voe_.GetLastChannel();
- EXPECT_FALSE(voe_.GetPlayout(channel_num1));
- EXPECT_TRUE(voe_.GetPlayout(channel_num2));
- EXPECT_TRUE(voe_.GetPlayout(channel_num3));
+ EXPECT_TRUE(GetRecvStream(kSsrc2).started());
+ EXPECT_TRUE(GetRecvStream(kSsrc3).started());
// Stop sending.
SetSend(channel_, false);
EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
// Stop playout.
- EXPECT_TRUE(channel_->SetPlayout(false));
- EXPECT_FALSE(voe_.GetPlayout(channel_num1));
- EXPECT_FALSE(voe_.GetPlayout(channel_num2));
- EXPECT_FALSE(voe_.GetPlayout(channel_num3));
+ channel_->SetPlayout(false);
+ EXPECT_FALSE(GetRecvStream(kSsrc2).started());
+ EXPECT_FALSE(GetRecvStream(kSsrc3).started());
- // Restart playout and make sure only recv streams are played out.
- EXPECT_TRUE(channel_->SetPlayout(true));
- EXPECT_FALSE(voe_.GetPlayout(channel_num1));
- EXPECT_TRUE(voe_.GetPlayout(channel_num2));
- EXPECT_TRUE(voe_.GetPlayout(channel_num3));
+ // Restart playout and make sure recv streams are played out.
+ channel_->SetPlayout(true);
+ EXPECT_TRUE(GetRecvStream(kSsrc2).started());
+ EXPECT_TRUE(GetRecvStream(kSsrc3).started());
- // Now remove the recv streams and verify that the send stream doesn't play.
+ // Now remove the recv streams.
EXPECT_TRUE(channel_->RemoveRecvStream(3));
EXPECT_TRUE(channel_->RemoveRecvStream(2));
- EXPECT_FALSE(voe_.GetPlayout(channel_num1));
}
// Test that we can create a channel configured for Codian bridges,
@@ -2741,18 +2729,6 @@
TestInsertDtmf(kSsrc1, false);
}
-TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
- EXPECT_TRUE(SetupSendStream());
- EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
- SetSend(channel_, true);
- EXPECT_TRUE(AddRecvStream(2));
- EXPECT_TRUE(AddRecvStream(3));
- EXPECT_TRUE(channel_->SetPlayout(true));
- voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
- EXPECT_TRUE(channel_->SetPlayout(false));
- EXPECT_FALSE(channel_->SetPlayout(true));
-}
-
TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
EXPECT_TRUE(SetupSendStream());
EXPECT_CALL(adm_,