Use ChannelProxy for most calls on voe::Channel in Audio[Receive|Send]Stream.
BUG=webrtc:4690
Review URL: https://codereview.webrtc.org/1482703002
Cr-Commit-Position: refs/heads/master@{#10828}
diff --git a/webrtc/audio/audio_receive_stream.cc b/webrtc/audio/audio_receive_stream.cc
index dd3f3c4..87cb215 100644
--- a/webrtc/audio/audio_receive_stream.cc
+++ b/webrtc/audio/audio_receive_stream.cc
@@ -79,24 +79,14 @@
VoiceEngineImpl* voe_impl = static_cast<VoiceEngineImpl*>(voice_engine());
channel_proxy_ = voe_impl->GetChannelProxy(config_.voe_channel_id);
channel_proxy_->SetLocalSSRC(config.rtp.local_ssrc);
-
- const int channel_id = config.voe_channel_id;
- ScopedVoEInterface<VoERTP_RTCP> rtp(voice_engine());
for (const auto& extension : config.rtp.extensions) {
- // One-byte-extension local identifiers are in the range 1-14 inclusive.
- RTC_DCHECK_GE(extension.id, 1);
- RTC_DCHECK_LE(extension.id, 14);
if (extension.name == RtpExtension::kAudioLevel) {
- int error = rtp->SetReceiveAudioLevelIndicationStatus(channel_id, true,
- extension.id);
- RTC_DCHECK_EQ(0, error);
+ channel_proxy_->SetReceiveAudioLevelIndicationStatus(true, extension.id);
bool registered = rtp_header_parser_->RegisterRtpHeaderExtension(
kRtpExtensionAudioLevel, extension.id);
RTC_DCHECK(registered);
} else if (extension.name == RtpExtension::kAbsSendTime) {
- int error = rtp->SetReceiveAbsoluteSenderTimeStatus(channel_id, true,
- extension.id);
- RTC_DCHECK_EQ(0, error);
+ channel_proxy_->SetReceiveAbsoluteSenderTimeStatus(true, extension.id);
bool registered = rtp_header_parser_->RegisterRtpHeaderExtension(
kRtpExtensionAbsoluteSendTime, extension.id);
RTC_DCHECK(registered);
@@ -168,14 +158,8 @@
webrtc::AudioReceiveStream::Stats stats;
stats.remote_ssrc = config_.rtp.remote_ssrc;
ScopedVoEInterface<VoECodec> codec(voice_engine());
- ScopedVoEInterface<VoENetEqStats> neteq(voice_engine());
- ScopedVoEInterface<VoERTP_RTCP> rtp(voice_engine());
- ScopedVoEInterface<VoEVideoSync> sync(voice_engine());
- ScopedVoEInterface<VoEVolumeControl> volume(voice_engine());
- webrtc::CallStatistics call_stats = {0};
- int error = rtp->GetRTCPStatistics(config_.voe_channel_id, call_stats);
- RTC_DCHECK_EQ(0, error);
+ webrtc::CallStatistics call_stats = channel_proxy_->GetRTCPStatistics();
webrtc::CodecInst codec_inst = {0};
if (codec->GetRecCodec(config_.voe_channel_id, codec_inst) == -1) {
return stats;
@@ -193,25 +177,11 @@
if (codec_inst.plfreq / 1000 > 0) {
stats.jitter_ms = call_stats.jitterSamples / (codec_inst.plfreq / 1000);
}
- {
- int jitter_buffer_delay_ms = 0;
- int playout_buffer_delay_ms = 0;
- sync->GetDelayEstimate(config_.voe_channel_id, &jitter_buffer_delay_ms,
- &playout_buffer_delay_ms);
- stats.delay_estimate_ms = jitter_buffer_delay_ms + playout_buffer_delay_ms;
- }
- {
- unsigned int level = 0;
- error = volume->GetSpeechOutputLevelFullRange(config_.voe_channel_id,
- level);
- RTC_DCHECK_EQ(0, error);
- stats.audio_level = static_cast<int32_t>(level);
- }
+ stats.delay_estimate_ms = channel_proxy_->GetDelayEstimate();
+ stats.audio_level = channel_proxy_->GetSpeechOutputLevelFullRange();
// Get jitter buffer and total delay (alg + jitter + playout) stats.
- webrtc::NetworkStatistics ns = {0};
- error = neteq->GetNetworkStatistics(config_.voe_channel_id, ns);
- RTC_DCHECK_EQ(0, error);
+ auto ns = channel_proxy_->GetNetworkStatistics();
stats.jitter_buffer_ms = ns.currentBufferSize;
stats.jitter_buffer_preferred_ms = ns.preferredBufferSize;
stats.expand_rate = Q14ToFloat(ns.currentExpandRate);
@@ -220,9 +190,7 @@
stats.accelerate_rate = Q14ToFloat(ns.currentAccelerateRate);
stats.preemptive_expand_rate = Q14ToFloat(ns.currentPreemptiveRate);
- webrtc::AudioDecodingCallStats ds;
- error = neteq->GetDecodingCallStatistics(config_.voe_channel_id, &ds);
- RTC_DCHECK_EQ(0, error);
+ auto ds = channel_proxy_->GetDecodingCallStatistics();
stats.decoding_calls_to_silence_generator = ds.calls_to_silence_generator;
stats.decoding_calls_to_neteq = ds.calls_to_neteq;
stats.decoding_normal = ds.decoded_normal;
diff --git a/webrtc/audio/audio_receive_stream_unittest.cc b/webrtc/audio/audio_receive_stream_unittest.cc
index aac7c0f..40c2d64 100644
--- a/webrtc/audio/audio_receive_stream_unittest.cc
+++ b/webrtc/audio/audio_receive_stream_unittest.cc
@@ -69,14 +69,14 @@
EXPECT_FALSE(channel_proxy_);
channel_proxy_ = new testing::StrictMock<MockVoEChannelProxy>();
EXPECT_CALL(*channel_proxy_, SetLocalSSRC(kLocalSsrc)).Times(1);
+ EXPECT_CALL(*channel_proxy_,
+ SetReceiveAbsoluteSenderTimeStatus(true, kAbsSendTimeId))
+ .Times(1);
+ EXPECT_CALL(*channel_proxy_,
+ SetReceiveAudioLevelIndicationStatus(true, kAudioLevelId))
+ .Times(1);
return channel_proxy_;
}));
- EXPECT_CALL(voice_engine_,
- SetReceiveAbsoluteSenderTimeStatus(kChannelId, true, kAbsSendTimeId))
- .WillOnce(Return(0));
- EXPECT_CALL(voice_engine_,
- SetReceiveAudioLevelIndicationStatus(kChannelId, true, kAudioLevelId))
- .WillOnce(Return(0));
stream_config_.voe_channel_id = kChannelId;
stream_config_.rtp.local_ssrc = kLocalSsrc;
stream_config_.rtp.remote_ssrc = kRemoteSsrc;
@@ -95,23 +95,22 @@
void SetupMockForGetStats() {
using testing::DoAll;
- using testing::SetArgPointee;
using testing::SetArgReferee;
- EXPECT_CALL(voice_engine_, GetRTCPStatistics(kChannelId, _))
- .WillOnce(DoAll(SetArgReferee<1>(kCallStats), Return(0)));
+ EXPECT_TRUE(channel_proxy_);
+ EXPECT_CALL(*channel_proxy_, GetRTCPStatistics())
+ .WillOnce(Return(kCallStats));
+ EXPECT_CALL(*channel_proxy_, GetDelayEstimate())
+ .WillOnce(Return(kJitterBufferDelay + kPlayoutBufferDelay));
+ EXPECT_CALL(*channel_proxy_, GetSpeechOutputLevelFullRange())
+ .WillOnce(Return(kSpeechOutputLevel));
+ EXPECT_CALL(*channel_proxy_, GetNetworkStatistics())
+ .WillOnce(Return(kNetworkStats));
+ EXPECT_CALL(*channel_proxy_, GetDecodingCallStatistics())
+ .WillOnce(Return(kAudioDecodeStats));
+
EXPECT_CALL(voice_engine_, GetRecCodec(kChannelId, _))
.WillOnce(DoAll(SetArgReferee<1>(kCodecInst), Return(0)));
- EXPECT_CALL(voice_engine_, GetDelayEstimate(kChannelId, _, _))
- .WillOnce(DoAll(SetArgPointee<1>(kJitterBufferDelay),
- SetArgPointee<2>(kPlayoutBufferDelay), Return(0)));
- EXPECT_CALL(voice_engine_,
- GetSpeechOutputLevelFullRange(kChannelId, _)).WillOnce(
- DoAll(SetArgReferee<1>(kSpeechOutputLevel), Return(0)));
- EXPECT_CALL(voice_engine_, GetNetworkStatistics(kChannelId, _))
- .WillOnce(DoAll(SetArgReferee<1>(kNetworkStats), Return(0)));
- EXPECT_CALL(voice_engine_, GetDecodingCallStatistics(kChannelId, _))
- .WillOnce(DoAll(SetArgPointee<1>(kAudioDecodeStats), Return(0)));
}
private:
diff --git a/webrtc/audio/audio_send_stream.cc b/webrtc/audio/audio_send_stream.cc
index 04d3a25..4dd9522 100644
--- a/webrtc/audio/audio_send_stream.cc
+++ b/webrtc/audio/audio_send_stream.cc
@@ -66,21 +66,11 @@
channel_proxy_->SetRTCPStatus(true);
channel_proxy_->SetLocalSSRC(config.rtp.ssrc);
channel_proxy_->SetRTCP_CNAME(config.rtp.c_name);
-
- const int channel_id = config.voe_channel_id;
- ScopedVoEInterface<VoERTP_RTCP> rtp(voice_engine());
for (const auto& extension : config.rtp.extensions) {
- // One-byte-extension local identifiers are in the range 1-14 inclusive.
- RTC_DCHECK_GE(extension.id, 1);
- RTC_DCHECK_LE(extension.id, 14);
if (extension.name == RtpExtension::kAbsSendTime) {
- int error = rtp->SetSendAbsoluteSenderTimeStatus(channel_id, true,
- extension.id);
- RTC_DCHECK_EQ(0, error);
+ channel_proxy_->SetSendAbsoluteSenderTimeStatus(true, extension.id);
} else if (extension.name == RtpExtension::kAudioLevel) {
- int error = rtp->SetSendAudioLevelIndicationStatus(channel_id, true,
- extension.id);
- RTC_DCHECK_EQ(0, error);
+ channel_proxy_->SetSendAudioLevelIndicationStatus(true, extension.id);
} else {
RTC_NOTREACHED() << "Registering unsupported RTP extension.";
}
@@ -118,12 +108,9 @@
stats.local_ssrc = config_.rtp.ssrc;
ScopedVoEInterface<VoEAudioProcessing> processing(voice_engine());
ScopedVoEInterface<VoECodec> codec(voice_engine());
- ScopedVoEInterface<VoERTP_RTCP> rtp(voice_engine());
ScopedVoEInterface<VoEVolumeControl> volume(voice_engine());
- webrtc::CallStatistics call_stats = {0};
- int error = rtp->GetRTCPStatistics(config_.voe_channel_id, call_stats);
- RTC_DCHECK_EQ(0, error);
+ webrtc::CallStatistics call_stats = channel_proxy_->GetRTCPStatistics();
stats.bytes_sent = call_stats.bytesSent;
stats.packets_sent = call_stats.packetsSent;
// RTT isn't known until a RTCP report is received. Until then, VoiceEngine
@@ -141,10 +128,7 @@
stats.codec_name = codec_inst.plname;
// Get data from the last remote RTCP report.
- std::vector<webrtc::ReportBlock> blocks;
- error = rtp->GetRemoteRTCPReportBlocks(config_.voe_channel_id, &blocks);
- RTC_DCHECK_EQ(0, error);
- for (const webrtc::ReportBlock& block : blocks) {
+ for (const auto& block : channel_proxy_->GetRemoteRTCPReportBlocks()) {
// Lookup report for send ssrc only.
if (block.source_SSRC == stats.local_ssrc) {
stats.packets_lost = block.cumulative_num_packets_lost;
@@ -163,13 +147,13 @@
// Local speech level.
{
unsigned int level = 0;
- error = volume->GetSpeechInputLevelFullRange(level);
+ int error = volume->GetSpeechInputLevelFullRange(level);
RTC_DCHECK_EQ(0, error);
stats.audio_level = static_cast<int32_t>(level);
}
bool echo_metrics_on = false;
- error = processing->GetEcMetricsStatus(echo_metrics_on);
+ int error = processing->GetEcMetricsStatus(echo_metrics_on);
RTC_DCHECK_EQ(0, error);
if (echo_metrics_on) {
// These can also be negative, but in practice -1 is only used to signal
diff --git a/webrtc/audio/audio_send_stream_unittest.cc b/webrtc/audio/audio_send_stream_unittest.cc
index bea8a82..eed97c7 100644
--- a/webrtc/audio/audio_send_stream_unittest.cc
+++ b/webrtc/audio/audio_send_stream_unittest.cc
@@ -58,14 +58,12 @@
EXPECT_CALL(*channel_proxy_, SetRTCPStatus(true)).Times(1);
EXPECT_CALL(*channel_proxy_, SetLocalSSRC(kSsrc)).Times(1);
EXPECT_CALL(*channel_proxy_, SetRTCP_CNAME(StrEq(kCName))).Times(1);
+ EXPECT_CALL(*channel_proxy_,
+ SetSendAbsoluteSenderTimeStatus(true, kAbsSendTimeId)).Times(1);
+ EXPECT_CALL(*channel_proxy_,
+ SetSendAudioLevelIndicationStatus(true, kAudioLevelId)).Times(1);
return channel_proxy_;
}));
- EXPECT_CALL(voice_engine_,
- SetSendAbsoluteSenderTimeStatus(kChannelId, true, kAbsSendTimeId))
- .WillOnce(Return(0));
- EXPECT_CALL(voice_engine_,
- SetSendAudioLevelIndicationStatus(kChannelId, true, kAudioLevelId))
- .WillOnce(Return(0));
stream_config_.voe_channel_id = kChannelId;
stream_config_.rtp.ssrc = kSsrc;
stream_config_.rtp.c_name = kCName;
@@ -80,7 +78,6 @@
void SetupMockForGetStats() {
using testing::DoAll;
- using testing::SetArgPointee;
using testing::SetArgReferee;
std::vector<ReportBlock> report_blocks;
@@ -91,12 +88,14 @@
block.fraction_lost = 0;
report_blocks.push_back(block); // Duplicate SSRC, bad fraction_lost.
- EXPECT_CALL(voice_engine_, GetRTCPStatistics(kChannelId, _))
- .WillRepeatedly(DoAll(SetArgReferee<1>(kCallStats), Return(0)));
+ EXPECT_TRUE(channel_proxy_);
+ EXPECT_CALL(*channel_proxy_, GetRTCPStatistics())
+ .WillRepeatedly(Return(kCallStats));
+ EXPECT_CALL(*channel_proxy_, GetRemoteRTCPReportBlocks())
+ .WillRepeatedly(Return(report_blocks));
+
EXPECT_CALL(voice_engine_, GetSendCodec(kChannelId, _))
.WillRepeatedly(DoAll(SetArgReferee<1>(kCodecInst), Return(0)));
- EXPECT_CALL(voice_engine_, GetRemoteRTCPReportBlocks(kChannelId, _))
- .WillRepeatedly(DoAll(SetArgPointee<1>(report_blocks), Return(0)));
EXPECT_CALL(voice_engine_, GetSpeechInputLevelFullRange(_))
.WillRepeatedly(DoAll(SetArgReferee<0>(kSpeechInputLevel), Return(0)));
EXPECT_CALL(voice_engine_, GetEcMetricsStatus(_))
diff --git a/webrtc/test/mock_voe_channel_proxy.h b/webrtc/test/mock_voe_channel_proxy.h
index d42e29b..401a87a 100644
--- a/webrtc/test/mock_voe_channel_proxy.h
+++ b/webrtc/test/mock_voe_channel_proxy.h
@@ -23,6 +23,16 @@
MOCK_METHOD1(SetRTCPStatus, void(bool enable));
MOCK_METHOD1(SetLocalSSRC, void(uint32_t ssrc));
MOCK_METHOD1(SetRTCP_CNAME, void(const std::string& c_name));
+ MOCK_METHOD2(SetSendAbsoluteSenderTimeStatus, void(bool enable, int id));
+ MOCK_METHOD2(SetSendAudioLevelIndicationStatus, void(bool enable, int id));
+ MOCK_METHOD2(SetReceiveAbsoluteSenderTimeStatus, void(bool enable, int id));
+ MOCK_METHOD2(SetReceiveAudioLevelIndicationStatus, void(bool enable, int id));
+ MOCK_CONST_METHOD0(GetRTCPStatistics, CallStatistics());
+ MOCK_CONST_METHOD0(GetRemoteRTCPReportBlocks, std::vector<ReportBlock>());
+ MOCK_CONST_METHOD0(GetNetworkStatistics, NetworkStatistics());
+ MOCK_CONST_METHOD0(GetDecodingCallStatistics, AudioDecodingCallStats());
+ MOCK_CONST_METHOD0(GetSpeechOutputLevelFullRange, int32_t());
+ MOCK_CONST_METHOD0(GetDelayEstimate, uint32_t());
};
} // namespace test
} // namespace webrtc
diff --git a/webrtc/voice_engine/channel.cc b/webrtc/voice_engine/channel.cc
index 90ac9d0..54aa802 100644
--- a/webrtc/voice_engine/channel.cc
+++ b/webrtc/voice_engine/channel.cc
@@ -3415,6 +3415,13 @@
return true;
}
+uint32_t Channel::GetDelayEstimate() const {
+ int jitter_buffer_delay_ms = 0;
+ int playout_buffer_delay_ms = 0;
+ GetDelayEstimate(&jitter_buffer_delay_ms, &playout_buffer_delay_ms);
+ return jitter_buffer_delay_ms + playout_buffer_delay_ms;
+}
+
int Channel::LeastRequiredDelayMs() const {
return audio_coding_->LeastRequiredDelayMs();
}
diff --git a/webrtc/voice_engine/channel.h b/webrtc/voice_engine/channel.h
index 0e509d2..f26fdb2 100644
--- a/webrtc/voice_engine/channel.h
+++ b/webrtc/voice_engine/channel.h
@@ -279,6 +279,7 @@
// VoEVideoSync
bool GetDelayEstimate(int* jitter_buffer_delay_ms,
int* playout_buffer_delay_ms) const;
+ uint32_t GetDelayEstimate() const;
int LeastRequiredDelayMs() const;
int SetMinimumPlayoutDelay(int delayMs);
int GetPlayoutTimestamp(unsigned int& timestamp);
diff --git a/webrtc/voice_engine/channel_proxy.cc b/webrtc/voice_engine/channel_proxy.cc
index f53db87..614b7b7 100644
--- a/webrtc/voice_engine/channel_proxy.cc
+++ b/webrtc/voice_engine/channel_proxy.cc
@@ -23,22 +23,94 @@
}
void ChannelProxy::SetRTCPStatus(bool enable) {
- RTC_DCHECK(channel_owner_.channel());
- channel_owner_.channel()->SetRTCPStatus(enable);
+ channel()->SetRTCPStatus(enable);
}
void ChannelProxy::SetLocalSSRC(uint32_t ssrc) {
- RTC_DCHECK(channel_owner_.channel());
- int error = channel_owner_.channel()->SetLocalSSRC(ssrc);
+ RTC_DCHECK(thread_checker_.CalledOnValidThread());
+ int error = channel()->SetLocalSSRC(ssrc);
RTC_DCHECK_EQ(0, error);
}
void ChannelProxy::SetRTCP_CNAME(const std::string& c_name) {
+ RTC_DCHECK(thread_checker_.CalledOnValidThread());
// Note: VoERTP_RTCP::SetRTCP_CNAME() accepts a char[256] array.
std::string c_name_limited = c_name.substr(0, 255);
- RTC_DCHECK(channel_owner_.channel());
- int error = channel_owner_.channel()->SetRTCP_CNAME(c_name_limited.c_str());
+ int error = channel()->SetRTCP_CNAME(c_name_limited.c_str());
RTC_DCHECK_EQ(0, error);
}
+
+void ChannelProxy::SetSendAbsoluteSenderTimeStatus(bool enable, int id) {
+ RTC_DCHECK(thread_checker_.CalledOnValidThread());
+ int error = channel()->SetSendAbsoluteSenderTimeStatus(enable, id);
+ RTC_DCHECK_EQ(0, error);
+}
+
+void ChannelProxy::SetSendAudioLevelIndicationStatus(bool enable, int id) {
+ RTC_DCHECK(thread_checker_.CalledOnValidThread());
+ int error = channel()->SetSendAudioLevelIndicationStatus(enable, id);
+ RTC_DCHECK_EQ(0, error);
+}
+
+void ChannelProxy::SetReceiveAbsoluteSenderTimeStatus(bool enable, int id) {
+ RTC_DCHECK(thread_checker_.CalledOnValidThread());
+ int error = channel()->SetReceiveAbsoluteSenderTimeStatus(enable, id);
+ RTC_DCHECK_EQ(0, error);
+}
+
+void ChannelProxy::SetReceiveAudioLevelIndicationStatus(bool enable, int id) {
+ RTC_DCHECK(thread_checker_.CalledOnValidThread());
+ int error = channel()->SetReceiveAudioLevelIndicationStatus(enable, id);
+ RTC_DCHECK_EQ(0, error);
+}
+
+CallStatistics ChannelProxy::GetRTCPStatistics() const {
+ RTC_DCHECK(thread_checker_.CalledOnValidThread());
+ CallStatistics stats = {0};
+ int error = channel()->GetRTPStatistics(stats);
+ RTC_DCHECK_EQ(0, error);
+ return stats;
+}
+
+std::vector<ReportBlock> ChannelProxy::GetRemoteRTCPReportBlocks() const {
+ RTC_DCHECK(thread_checker_.CalledOnValidThread());
+ std::vector<webrtc::ReportBlock> blocks;
+ int error = channel()->GetRemoteRTCPReportBlocks(&blocks);
+ RTC_DCHECK_EQ(0, error);
+ return blocks;
+}
+
+NetworkStatistics ChannelProxy::GetNetworkStatistics() const {
+ RTC_DCHECK(thread_checker_.CalledOnValidThread());
+ NetworkStatistics stats = {0};
+ int error = channel()->GetNetworkStatistics(stats);
+ RTC_DCHECK_EQ(0, error);
+ return stats;
+}
+
+AudioDecodingCallStats ChannelProxy::GetDecodingCallStatistics() const {
+ RTC_DCHECK(thread_checker_.CalledOnValidThread());
+ AudioDecodingCallStats stats;
+ channel()->GetDecodingCallStatistics(&stats);
+ return stats;
+}
+
+int32_t ChannelProxy::GetSpeechOutputLevelFullRange() const {
+ RTC_DCHECK(thread_checker_.CalledOnValidThread());
+ uint32_t level = 0;
+ int error = channel()->GetSpeechOutputLevelFullRange(level);
+ RTC_DCHECK_EQ(0, error);
+ return static_cast<int32_t>(level);
+}
+
+uint32_t ChannelProxy::GetDelayEstimate() const {
+ RTC_DCHECK(thread_checker_.CalledOnValidThread());
+ return channel()->GetDelayEstimate();
+}
+
+Channel* ChannelProxy::channel() const {
+ RTC_DCHECK(channel_owner_.channel());
+ return channel_owner_.channel();
+}
} // namespace voe
} // namespace webrtc
diff --git a/webrtc/voice_engine/channel_proxy.h b/webrtc/voice_engine/channel_proxy.h
index 5a7ead2..6b916a5 100644
--- a/webrtc/voice_engine/channel_proxy.h
+++ b/webrtc/voice_engine/channel_proxy.h
@@ -11,13 +11,18 @@
#ifndef WEBRTC_VOICE_ENGINE_CHANNEL_PROXY_H_
#define WEBRTC_VOICE_ENGINE_CHANNEL_PROXY_H_
+#include "webrtc/base/thread_checker.h"
#include "webrtc/voice_engine/channel_manager.h"
+#include "webrtc/voice_engine/include/voe_rtp_rtcp.h"
#include <string>
+#include <vector>
namespace webrtc {
namespace voe {
+class Channel;
+
// This class provides the "view" of a voe::Channel that we need to implement
// webrtc::AudioSendStream and webrtc::AudioReceiveStream. It serves two
// purposes:
@@ -34,8 +39,22 @@
virtual void SetRTCPStatus(bool enable);
virtual void SetLocalSSRC(uint32_t ssrc);
virtual void SetRTCP_CNAME(const std::string& c_name);
+ virtual void SetSendAbsoluteSenderTimeStatus(bool enable, int id);
+ virtual void SetSendAudioLevelIndicationStatus(bool enable, int id);
+ virtual void SetReceiveAbsoluteSenderTimeStatus(bool enable, int id);
+ virtual void SetReceiveAudioLevelIndicationStatus(bool enable, int id);
+
+ virtual CallStatistics GetRTCPStatistics() const;
+ virtual std::vector<ReportBlock> GetRemoteRTCPReportBlocks() const;
+ virtual NetworkStatistics GetNetworkStatistics() const;
+ virtual AudioDecodingCallStats GetDecodingCallStatistics() const;
+ virtual int32_t GetSpeechOutputLevelFullRange() const;
+ virtual uint32_t GetDelayEstimate() const;
private:
+ Channel* channel() const;
+
+ rtc::ThreadChecker thread_checker_;
ChannelOwner channel_owner_;
};
} // namespace voe