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