Make use of new APM statistics interface.

Updates GetStats() function in AudioSendStream to use the new GetStatistics function in APM instead of the corresponding VoE functions.

BUG=webrtc:6525

Review-Url: https://codereview.webrtc.org/2463813002
Cr-Commit-Position: refs/heads/master@{#15065}
diff --git a/webrtc/audio/DEPS b/webrtc/audio/DEPS
index 66f66f4..476d463 100644
--- a/webrtc/audio/DEPS
+++ b/webrtc/audio/DEPS
@@ -4,6 +4,7 @@
   "+webrtc/modules/audio_coding/codecs/mock",
   "+webrtc/call",
   "+webrtc/logging/rtc_event_log",
+  "+webrtc/modules/audio_processing/include",
   "+webrtc/modules/bitrate_controller",
   "+webrtc/modules/congestion_controller",
   "+webrtc/modules/pacing",
diff --git a/webrtc/audio/audio_send_stream.cc b/webrtc/audio/audio_send_stream.cc
index 70bb6a9..a96eaf8 100644
--- a/webrtc/audio/audio_send_stream.cc
+++ b/webrtc/audio/audio_send_stream.cc
@@ -197,34 +197,16 @@
     stats.audio_level = static_cast<int32_t>(level);
   }
 
-  bool echo_metrics_on = false;
-  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
-    // insufficient data, since the resolution is limited to multiples of 4 ms.
-    int median = -1;
-    int std = -1;
-    float dummy = 0.0f;
-    error = processing->GetEcDelayMetrics(median, std, dummy);
-    RTC_DCHECK_EQ(0, error);
-    stats.echo_delay_median_ms = median;
-    stats.echo_delay_std_ms = std;
-
-    // These can take on valid negative values, so use the lowest possible level
-    // as default rather than -1.
-    int erl = -100;
-    int erle = -100;
-    int dummy1 = 0;
-    int dummy2 = 0;
-    error = processing->GetEchoMetrics(erl, erle, dummy1, dummy2);
-    RTC_DCHECK_EQ(0, error);
-    stats.echo_return_loss = erl;
-    stats.echo_return_loss_enhancement = erle;
-  }
-
-  // TODO(ivoc): Hook this up to the residual echo detector.
-  stats.residual_echo_likelihood = 0.0f;
+  ScopedVoEInterface<VoEBase> base(voice_engine());
+  RTC_DCHECK(base->audio_processing());
+  auto audio_processing_stats = base->audio_processing()->GetStatistics();
+  stats.echo_delay_median_ms = audio_processing_stats.delay_median;
+  stats.echo_delay_std_ms = audio_processing_stats.delay_standard_deviation;
+  stats.echo_return_loss = audio_processing_stats.echo_return_loss.instant();
+  stats.echo_return_loss_enhancement =
+      audio_processing_stats.echo_return_loss_enhancement.instant();
+  stats.residual_echo_likelihood =
+      audio_processing_stats.residual_echo_likelihood;
 
   internal::AudioState* audio_state =
       static_cast<internal::AudioState*>(audio_state_.get());
diff --git a/webrtc/audio/audio_send_stream_unittest.cc b/webrtc/audio/audio_send_stream_unittest.cc
index fc7bbb0..2cb1275 100644
--- a/webrtc/audio/audio_send_stream_unittest.cc
+++ b/webrtc/audio/audio_send_stream_unittest.cc
@@ -16,6 +16,7 @@
 #include "webrtc/audio/conversion.h"
 #include "webrtc/base/task_queue.h"
 #include "webrtc/logging/rtc_event_log/mock/mock_rtc_event_log.h"
+#include "webrtc/modules/audio_processing/include/mock_audio_processing.h"
 #include "webrtc/modules/congestion_controller/include/congestion_controller.h"
 #include "webrtc/modules/congestion_controller/include/mock/mock_congestion_controller.h"
 #include "webrtc/modules/pacing/paced_sender.h"
@@ -40,7 +41,7 @@
 const int kEchoDelayStdDev = -3;
 const int kEchoReturnLoss = -65;
 const int kEchoReturnLossEnhancement = 101;
-const float kResidualEchoLikelihood = 0.0f;
+const float kResidualEchoLikelihood = -1.0f;
 const unsigned int kSpeechInputLevel = 96;
 const CallStatistics kCallStats = {
     1345,  1678,  1901, 1234,  112, 13456, 17890, 1567, -1890, -1123};
@@ -182,15 +183,21 @@
         .WillRepeatedly(DoAll(SetArgReferee<1>(kIsacCodec), Return(0)));
     EXPECT_CALL(voice_engine_, GetSpeechInputLevelFullRange(_))
         .WillRepeatedly(DoAll(SetArgReferee<0>(kSpeechInputLevel), Return(0)));
-    EXPECT_CALL(voice_engine_, GetEcMetricsStatus(_))
-        .WillRepeatedly(DoAll(SetArgReferee<0>(true), Return(0)));
-    EXPECT_CALL(voice_engine_, GetEchoMetrics(_, _, _, _))
-        .WillRepeatedly(DoAll(SetArgReferee<0>(kEchoReturnLoss),
-                        SetArgReferee<1>(kEchoReturnLossEnhancement),
-                        Return(0)));
-    EXPECT_CALL(voice_engine_, GetEcDelayMetrics(_, _, _))
-        .WillRepeatedly(DoAll(SetArgReferee<0>(kEchoDelayMedian),
-                        SetArgReferee<1>(kEchoDelayStdDev), Return(0)));
+    EXPECT_CALL(voice_engine_, audio_processing())
+        .WillRepeatedly(Return(&audio_processing_));
+
+    // We have to set the instantaneous value, the average, min and max. We only
+    // care about the instantaneous value, so we set all to the same value.
+    audio_processing_stats_.echo_return_loss.Set(
+        kEchoReturnLoss, kEchoReturnLoss, kEchoReturnLoss, kEchoReturnLoss);
+    audio_processing_stats_.echo_return_loss_enhancement.Set(
+        kEchoReturnLossEnhancement, kEchoReturnLossEnhancement,
+        kEchoReturnLossEnhancement, kEchoReturnLossEnhancement);
+    audio_processing_stats_.delay_median = kEchoDelayMedian;
+    audio_processing_stats_.delay_standard_deviation = kEchoDelayStdDev;
+
+    EXPECT_CALL(audio_processing_, GetStatistics())
+        .WillRepeatedly(Return(audio_processing_stats_));
   }
 
  private:
@@ -201,6 +208,8 @@
   testing::StrictMock<MockVoEChannelProxy>* channel_proxy_ = nullptr;
   testing::NiceMock<MockCongestionObserver> bitrate_observer_;
   testing::NiceMock<MockRemoteBitrateObserver> remote_bitrate_observer_;
+  MockAudioProcessing audio_processing_;
+  AudioProcessing::AudioProcessingStatistics audio_processing_stats_;
   CongestionController congestion_controller_;
   MockRtcEventLog event_log_;
   testing::NiceMock<MockLimitObserver> limit_observer_;
diff --git a/webrtc/modules/audio_processing/include/audio_processing.h b/webrtc/modules/audio_processing/include/audio_processing.h
index 3225a4c..c899e80 100644
--- a/webrtc/modules/audio_processing/include/audio_processing.h
+++ b/webrtc/modules/audio_processing/include/audio_processing.h
@@ -486,10 +486,6 @@
       Set(other.instant, other.average, other.maximum, other.minimum);
     }
     void Set(float instant, float average, float maximum, float minimum) {
-      RTC_DCHECK_LE(instant, maximum);
-      RTC_DCHECK_GE(instant, minimum);
-      RTC_DCHECK_LE(average, maximum);
-      RTC_DCHECK_GE(average, minimum);
       instant_ = instant;
       average_ = average;
       maximum_ = maximum;