Remove the default send channel in WVoE.

BUG=webrtc:4690

Review URL: https://codereview.webrtc.org/1364643003

Cr-Commit-Position: refs/heads/master@{#10344}
This commit is contained in:
solenberg 2015-10-20 15:49:38 -07:00 committed by Commit bot
parent 3bf69b15f4
commit 0a617e22a4
3 changed files with 132 additions and 229 deletions

View File

@ -598,13 +598,7 @@ void WebRtcVoiceEngine::Terminate() {
VoiceMediaChannel* WebRtcVoiceEngine::CreateChannel(webrtc::Call* call,
const AudioOptions& options) {
WebRtcVoiceMediaChannel* ch =
new WebRtcVoiceMediaChannel(this, options, call);
if (!ch->valid()) {
delete ch;
return nullptr;
}
return ch;
return new WebRtcVoiceMediaChannel(this, options, call);
}
bool WebRtcVoiceEngine::SetOptions(const AudioOptions& options) {
@ -1315,12 +1309,8 @@ void WebRtcVoiceEngine::StopRtcEventLog() {
voe_wrapper_->codec()->GetEventLog()->StopLogging();
}
int WebRtcVoiceEngine::CreateVoiceChannel(VoEWrapper* voice_engine_wrapper) {
return voice_engine_wrapper->base()->CreateChannel(voe_config_);
}
int WebRtcVoiceEngine::CreateMediaVoiceChannel() {
return CreateVoiceChannel(voe_wrapper_.get());
int WebRtcVoiceEngine::CreateVoEChannel() {
return voe_wrapper_->base()->CreateChannel(voe_config_);
}
class WebRtcVoiceMediaChannel::WebRtcVoiceChannelRenderer
@ -1404,7 +1394,6 @@ WebRtcVoiceMediaChannel::WebRtcVoiceMediaChannel(WebRtcVoiceEngine* engine,
const AudioOptions& options,
webrtc::Call* call)
: engine_(engine),
default_send_channel_id_(engine->CreateMediaVoiceChannel()),
send_bitrate_setting_(false),
send_bitrate_bps_(0),
options_(),
@ -1417,36 +1406,29 @@ WebRtcVoiceMediaChannel::WebRtcVoiceMediaChannel(WebRtcVoiceEngine* engine,
send_(SEND_NOTHING),
call_(call) {
RTC_DCHECK(thread_checker_.CalledOnValidThread());
engine->RegisterChannel(this);
LOG(LS_VERBOSE) << "WebRtcVoiceMediaChannel::WebRtcVoiceMediaChannel "
<< default_send_channel_id();
LOG(LS_VERBOSE) << "WebRtcVoiceMediaChannel::WebRtcVoiceMediaChannel";
RTC_DCHECK(nullptr != call);
ConfigureSendChannel(default_send_channel_id());
engine->RegisterChannel(this);
SetOptions(options);
}
WebRtcVoiceMediaChannel::~WebRtcVoiceMediaChannel() {
RTC_DCHECK(thread_checker_.CalledOnValidThread());
LOG(LS_VERBOSE) << "WebRtcVoiceMediaChannel::~WebRtcVoiceMediaChannel "
<< default_send_channel_id();
LOG(LS_VERBOSE) << "WebRtcVoiceMediaChannel::~WebRtcVoiceMediaChannel";
// Remove any remaining send streams, the default channel will be deleted
// later.
// Remove any remaining send streams.
while (!send_channels_.empty()) {
RemoveSendStream(send_channels_.begin()->first);
}
// Unregister ourselves from the engine.
engine()->UnregisterChannel(this);
// Remove any remaining streams.
// Remove any remaining receive streams.
while (!receive_channels_.empty()) {
RemoveRecvStream(receive_channels_.begin()->first);
}
RTC_DCHECK(receive_streams_.empty());
// Delete the default channel.
DeleteChannel(default_send_channel_id());
// Unregister ourselves from the engine.
engine()->UnregisterChannel(this);
}
bool WebRtcVoiceMediaChannel::SetSendParameters(
@ -1785,15 +1767,11 @@ bool WebRtcVoiceMediaChannel::SetSendCodecs(
}
// Set nack status on receive channels and update |nack_enabled_|.
SetNack(receive_channels_, nack_enabled_);
return true;
}
void WebRtcVoiceMediaChannel::SetNack(const ChannelMap& channels,
bool nack_enabled) {
for (const auto& ch : channels) {
SetNack(ch.second->channel(), nack_enabled);
for (const auto& ch : receive_channels_) {
SetNack(ch.second->channel(), nack_enabled_);
}
return true;
}
void WebRtcVoiceMediaChannel::SetNack(int channel, bool nack_enabled) {
@ -1806,18 +1784,6 @@ void WebRtcVoiceMediaChannel::SetNack(int channel, bool nack_enabled) {
}
}
bool WebRtcVoiceMediaChannel::SetSendCodec(
const webrtc::CodecInst& send_codec) {
LOG(LS_INFO) << "Selected voice codec " << ToString(send_codec)
<< ", bitrate=" << send_codec.rate;
for (const auto& ch : send_channels_) {
if (!SetSendCodec(ch.second->channel(), send_codec))
return false;
}
return true;
}
bool WebRtcVoiceMediaChannel::SetSendCodec(
int channel, const webrtc::CodecInst& send_codec) {
LOG(LS_INFO) << "Send channel " << channel << " selected voice codec "
@ -1905,15 +1871,6 @@ bool WebRtcVoiceMediaChannel::SetSendRtpHeaderExtensions(
return true;
}
// The default channel may or may not be in |send_channels_|. Set the rtp
// header extensions for default channel regardless.
if (!SetChannelSendRtpHeaderExtensions(default_send_channel_id(),
extensions)) {
return false;
}
// Loop through all send channels and enable/disable the extensions.
for (const auto& ch : send_channels_) {
if (!SetChannelSendRtpHeaderExtensions(ch.second->channel(), extensions)) {
return false;
@ -2055,61 +2012,67 @@ bool WebRtcVoiceMediaChannel::SetAudioSend(uint32_t ssrc,
return true;
}
// TODO(ronghuawu): Change this method to return bool.
void WebRtcVoiceMediaChannel::ConfigureSendChannel(int channel) {
if (engine()->voe()->network()->RegisterExternalTransport(
channel, *this) == -1) {
LOG_RTCERR2(RegisterExternalTransport, channel, this);
int WebRtcVoiceMediaChannel::CreateVoEChannel() {
int id = engine()->CreateVoEChannel();
if (id == -1) {
LOG_RTCERR0(CreateVoEChannel);
return -1;
}
// Enable RTCP (for quality stats and feedback messages)
EnableRtcp(channel);
// Set RTP header extension for the new channel.
SetChannelSendRtpHeaderExtensions(channel, send_extensions_);
if (engine()->voe()->network()->RegisterExternalTransport(id, *this) == -1) {
LOG_RTCERR2(RegisterExternalTransport, id, this);
engine()->voe()->base()->DeleteChannel(id);
return -1;
}
return id;
}
bool WebRtcVoiceMediaChannel::DeleteChannel(int channel) {
if (engine()->voe()->network()->DeRegisterExternalTransport(channel) == -1) {
LOG_RTCERR1(DeRegisterExternalTransport, channel);
}
if (engine()->voe()->base()->DeleteChannel(channel) == -1) {
LOG_RTCERR1(DeleteChannel, channel);
return false;
}
return true;
}
bool WebRtcVoiceMediaChannel::AddSendStream(const StreamParams& sp) {
RTC_DCHECK(thread_checker_.CalledOnValidThread());
// If the default channel is already used for sending create a new channel
// otherwise use the default channel for sending.
int channel = GetSendChannelId(sp.first_ssrc());
if (channel != -1) {
LOG(LS_ERROR) << "Stream already exists with ssrc " << sp.first_ssrc();
LOG(LS_INFO) << "AddSendStream: " << sp.ToString();
uint32_t ssrc = sp.first_ssrc();
RTC_DCHECK(0 != ssrc);
if (GetSendChannelId(ssrc) != -1) {
LOG(LS_ERROR) << "Stream already exists with ssrc " << ssrc;
return false;
}
bool default_channel_is_available = true;
for (const auto& ch : send_channels_) {
if (IsDefaultChannel(ch.second->channel())) {
default_channel_is_available = false;
break;
}
// Create a new channel for sending audio data.
int channel = CreateVoEChannel();
if (channel == -1) {
return false;
}
if (default_channel_is_available) {
channel = default_send_channel_id();
} else {
// Create a new channel for sending audio data.
channel = engine()->CreateMediaVoiceChannel();
if (channel == -1) {
LOG_RTCERR0(CreateChannel);
return false;
}
ConfigureSendChannel(channel);
// Enable RTCP (for quality stats and feedback messages).
if (engine()->voe()->rtp()->SetRTCPStatus(channel, true) == -1) {
LOG_RTCERR2(SetRTCPStatus, channel, 1);
}
SetChannelSendRtpHeaderExtensions(channel, send_extensions_);
// Set the local (send) SSRC.
if (engine()->voe()->rtp()->SetLocalSSRC(channel, ssrc) == -1) {
LOG_RTCERR2(SetLocalSSRC, channel, ssrc);
DeleteChannel(channel);
return false;
}
if (engine()->voe()->rtp()->SetRTCP_CNAME(channel, sp.cname.c_str()) == -1) {
LOG_RTCERR2(SetRTCP_CNAME, channel, sp.cname);
DeleteChannel(channel);
return false;
}
// Save the channel to send_channels_, so that RemoveSendStream() can still
@ -2117,45 +2080,39 @@ bool WebRtcVoiceMediaChannel::AddSendStream(const StreamParams& sp) {
webrtc::AudioTransport* audio_transport =
engine()->voe()->base()->audio_transport();
send_channels_.insert(
std::make_pair(sp.first_ssrc(),
std::make_pair(ssrc,
new WebRtcVoiceChannelRenderer(channel, audio_transport)));
// Set the send (local) SSRC.
// If there are multiple send SSRCs, we can only set the first one here, and
// the rest of the SSRC(s) need to be set after SetSendCodec has been called
// (with a codec requires multiple SSRC(s)).
if (engine()->voe()->rtp()->SetLocalSSRC(channel, sp.first_ssrc()) == -1) {
LOG_RTCERR2(SetSendSSRC, channel, sp.first_ssrc());
// Set the current codecs to be used for the new channel. We need to do this
// after adding the channel to send_channels_, because of how max bitrate is
// currently being configured by SetSendCodec().
if (!send_codecs_.empty() && !SetSendCodecs(channel, send_codecs_)) {
RemoveSendStream(ssrc);
return false;
}
// At this point the channel's local SSRC has been updated. If the channel is
// the default channel make sure that all the receive channels are updated as
// well. Receive channels have to have the same SSRC as the default channel in
// order to send receiver reports with this SSRC.
if (IsDefaultChannel(channel)) {
// the first send channel make sure that all the receive channels are updated
// with the same SSRC in order to send receiver reports.
if (send_channels_.size() == 1) {
receiver_reports_ssrc_ = ssrc;
for (const auto& ch : receive_channels_) {
if (engine()->voe()->rtp()->SetLocalSSRC(ch.second->channel(),
sp.first_ssrc()) != 0) {
LOG_RTCERR2(SetLocalSSRC, ch.second->channel(), sp.first_ssrc());
int recv_channel = ch.second->channel();
if (engine()->voe()->rtp()->SetLocalSSRC(recv_channel, ssrc) != 0) {
LOG_RTCERR2(SetLocalSSRC, ch.second->channel(), ssrc);
return false;
}
engine()->voe()->base()->AssociateSendChannel(recv_channel, channel);
LOG(LS_INFO) << "VoiceEngine channel #" << recv_channel
<< " is associated with channel #" << channel << ".";
}
}
if (engine()->voe()->rtp()->SetRTCP_CNAME(channel, sp.cname.c_str()) == -1) {
LOG_RTCERR2(SetRTCP_CNAME, channel, sp.cname);
return false;
}
// Set the current codecs to be used for the new channel.
if (!send_codecs_.empty() && !SetSendCodecs(channel, send_codecs_))
return false;
return ChangeSend(channel, desired_send_);
}
bool WebRtcVoiceMediaChannel::RemoveSendStream(uint32_t ssrc) {
RTC_DCHECK(thread_checker_.CalledOnValidThread());
ChannelMap::iterator it = send_channels_.find(ssrc);
if (it == send_channels_.end()) {
LOG(LS_WARNING) << "Try to remove stream with ssrc " << ssrc
@ -2171,21 +2128,15 @@ bool WebRtcVoiceMediaChannel::RemoveSendStream(uint32_t ssrc) {
delete it->second;
send_channels_.erase(it);
if (IsDefaultChannel(channel)) {
// Do not delete the default channel since the receive channels depend on
// the default channel, recycle it instead.
ChangeSend(channel, SEND_NOTHING);
} else {
// Clean up and delete the send channel.
LOG(LS_INFO) << "Removing audio send stream " << ssrc
<< " with VoiceEngine channel #" << channel << ".";
if (!DeleteChannel(channel))
return false;
// Clean up and delete the send channel.
LOG(LS_INFO) << "Removing audio send stream " << ssrc
<< " with VoiceEngine channel #" << channel << ".";
if (!DeleteChannel(channel)) {
return false;
}
if (send_channels_.empty())
if (send_channels_.empty()) {
ChangeSend(SEND_NOTHING);
}
return true;
}
@ -2216,9 +2167,8 @@ bool WebRtcVoiceMediaChannel::AddRecvStream(const StreamParams& sp) {
RTC_DCHECK(receive_stream_params_.find(ssrc) == receive_stream_params_.end());
// Create a new channel for receiving audio data.
int channel = engine()->CreateMediaVoiceChannel();
int channel = CreateVoEChannel();
if (channel == -1) {
LOG_RTCERR0(CreateChannel);
return false;
}
if (!ConfigureRecvChannel(channel)) {
@ -2242,33 +2192,20 @@ bool WebRtcVoiceMediaChannel::AddRecvStream(const StreamParams& sp) {
bool WebRtcVoiceMediaChannel::ConfigureRecvChannel(int channel) {
RTC_DCHECK(thread_checker_.CalledOnValidThread());
// Configure to use external transport.
if (engine()->voe()->network()->RegisterExternalTransport(
channel, *this) == -1) {
LOG_RTCERR2(SetExternalTransport, channel, this);
return false;
}
// Use the same SSRC as our default send channel, so the RTCP reports are
// correct.
unsigned int send_ssrc = 0;
webrtc::VoERTP_RTCP* rtp = engine()->voe()->rtp();
if (rtp->GetLocalSSRC(default_send_channel_id(), send_ssrc) == -1) {
LOG_RTCERR1(GetSendSSRC, channel);
int send_channel = GetSendChannelId(receiver_reports_ssrc_);
if (send_channel != -1) {
// Associate receive channel with first send channel (so the receive channel
// can obtain RTT from the send channel)
engine()->voe()->base()->AssociateSendChannel(channel, send_channel);
LOG(LS_INFO) << "VoiceEngine channel #" << channel
<< " is associated with channel #" << send_channel << ".";
}
if (engine()->voe()->rtp()->SetLocalSSRC(channel,
receiver_reports_ssrc_) == -1) {
LOG_RTCERR1(SetLocalSSRC, channel);
return false;
}
if (rtp->SetLocalSSRC(channel, send_ssrc) == -1) {
LOG_RTCERR1(SetSendSSRC, channel);
return false;
}
// Associate receive channel to default send channel (so the receive channel
// can obtain RTT from the send channel).
engine()->voe()->base()->AssociateSendChannel(channel,
default_send_channel_id());
LOG(LS_INFO) << "VoiceEngine channel #"
<< channel << " is associated with channel #"
<< default_send_channel_id() << ".";
// Turn off all supported codecs.
int ncodecs = engine()->voe()->codec()->NumOfCodecs();
@ -2442,6 +2379,7 @@ bool WebRtcVoiceMediaChannel::InsertDtmf(uint32_t ssrc,
int event,
int duration,
int flags) {
RTC_DCHECK(thread_checker_.CalledOnValidThread());
if (!dtmf_allowed_) {
return false;
}
@ -2450,16 +2388,7 @@ bool WebRtcVoiceMediaChannel::InsertDtmf(uint32_t ssrc,
if (flags & cricket::DF_SEND) {
int channel = -1;
if (ssrc == 0) {
bool default_channel_is_inuse = false;
for (const auto& ch : send_channels_) {
if (IsDefaultChannel(ch.second->channel())) {
default_channel_is_inuse = true;
break;
}
}
if (default_channel_is_inuse) {
channel = default_send_channel_id();
} else if (!send_channels_.empty()) {
if (send_channels_.size() > 0) {
channel = send_channels_.begin()->second->channel();
}
} else {
@ -2577,8 +2506,8 @@ void WebRtcVoiceMediaChannel::OnRtcpReceived(
}
bool WebRtcVoiceMediaChannel::MuteStream(uint32_t ssrc, bool muted) {
int channel =
(ssrc == 0) ? default_send_channel_id() : GetSendChannelId(ssrc);
RTC_DCHECK(thread_checker_.CalledOnValidThread());
int channel = GetSendChannelId(ssrc);
if (channel == -1) {
LOG(LS_WARNING) << "The specified ssrc " << ssrc << " is not in use.";
return false;
@ -2604,8 +2533,9 @@ bool WebRtcVoiceMediaChannel::MuteStream(uint32_t ssrc, bool muted) {
}
webrtc::AudioProcessing* ap = engine()->voe()->base()->audio_processing();
if (ap)
if (ap) {
ap->set_output_will_be_muted(all_muted);
}
return true;
}
@ -2613,7 +2543,6 @@ bool WebRtcVoiceMediaChannel::MuteStream(uint32_t ssrc, bool muted) {
// SetMaxSendBitrate() in future.
bool WebRtcVoiceMediaChannel::SetMaxSendBandwidth(int bps) {
LOG(LS_INFO) << "WebRtcVoiceMediaChannel::SetMaxSendBandwidth.";
return SetSendBitrateInternal(bps);
}
@ -2641,10 +2570,12 @@ bool WebRtcVoiceMediaChannel::SetSendBitrateInternal(int bps) {
if (is_multi_rate) {
// If codec is multi-rate then just set the bitrate.
codec.rate = bps;
if (!SetSendCodec(codec)) {
LOG(LS_INFO) << "Failed to set codec " << codec.plname
<< " to bitrate " << bps << " bps.";
return false;
for (const auto& ch : send_channels_) {
if (!SetSendCodec(ch.second->channel(), codec)) {
LOG(LS_INFO) << "Failed to set codec " << codec.plname
<< " to bitrate " << bps << " bps.";
return false;
}
}
return true;
} else {
@ -2920,18 +2851,6 @@ bool WebRtcVoiceMediaChannel::GetRedSendCodec(const AudioCodec& red_codec,
return false;
}
bool WebRtcVoiceMediaChannel::EnableRtcp(int channel) {
if (engine()->voe()->rtp()->SetRTCPStatus(channel, true) == -1) {
LOG_RTCERR2(SetRTCPStatus, channel, 1);
return false;
}
// TODO(juberti): Enable VQMon and RTCP XR reports, once we know what
// what we want to do with them.
// engine()->voe().EnableVQMon(default_send_channel_id(), true);
// engine()->voe().EnableRTCP_XR(default_send_channel_id(), true);
return true;
}
bool WebRtcVoiceMediaChannel::SetPlayout(int channel, bool playout) {
if (playout) {
LOG(LS_INFO) << "Starting playout for channel #" << channel;

View File

@ -115,9 +115,6 @@ class WebRtcVoiceEngine
// Stops recording the RtcEventLog.
void StopRtcEventLog();
// Create a VoiceEngine Channel.
int CreateMediaVoiceChannel();
private:
void Construct();
void ConstructCodecs();
@ -143,7 +140,7 @@ class WebRtcVoiceEngine
void StartAecDump(const std::string& filename);
void StopAecDump();
int CreateVoiceChannel(VoEWrapper* voe);
int CreateVoEChannel();
static const int kDefaultLogSeverity = rtc::LS_WARNING;
@ -187,8 +184,6 @@ class WebRtcVoiceMediaChannel : public VoiceMediaChannel,
webrtc::Call* call);
~WebRtcVoiceMediaChannel() override;
int default_send_channel_id() const { return default_send_channel_id_; }
bool valid() const { return default_send_channel_id_ != -1; }
const AudioOptions& options() const { return options_; }
bool SetSendParameters(const AudioSendParameters& params) override;
@ -267,7 +262,6 @@ class WebRtcVoiceMediaChannel : public VoiceMediaChannel,
bool GetRedSendCodec(const AudioCodec& red_codec,
const std::vector<AudioCodec>& all_codecs,
webrtc::CodecInst* send_codec);
bool EnableRtcp(int channel);
bool SetPlayout(int channel, bool playout);
static Error WebRtcErrorToChannelError(int err_code);
@ -280,18 +274,13 @@ class WebRtcVoiceMediaChannel : public VoiceMediaChannel,
unsigned char);
void SetNack(int channel, bool nack_enabled);
void SetNack(const ChannelMap& channels, bool nack_enabled);
bool SetSendCodec(const webrtc::CodecInst& send_codec);
bool SetSendCodec(int channel, const webrtc::CodecInst& send_codec);
bool ChangePlayout(bool playout);
bool ChangeSend(SendFlags send);
bool ChangeSend(int channel, SendFlags send);
void ConfigureSendChannel(int channel);
bool ConfigureRecvChannel(int channel);
int CreateVoEChannel();
bool DeleteChannel(int channel);
bool IsDefaultChannel(int channel_id) const {
return channel_id == default_send_channel_id_;
}
bool IsDefaultRecvStream(uint32_t ssrc) {
return default_recv_ssrc_ == static_cast<int64_t>(ssrc);
}
@ -315,7 +304,6 @@ class WebRtcVoiceMediaChannel : public VoiceMediaChannel,
rtc::ThreadChecker thread_checker_;
WebRtcVoiceEngine* const engine_;
const int default_send_channel_id_;
std::vector<AudioCodec> recv_codecs_;
std::vector<AudioCodec> send_codecs_;
rtc::scoped_ptr<webrtc::CodecInst> send_codec_;
@ -335,6 +323,9 @@ class WebRtcVoiceMediaChannel : public VoiceMediaChannel,
int64_t default_recv_ssrc_ = -1;
// Volume for unsignalled stream, which may be set before the stream exists.
double default_recv_volume_ = 1.0;
// SSRC to use for RTCP receiver reports; default to 1 in case of no signaled
// send streams. See: https://code.google.com/p/webrtc/issues/detail?id=4740
uint32_t receiver_reports_ssrc_ = 1;
// send_channels_ contains the channels which are being used for sending.
// When the default channel (default_send_channel_id) is used for sending, it

View File

@ -122,15 +122,15 @@ class WebRtcVoiceEngineTestFake : public testing::Test {
}
void SetupForMultiSendStream() {
EXPECT_TRUE(SetupEngineWithSendStream());
// Remove stream added in Setup, which is corresponding to default channel.
// Remove stream added in Setup.
int default_channel_num = voe_.GetLastChannel();
uint32_t default_send_ssrc = 0u;
EXPECT_EQ(0, voe_.GetLocalSSRC(default_channel_num, default_send_ssrc));
EXPECT_EQ(kSsrc1, default_send_ssrc);
EXPECT_TRUE(channel_->RemoveSendStream(default_send_ssrc));
// Verify the default channel still exists.
EXPECT_EQ(0, voe_.GetLocalSSRC(default_channel_num, default_send_ssrc));
// Verify the channel does not exist.
EXPECT_EQ(-1, voe_.GetLocalSSRC(default_channel_num, default_send_ssrc));
}
void DeliverPacket(const void* data, int len) {
rtc::Buffer packet(reinterpret_cast<const uint8_t*>(data), len);
@ -146,12 +146,11 @@ class WebRtcVoiceEngineTestFake : public testing::Test {
channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
EXPECT_TRUE(channel_ != nullptr);
if (caller) {
// if this is a caller, local description will be applied and add the
// If this is a caller, local description will be applied and add the
// send stream.
EXPECT_TRUE(channel_->AddSendStream(
cricket::StreamParams::CreateLegacy(kSsrc1)));
}
int channel_id = voe_.GetLastChannel();
// Test we can only InsertDtmf when the other side supports telephone-event.
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
@ -163,7 +162,7 @@ class WebRtcVoiceEngineTestFake : public testing::Test {
EXPECT_TRUE(channel_->CanInsertDtmf());
if (!caller) {
// There's no active send channel yet.
// If this is callee, there's no active send channel yet.
EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
EXPECT_TRUE(channel_->AddSendStream(
cricket::StreamParams::CreateLegacy(kSsrc1)));
@ -173,6 +172,7 @@ class WebRtcVoiceEngineTestFake : public testing::Test {
EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111, cricket::DF_SEND));
// Test send
int channel_id = voe_.GetLastChannel();
EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
@ -212,7 +212,7 @@ class WebRtcVoiceEngineTestFake : public testing::Test {
}
void TestSetSendRtpHeaderExtensions(const std::string& ext) {
EXPECT_TRUE(SetupEngine());
EXPECT_TRUE(SetupEngineWithSendStream());
int channel_num = voe_.GetLastChannel();
// Ensure extensions are off by default.
@ -235,12 +235,9 @@ class WebRtcVoiceEngineTestFake : public testing::Test {
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
EXPECT_EQ(id, voe_.GetSendRtpExtensionId(channel_num, ext));
// Ensure extension is set properly on new channel.
// The first stream to occupy the default channel.
// Ensure extension is set properly on new channels.
EXPECT_TRUE(channel_->AddSendStream(
cricket::StreamParams::CreateLegacy(123)));
EXPECT_TRUE(channel_->AddSendStream(
cricket::StreamParams::CreateLegacy(234)));
cricket::StreamParams::CreateLegacy(kSsrc2)));
int new_channel_num = voe_.GetLastChannel();
EXPECT_NE(channel_num, new_channel_num);
EXPECT_EQ(id, voe_.GetSendRtpExtensionId(new_channel_num, ext));
@ -321,14 +318,6 @@ TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
EXPECT_TRUE(channel_ != nullptr);
}
// Tests that we properly handle failures in CreateChannel.
TEST_F(WebRtcVoiceEngineTestFake, CreateChannelFail) {
voe_.set_fail_create_channel(true);
EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
EXPECT_TRUE(channel_ == nullptr);
}
// Tests that the list of supported codecs is created properly and ordered
// correctly
TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
@ -998,7 +987,7 @@ TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
// Test that we can enable NACK with opus as callee.
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
EXPECT_TRUE(SetupEngine());
EXPECT_TRUE(SetupEngineWithRecvStream());
int channel_num = voe_.GetLastChannel();
cricket::AudioSendParameters parameters;
parameters.codecs.push_back(kOpusCodec);
@ -1011,7 +1000,7 @@ TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
EXPECT_TRUE(channel_->AddSendStream(
cricket::StreamParams::CreateLegacy(kSsrc1)));
EXPECT_TRUE(voe_.GetNACK(channel_num));
EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
}
// Test that we can enable NACK on receive streams.
@ -1581,7 +1570,6 @@ TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
EXPECT_TRUE(channel_ != nullptr);
int channel_num = voe_.GetLastChannel();
cricket::AudioSendParameters parameters;
parameters.codecs.push_back(kIsacCodec);
parameters.codecs.push_back(kPcmuCodec);
@ -1596,6 +1584,7 @@ TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
EXPECT_TRUE(channel_->SetSendParameters(parameters));
EXPECT_TRUE(channel_->AddSendStream(
cricket::StreamParams::CreateLegacy(kSsrc1)));
int channel_num = voe_.GetLastChannel();
webrtc::CodecInst gcodec;
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
@ -1698,7 +1687,6 @@ TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
EXPECT_TRUE(channel_ != nullptr);
int channel_num = voe_.GetLastChannel();
cricket::AudioSendParameters parameters;
parameters.codecs.push_back(kRedCodec);
parameters.codecs.push_back(kIsacCodec);
@ -1709,6 +1697,7 @@ TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
EXPECT_TRUE(channel_->SetSendParameters(parameters));
EXPECT_TRUE(channel_->AddSendStream(
cricket::StreamParams::CreateLegacy(kSsrc1)));
int channel_num = voe_.GetLastChannel();
webrtc::CodecInst gcodec;
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
EXPECT_EQ(96, gcodec.pltype);
@ -1892,8 +1881,6 @@ TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
EXPECT_TRUE(channel_->RemoveSendStream(kSsrcs4[0]));
// Stream should already be Removed from the send stream list.
EXPECT_FALSE(channel_->RemoveSendStream(kSsrcs4[0]));
// But the default still exists.
EXPECT_EQ(0, voe_.GetChannelFromLocalSsrc(kSsrcs4[0]));
// Delete the rest of send channel streams.
for (unsigned int i = 1; i < ARRAY_SIZE(kSsrcs4); ++i) {
@ -2416,14 +2403,20 @@ TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
EXPECT_TRUE(channel_->RemoveRecvStream(1));
}
// Test that we properly handle failures to add a stream.
TEST_F(WebRtcVoiceEngineTestFake, AddStreamFail) {
EXPECT_TRUE(SetupEngineWithSendStream());
// Test that we properly handle failures to add a receive stream.
TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
EXPECT_TRUE(SetupEngine());
voe_.set_fail_create_channel(true);
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
}
// Test that we properly handle failures to add a send stream.
TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
EXPECT_TRUE(SetupEngine());
voe_.set_fail_create_channel(true);
EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
}
// Test that AddRecvStream creates new stream.
TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
EXPECT_TRUE(SetupEngineWithRecvStream());
@ -3078,9 +3071,9 @@ TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
EXPECT_EQ(2, s->received_packets());
}
// All receive channels should be associated with the default send channel,
// All receive channels should be associated with the first send channel,
// since they do not send RTCP SR.
TEST_F(WebRtcVoiceEngineTestFake, AssociateDefaultChannelOnConference) {
TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
EXPECT_TRUE(SetupEngineWithSendStream());
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
int default_channel = voe_.GetLastChannel();