Change SetOutputScaling to set a single level, not left/right levels.
BUG=webrtc:4690 Review URL: https://codereview.webrtc.org/1397773002 Cr-Commit-Position: refs/heads/master@{#10234}
This commit is contained in:
parent
0b67546d8c
commit
4bac9c53da
@ -1246,8 +1246,8 @@ void WebRtcSession::SetAudioPlayout(uint32_t ssrc,
|
||||
LOG(LS_ERROR) << "SetAudioPlayout: ssrc is incorrect: " << ssrc;
|
||||
return;
|
||||
}
|
||||
if (!voice_channel_->SetOutputScaling(ssrc, enable ? 1 : 0, enable ? 1 : 0)) {
|
||||
// Allow that SetOutputScaling fail if |enable| is false but assert
|
||||
if (!voice_channel_->SetOutputVolume(ssrc, enable ? 1 : 0)) {
|
||||
// Allow that SetOutputVolume fail if |enable| is false but assert
|
||||
// otherwise. This in the normal case when the underlying media channel has
|
||||
// already been deleted.
|
||||
ASSERT(enable == false);
|
||||
@ -1276,7 +1276,7 @@ void WebRtcSession::SetAudioPlayoutVolume(uint32_t ssrc, double volume) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!voice_channel_->SetOutputScaling(ssrc, volume, volume)) {
|
||||
if (!voice_channel_->SetOutputVolume(ssrc, volume)) {
|
||||
ASSERT(false);
|
||||
}
|
||||
}
|
||||
|
||||
@ -3108,20 +3108,17 @@ TEST_F(WebRtcSessionTest, SetAudioPlayout) {
|
||||
ASSERT_TRUE(channel != NULL);
|
||||
ASSERT_EQ(1u, channel->recv_streams().size());
|
||||
uint32_t receive_ssrc = channel->recv_streams()[0].first_ssrc();
|
||||
double left_vol, right_vol;
|
||||
EXPECT_TRUE(channel->GetOutputScaling(receive_ssrc, &left_vol, &right_vol));
|
||||
EXPECT_EQ(1, left_vol);
|
||||
EXPECT_EQ(1, right_vol);
|
||||
double volume;
|
||||
EXPECT_TRUE(channel->GetOutputVolume(receive_ssrc, &volume));
|
||||
EXPECT_EQ(1, volume);
|
||||
rtc::scoped_ptr<FakeAudioRenderer> renderer(new FakeAudioRenderer());
|
||||
session_->SetAudioPlayout(receive_ssrc, false, renderer.get());
|
||||
EXPECT_TRUE(channel->GetOutputScaling(receive_ssrc, &left_vol, &right_vol));
|
||||
EXPECT_EQ(0, left_vol);
|
||||
EXPECT_EQ(0, right_vol);
|
||||
EXPECT_TRUE(channel->GetOutputVolume(receive_ssrc, &volume));
|
||||
EXPECT_EQ(0, volume);
|
||||
EXPECT_EQ(0, renderer->channel_id());
|
||||
session_->SetAudioPlayout(receive_ssrc, true, NULL);
|
||||
EXPECT_TRUE(channel->GetOutputScaling(receive_ssrc, &left_vol, &right_vol));
|
||||
EXPECT_EQ(1, left_vol);
|
||||
EXPECT_EQ(1, right_vol);
|
||||
EXPECT_TRUE(channel->GetOutputVolume(receive_ssrc, &volume));
|
||||
EXPECT_EQ(1, volume);
|
||||
EXPECT_EQ(-1, renderer->channel_id());
|
||||
}
|
||||
|
||||
|
||||
@ -243,7 +243,7 @@ class FakeVoiceMediaChannel : public RtpHelper<VoiceMediaChannel> {
|
||||
const AudioOptions& options)
|
||||
: engine_(engine),
|
||||
time_since_last_typing_(-1) {
|
||||
output_scalings_[0] = OutputScaling(); // For default channel.
|
||||
output_scalings_[0] = 1.0; // For default channel.
|
||||
SetOptions(options);
|
||||
}
|
||||
~FakeVoiceMediaChannel();
|
||||
@ -291,7 +291,7 @@ class FakeVoiceMediaChannel : public RtpHelper<VoiceMediaChannel> {
|
||||
virtual bool AddRecvStream(const StreamParams& sp) {
|
||||
if (!RtpHelper<VoiceMediaChannel>::AddRecvStream(sp))
|
||||
return false;
|
||||
output_scalings_[sp.first_ssrc()] = OutputScaling();
|
||||
output_scalings_[sp.first_ssrc()] = 1.0;
|
||||
return true;
|
||||
}
|
||||
virtual bool RemoveRecvStream(uint32_t ssrc) {
|
||||
@ -347,37 +347,29 @@ class FakeVoiceMediaChannel : public RtpHelper<VoiceMediaChannel> {
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual bool SetOutputScaling(uint32_t ssrc, double left, double right) {
|
||||
virtual bool SetOutputVolume(uint32_t ssrc, double volume) {
|
||||
if (0 == ssrc) {
|
||||
std::map<uint32_t, OutputScaling>::iterator it;
|
||||
std::map<uint32_t, double>::iterator it;
|
||||
for (it = output_scalings_.begin(); it != output_scalings_.end(); ++it) {
|
||||
it->second.left = left;
|
||||
it->second.right = right;
|
||||
it->second = volume;
|
||||
}
|
||||
return true;
|
||||
} else if (output_scalings_.find(ssrc) != output_scalings_.end()) {
|
||||
output_scalings_[ssrc].left = left;
|
||||
output_scalings_[ssrc].right = right;
|
||||
output_scalings_[ssrc] = volume;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
bool GetOutputScaling(uint32_t ssrc, double* left, double* right) {
|
||||
bool GetOutputVolume(uint32_t ssrc, double* volume) {
|
||||
if (output_scalings_.find(ssrc) == output_scalings_.end())
|
||||
return false;
|
||||
*left = output_scalings_[ssrc].left;
|
||||
*right = output_scalings_[ssrc].right;
|
||||
*volume = output_scalings_[ssrc];
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual bool GetStats(VoiceMediaInfo* info) { return false; }
|
||||
|
||||
private:
|
||||
struct OutputScaling {
|
||||
OutputScaling() : left(1.0), right(1.0) {}
|
||||
double left, right;
|
||||
};
|
||||
|
||||
class VoiceChannelAudioSink : public AudioRenderer::Sink {
|
||||
public:
|
||||
explicit VoiceChannelAudioSink(AudioRenderer* renderer)
|
||||
@ -446,7 +438,7 @@ class FakeVoiceMediaChannel : public RtpHelper<VoiceMediaChannel> {
|
||||
FakeVoiceEngine* engine_;
|
||||
std::vector<AudioCodec> recv_codecs_;
|
||||
std::vector<AudioCodec> send_codecs_;
|
||||
std::map<uint32_t, OutputScaling> output_scalings_;
|
||||
std::map<uint32_t, double> output_scalings_;
|
||||
std::vector<DtmfInfo> dtmf_info_queue_;
|
||||
int time_since_last_typing_;
|
||||
AudioOptions options_;
|
||||
|
||||
@ -1067,8 +1067,8 @@ class VoiceMediaChannel : public MediaChannel {
|
||||
virtual void SetTypingDetectionParameters(int time_window,
|
||||
int cost_per_typing, int reporting_threshold, int penalty_decay,
|
||||
int type_event_delay) = 0;
|
||||
// Set left and right scale for speaker output volume of the specified ssrc.
|
||||
virtual bool SetOutputScaling(uint32_t ssrc, double left, double right) = 0;
|
||||
// Set speaker output volume of the specified ssrc.
|
||||
virtual bool SetOutputVolume(uint32_t ssrc, double volume) = 0;
|
||||
// Returns if the telephone-event has been negotiated.
|
||||
virtual bool CanInsertDtmf() { return false; }
|
||||
// Send and/or play a DTMF |event| according to the |flags|.
|
||||
|
||||
@ -200,8 +200,6 @@ class FakeWebRtcVoiceEngine
|
||||
send(false),
|
||||
playout(false),
|
||||
volume_scale(1.0),
|
||||
volume_pan_left(1.0),
|
||||
volume_pan_right(1.0),
|
||||
vad(false),
|
||||
codec_fec(false),
|
||||
max_encoding_bandwidth(0),
|
||||
@ -227,8 +225,6 @@ class FakeWebRtcVoiceEngine
|
||||
bool send;
|
||||
bool playout;
|
||||
float volume_scale;
|
||||
float volume_pan_left;
|
||||
float volume_pan_right;
|
||||
bool vad;
|
||||
bool codec_fec;
|
||||
int max_encoding_bandwidth;
|
||||
@ -924,18 +920,8 @@ class FakeWebRtcVoiceEngine
|
||||
scale = channels_[channel]->volume_scale;
|
||||
return 0;
|
||||
}
|
||||
WEBRTC_FUNC(SetOutputVolumePan, (int channel, float left, float right)) {
|
||||
WEBRTC_CHECK_CHANNEL(channel);
|
||||
channels_[channel]->volume_pan_left = left;
|
||||
channels_[channel]->volume_pan_right = right;
|
||||
return 0;
|
||||
}
|
||||
WEBRTC_FUNC(GetOutputVolumePan, (int channel, float& left, float& right)) {
|
||||
WEBRTC_CHECK_CHANNEL(channel);
|
||||
left = channels_[channel]->volume_pan_left;
|
||||
right = channels_[channel]->volume_pan_right;
|
||||
return 0;
|
||||
}
|
||||
WEBRTC_STUB(SetOutputVolumePan, (int channel, float left, float right));
|
||||
WEBRTC_STUB(GetOutputVolumePan, (int channel, float& left, float& right));
|
||||
|
||||
// webrtc::VoEAudioProcessing
|
||||
WEBRTC_FUNC(SetNsStatus, (bool enable, webrtc::NsModes mode)) {
|
||||
|
||||
@ -2491,9 +2491,7 @@ void WebRtcVoiceMediaChannel::SetTypingDetectionParameters(int time_window,
|
||||
}
|
||||
}
|
||||
|
||||
bool WebRtcVoiceMediaChannel::SetOutputScaling(uint32_t ssrc,
|
||||
double left,
|
||||
double right) {
|
||||
bool WebRtcVoiceMediaChannel::SetOutputVolume(uint32_t ssrc, double volume) {
|
||||
RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
||||
rtc::CritScope lock(&receive_channels_cs_);
|
||||
// Collect the channels to scale the output volume.
|
||||
@ -2515,27 +2513,13 @@ bool WebRtcVoiceMediaChannel::SetOutputScaling(uint32_t ssrc,
|
||||
channels.push_back(channel);
|
||||
}
|
||||
|
||||
// Scale the output volume for the collected channels. We first normalize to
|
||||
// scale the volume and then set the left and right pan.
|
||||
float scale = static_cast<float>(std::max(left, right));
|
||||
if (scale > 0.0001f) {
|
||||
left /= scale;
|
||||
right /= scale;
|
||||
}
|
||||
for (int ch_id : channels) {
|
||||
if (-1 == engine()->voe()->volume()->SetChannelOutputVolumeScaling(
|
||||
ch_id, scale)) {
|
||||
LOG_RTCERR2(SetChannelOutputVolumeScaling, ch_id, scale);
|
||||
ch_id, volume)) {
|
||||
LOG_RTCERR2(SetChannelOutputVolumeScaling, ch_id, volume);
|
||||
return false;
|
||||
}
|
||||
if (-1 == engine()->voe()->volume()->SetOutputVolumePan(
|
||||
ch_id, static_cast<float>(left), static_cast<float>(right))) {
|
||||
LOG_RTCERR3(SetOutputVolumePan, ch_id, left, right);
|
||||
// Do not return if fails. SetOutputVolumePan is not available for all
|
||||
// pltforms.
|
||||
}
|
||||
LOG(LS_INFO) << "SetOutputScaling to left=" << left * scale
|
||||
<< " right=" << right * scale
|
||||
LOG(LS_INFO) << "SetOutputVolume to " << volume
|
||||
<< " for channel " << ch_id << " and ssrc " << ssrc;
|
||||
}
|
||||
return true;
|
||||
|
||||
@ -209,7 +209,7 @@ class WebRtcVoiceMediaChannel : public VoiceMediaChannel,
|
||||
int reporting_threshold,
|
||||
int penalty_decay,
|
||||
int type_event_delay) override;
|
||||
bool SetOutputScaling(uint32_t ssrc, double left, double right) override;
|
||||
bool SetOutputVolume(uint32_t ssrc, double volume) override;
|
||||
|
||||
bool CanInsertDtmf() override;
|
||||
bool InsertDtmf(uint32_t ssrc, int event, int duration, int flags) override;
|
||||
|
||||
@ -2880,27 +2880,23 @@ TEST_F(WebRtcVoiceEngineTestFake, TestGetChannelNumInConferenceCalls) {
|
||||
media_channel->GetReceiveChannelId(kSsrc2));
|
||||
}
|
||||
|
||||
TEST_F(WebRtcVoiceEngineTestFake, SetOutputScaling) {
|
||||
TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
|
||||
EXPECT_TRUE(SetupEngine());
|
||||
float scale, left, right;
|
||||
EXPECT_TRUE(channel_->SetOutputScaling(0, 1, 2));
|
||||
float scale;
|
||||
EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
|
||||
int channel_id = voe_.GetLastChannel();
|
||||
EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
|
||||
EXPECT_EQ(0, voe_.GetOutputVolumePan(channel_id, left, right));
|
||||
EXPECT_DOUBLE_EQ(1, left * scale);
|
||||
EXPECT_DOUBLE_EQ(2, right * scale);
|
||||
EXPECT_DOUBLE_EQ(2, scale);
|
||||
|
||||
EXPECT_FALSE(channel_->SetOutputScaling(kSsrc2, 1, 2));
|
||||
EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
|
||||
cricket::StreamParams stream;
|
||||
stream.ssrcs.push_back(kSsrc2);
|
||||
EXPECT_TRUE(channel_->AddRecvStream(stream));
|
||||
|
||||
EXPECT_TRUE(channel_->SetOutputScaling(kSsrc2, 2, 1));
|
||||
EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
|
||||
channel_id = voe_.GetLastChannel();
|
||||
EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
|
||||
EXPECT_EQ(0, voe_.GetOutputVolumePan(channel_id, left, right));
|
||||
EXPECT_DOUBLE_EQ(2, left * scale);
|
||||
EXPECT_DOUBLE_EQ(1, right * scale);
|
||||
EXPECT_DOUBLE_EQ(3, scale);
|
||||
}
|
||||
|
||||
TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
|
||||
|
||||
@ -1347,9 +1347,9 @@ bool VoiceChannel::InsertDtmf(uint32_t ssrc,
|
||||
ssrc, event_code, duration, flags));
|
||||
}
|
||||
|
||||
bool VoiceChannel::SetOutputScaling(uint32_t ssrc, double left, double right) {
|
||||
return InvokeOnWorker(Bind(&VoiceMediaChannel::SetOutputScaling,
|
||||
media_channel(), ssrc, left, right));
|
||||
bool VoiceChannel::SetOutputVolume(uint32_t ssrc, double volume) {
|
||||
return InvokeOnWorker(Bind(&VoiceMediaChannel::SetOutputVolume,
|
||||
media_channel(), ssrc, volume));
|
||||
}
|
||||
|
||||
bool VoiceChannel::GetStats(VoiceMediaInfo* stats) {
|
||||
|
||||
@ -365,7 +365,7 @@ class VoiceChannel : public BaseChannel {
|
||||
// The valid value for the |event| are 0 which corresponding to DTMF
|
||||
// event 0-9, *, #, A-D.
|
||||
bool InsertDtmf(uint32_t ssrc, int event_code, int duration, int flags);
|
||||
bool SetOutputScaling(uint32_t ssrc, double left, double right);
|
||||
bool SetOutputVolume(uint32_t ssrc, double volume);
|
||||
// Get statistics about the current media session.
|
||||
bool GetStats(VoiceMediaInfo* stats);
|
||||
|
||||
@ -402,7 +402,7 @@ class VoiceChannel : public BaseChannel {
|
||||
std::string* error_desc);
|
||||
void HandleEarlyMediaTimeout();
|
||||
bool InsertDtmf_w(uint32_t ssrc, int event, int duration, int flags);
|
||||
bool SetOutputScaling_w(uint32_t ssrc, double left, double right);
|
||||
bool SetOutputVolume_w(uint32_t ssrc, double volume);
|
||||
bool GetStats_w(VoiceMediaInfo* stats);
|
||||
|
||||
virtual void OnMessage(rtc::Message* pmsg);
|
||||
|
||||
@ -2189,26 +2189,23 @@ TEST_F(VoiceChannelTest, TestScaleVolume1to1Call) {
|
||||
CreateChannels(RTCP, RTCP);
|
||||
EXPECT_TRUE(SendInitiate());
|
||||
EXPECT_TRUE(SendAccept());
|
||||
double left, right;
|
||||
double volume;
|
||||
|
||||
// Default is (1.0, 1.0).
|
||||
EXPECT_TRUE(media_channel1_->GetOutputScaling(0, &left, &right));
|
||||
EXPECT_DOUBLE_EQ(1.0, left);
|
||||
EXPECT_DOUBLE_EQ(1.0, right);
|
||||
// Default is (1.0).
|
||||
EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
|
||||
EXPECT_DOUBLE_EQ(1.0, volume);
|
||||
// invalid ssrc.
|
||||
EXPECT_FALSE(media_channel1_->GetOutputScaling(3, &left, &right));
|
||||
EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
|
||||
|
||||
// Set scale to (1.5, 0.5).
|
||||
EXPECT_TRUE(channel1_->SetOutputScaling(0, 1.5, 0.5));
|
||||
EXPECT_TRUE(media_channel1_->GetOutputScaling(0, &left, &right));
|
||||
EXPECT_DOUBLE_EQ(1.5, left);
|
||||
EXPECT_DOUBLE_EQ(0.5, right);
|
||||
// Set scale to (1.5).
|
||||
EXPECT_TRUE(channel1_->SetOutputVolume(0, 1.5));
|
||||
EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
|
||||
EXPECT_DOUBLE_EQ(1.5, volume);
|
||||
|
||||
// Set scale to (0, 0).
|
||||
EXPECT_TRUE(channel1_->SetOutputScaling(0, 0.0, 0.0));
|
||||
EXPECT_TRUE(media_channel1_->GetOutputScaling(0, &left, &right));
|
||||
EXPECT_DOUBLE_EQ(0.0, left);
|
||||
EXPECT_DOUBLE_EQ(0.0, right);
|
||||
// Set scale to (0).
|
||||
EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
|
||||
EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
|
||||
EXPECT_DOUBLE_EQ(0.0, volume);
|
||||
}
|
||||
|
||||
// Test that we can scale the output volume properly for multiway calls.
|
||||
@ -2219,43 +2216,34 @@ TEST_F(VoiceChannelTest, TestScaleVolumeMultiwayCall) {
|
||||
EXPECT_TRUE(AddStream1(1));
|
||||
EXPECT_TRUE(AddStream1(2));
|
||||
|
||||
double left, right;
|
||||
// Default is (1.0, 1.0).
|
||||
EXPECT_TRUE(media_channel1_->GetOutputScaling(0, &left, &right));
|
||||
EXPECT_DOUBLE_EQ(1.0, left);
|
||||
EXPECT_DOUBLE_EQ(1.0, right);
|
||||
EXPECT_TRUE(media_channel1_->GetOutputScaling(1, &left, &right));
|
||||
EXPECT_DOUBLE_EQ(1.0, left);
|
||||
EXPECT_DOUBLE_EQ(1.0, right);
|
||||
EXPECT_TRUE(media_channel1_->GetOutputScaling(2, &left, &right));
|
||||
EXPECT_DOUBLE_EQ(1.0, left);
|
||||
EXPECT_DOUBLE_EQ(1.0, right);
|
||||
double volume;
|
||||
// Default is (1.0).
|
||||
EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
|
||||
EXPECT_DOUBLE_EQ(1.0, volume);
|
||||
EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
|
||||
EXPECT_DOUBLE_EQ(1.0, volume);
|
||||
EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
|
||||
EXPECT_DOUBLE_EQ(1.0, volume);
|
||||
// invalid ssrc.
|
||||
EXPECT_FALSE(media_channel1_->GetOutputScaling(3, &left, &right));
|
||||
EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
|
||||
|
||||
// Set scale to (1.5, 0.5) for ssrc = 1.
|
||||
EXPECT_TRUE(channel1_->SetOutputScaling(1, 1.5, 0.5));
|
||||
EXPECT_TRUE(media_channel1_->GetOutputScaling(1, &left, &right));
|
||||
EXPECT_DOUBLE_EQ(1.5, left);
|
||||
EXPECT_DOUBLE_EQ(0.5, right);
|
||||
EXPECT_TRUE(media_channel1_->GetOutputScaling(2, &left, &right));
|
||||
EXPECT_DOUBLE_EQ(1.0, left);
|
||||
EXPECT_DOUBLE_EQ(1.0, right);
|
||||
EXPECT_TRUE(media_channel1_->GetOutputScaling(0, &left, &right));
|
||||
EXPECT_DOUBLE_EQ(1.0, left);
|
||||
EXPECT_DOUBLE_EQ(1.0, right);
|
||||
// Set scale to (1.5) for ssrc = 1.
|
||||
EXPECT_TRUE(channel1_->SetOutputVolume(1, 1.5));
|
||||
EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
|
||||
EXPECT_DOUBLE_EQ(1.5, volume);
|
||||
EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
|
||||
EXPECT_DOUBLE_EQ(1.0, volume);
|
||||
EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
|
||||
EXPECT_DOUBLE_EQ(1.0, volume);
|
||||
|
||||
// Set scale to (0, 0) for all ssrcs.
|
||||
EXPECT_TRUE(channel1_->SetOutputScaling(0, 0.0, 0.0));
|
||||
EXPECT_TRUE(media_channel1_->GetOutputScaling(0, &left, &right));
|
||||
EXPECT_DOUBLE_EQ(0.0, left);
|
||||
EXPECT_DOUBLE_EQ(0.0, right);
|
||||
EXPECT_TRUE(media_channel1_->GetOutputScaling(1, &left, &right));
|
||||
EXPECT_DOUBLE_EQ(0.0, left);
|
||||
EXPECT_DOUBLE_EQ(0.0, right);
|
||||
EXPECT_TRUE(media_channel1_->GetOutputScaling(2, &left, &right));
|
||||
EXPECT_DOUBLE_EQ(0.0, left);
|
||||
EXPECT_DOUBLE_EQ(0.0, right);
|
||||
// Set scale to (0) for all ssrcs.
|
||||
EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
|
||||
EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
|
||||
EXPECT_DOUBLE_EQ(0.0, volume);
|
||||
EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
|
||||
EXPECT_DOUBLE_EQ(0.0, volume);
|
||||
EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
|
||||
EXPECT_DOUBLE_EQ(0.0, volume);
|
||||
}
|
||||
|
||||
TEST_F(VoiceChannelTest, SendBundleToBundle) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user