Propagate muted parameter to VoE::Channel

Deleted the temporary ACM method without the muted parameter, and had
to modify several tests for this. The muted parameter is not yet propagated to the AudioConferenceMixer; this is the next step.

BUG=webrtc:5609
TBR=perkj@webrtc.org

Review-Url: https://codereview.webrtc.org/1985743002
Cr-Original-Commit-Position: refs/heads/master@{#12779}
Cr-Mirrored-From: https://chromium.googlesource.com/external/webrtc
Cr-Mirrored-Commit: d4ccb00b9e636cc8b4297db5555654b2546681e0
diff --git a/modules/audio_coding/acm2/audio_coding_module_unittest_oldapi.cc b/modules/audio_coding/acm2/audio_coding_module_unittest_oldapi.cc
index a2ef5b0..470f690 100644
--- a/modules/audio_coding/acm2/audio_coding_module_unittest_oldapi.cc
+++ b/modules/audio_coding/acm2/audio_coding_module_unittest_oldapi.cc
@@ -205,7 +205,9 @@
 
   virtual void PullAudio() {
     AudioFrame audio_frame;
-    ASSERT_EQ(0, acm_->PlayoutData10Ms(-1, &audio_frame));
+    bool muted;
+    ASSERT_EQ(0, acm_->PlayoutData10Ms(-1, &audio_frame, &muted));
+    ASSERT_FALSE(muted);
   }
 
   virtual void InsertAudio() {
@@ -296,7 +298,9 @@
 TEST_F(AudioCodingModuleTestOldApi, VerifyOutputFrame) {
   AudioFrame audio_frame;
   const int kSampleRateHz = 32000;
-  EXPECT_EQ(0, acm_->PlayoutData10Ms(kSampleRateHz, &audio_frame));
+  bool muted;
+  EXPECT_EQ(0, acm_->PlayoutData10Ms(kSampleRateHz, &audio_frame, &muted));
+  ASSERT_FALSE(muted);
   EXPECT_EQ(id_, audio_frame.id_);
   EXPECT_EQ(0u, audio_frame.timestamp_);
   EXPECT_GT(audio_frame.num_channels_, 0u);
@@ -307,7 +311,8 @@
 
 TEST_F(AudioCodingModuleTestOldApi, FailOnZeroDesiredFrequency) {
   AudioFrame audio_frame;
-  EXPECT_EQ(-1, acm_->PlayoutData10Ms(0, &audio_frame));
+  bool muted;
+  EXPECT_EQ(-1, acm_->PlayoutData10Ms(0, &audio_frame, &muted));
 }
 
 // Checks that the transport callback is invoked once for each speech packet.
@@ -806,8 +811,13 @@
     // Pull audio.
     for (int i = 0; i < rtc::CheckedDivExact(kPacketSizeMs, 10); ++i) {
       AudioFrame audio_frame;
+      bool muted;
       EXPECT_EQ(0, acm_->PlayoutData10Ms(-1 /* default output frequency */,
-                                         &audio_frame));
+                                         &audio_frame, &muted));
+      if (muted) {
+        ADD_FAILURE();
+        return false;
+      }
       fake_clock_->AdvanceTimeMilliseconds(10);
     }
     rtp_utility_->Forward(&rtp_header_);
diff --git a/modules/audio_coding/test/APITest.cc b/modules/audio_coding/test/APITest.cc
index 25bacfd..833398a 100644
--- a/modules/audio_coding/test/APITest.cc
+++ b/modules/audio_coding/test/APITest.cc
@@ -323,7 +323,8 @@
 bool APITest::PullAudioRunA() {
   _pullEventA->Wait(100);
   AudioFrame audioFrame;
-  if (_acmA->PlayoutData10Ms(_outFreqHzA, &audioFrame) < 0) {
+  bool muted;
+  if (_acmA->PlayoutData10Ms(_outFreqHzA, &audioFrame, &muted) < 0) {
     bool thereIsDecoder;
     {
       ReadLockScoped rl(_apiTestRWLock);
@@ -343,7 +344,8 @@
 bool APITest::PullAudioRunB() {
   _pullEventB->Wait(100);
   AudioFrame audioFrame;
-  if (_acmB->PlayoutData10Ms(_outFreqHzB, &audioFrame) < 0) {
+  bool muted;
+  if (_acmB->PlayoutData10Ms(_outFreqHzB, &audioFrame, &muted) < 0) {
     bool thereIsDecoder;
     {
       ReadLockScoped rl(_apiTestRWLock);
diff --git a/modules/audio_coding/test/EncodeDecodeTest.cc b/modules/audio_coding/test/EncodeDecodeTest.cc
index e063224..7245023 100644
--- a/modules/audio_coding/test/EncodeDecodeTest.cc
+++ b/modules/audio_coding/test/EncodeDecodeTest.cc
@@ -208,8 +208,12 @@
 
 bool Receiver::PlayoutData() {
   AudioFrame audioFrame;
-
-  int32_t ok =_acm->PlayoutData10Ms(_frequency, &audioFrame);
+  bool muted;
+  int32_t ok = _acm->PlayoutData10Ms(_frequency, &audioFrame, &muted);
+  if (muted) {
+    ADD_FAILURE();
+    return false;
+  }
   EXPECT_EQ(0, ok);
   if (ok < 0){
     return false;
diff --git a/modules/audio_coding/test/TestAllCodecs.cc b/modules/audio_coding/test/TestAllCodecs.cc
index bacfd37..80a0464 100644
--- a/modules/audio_coding/test/TestAllCodecs.cc
+++ b/modules/audio_coding/test/TestAllCodecs.cc
@@ -452,7 +452,9 @@
     }
 
     // Run received side of ACM.
-    CHECK_ERROR(acm_b_->PlayoutData10Ms(out_freq_hz, &audio_frame));
+    bool muted;
+    CHECK_ERROR(acm_b_->PlayoutData10Ms(out_freq_hz, &audio_frame, &muted));
+    ASSERT_FALSE(muted);
 
     // Write output speech to file.
     outfile_b_.Write10MsData(audio_frame.data_,
diff --git a/modules/audio_coding/test/TestRedFec.cc b/modules/audio_coding/test/TestRedFec.cc
index a1bdc04..24cda11 100644
--- a/modules/audio_coding/test/TestRedFec.cc
+++ b/modules/audio_coding/test/TestRedFec.cc
@@ -461,7 +461,9 @@
   while (!_inFileA.EndOfFile()) {
     EXPECT_GT(_inFileA.Read10MsData(audioFrame), 0);
     EXPECT_GE(_acmA->Add10MsData(audioFrame), 0);
-    EXPECT_EQ(0, _acmB->PlayoutData10Ms(outFreqHzB, &audioFrame));
+    bool muted;
+    EXPECT_EQ(0, _acmB->PlayoutData10Ms(outFreqHzB, &audioFrame, &muted));
+    ASSERT_FALSE(muted);
     _outFileB.Write10MsData(audioFrame.data_, audioFrame.samples_per_channel_);
   }
   _inFileA.Rewind();
diff --git a/modules/audio_coding/test/TestStereo.cc b/modules/audio_coding/test/TestStereo.cc
index 9bf560d..85a2ae2 100644
--- a/modules/audio_coding/test/TestStereo.cc
+++ b/modules/audio_coding/test/TestStereo.cc
@@ -792,7 +792,9 @@
     }
 
     // Run received side of ACM
-    EXPECT_EQ(0, acm_b_->PlayoutData10Ms(out_freq_hz_b, &audio_frame));
+    bool muted;
+    EXPECT_EQ(0, acm_b_->PlayoutData10Ms(out_freq_hz_b, &audio_frame, &muted));
+    ASSERT_FALSE(muted);
 
     // Write output speech to file
     out_file_.Write10MsData(
diff --git a/modules/audio_coding/test/TestVADDTX.cc b/modules/audio_coding/test/TestVADDTX.cc
index 229dc2d..4f53e47c 100644
--- a/modules/audio_coding/test/TestVADDTX.cc
+++ b/modules/audio_coding/test/TestVADDTX.cc
@@ -108,7 +108,9 @@
     audio_frame.timestamp_ = time_stamp;
     time_stamp += frame_size_samples;
     EXPECT_GE(acm_send_->Add10MsData(audio_frame), 0);
-    acm_receive_->PlayoutData10Ms(kOutputFreqHz, &audio_frame);
+    bool muted;
+    acm_receive_->PlayoutData10Ms(kOutputFreqHz, &audio_frame, &muted);
+    ASSERT_FALSE(muted);
     out_file.Write10MsData(audio_frame);
   }
 
diff --git a/modules/audio_coding/test/TwoWayCommunication.cc b/modules/audio_coding/test/TwoWayCommunication.cc
index 161491b..b59ff1f 100644
--- a/modules/audio_coding/test/TwoWayCommunication.cc
+++ b/modules/audio_coding/test/TwoWayCommunication.cc
@@ -261,13 +261,18 @@
 
     EXPECT_GE(_acmB->Add10MsData(audioFrame), 0);
     EXPECT_GE(_acmRefB->Add10MsData(audioFrame), 0);
-    EXPECT_EQ(0, _acmA->PlayoutData10Ms(outFreqHzA, &audioFrame));
+    bool muted;
+    EXPECT_EQ(0, _acmA->PlayoutData10Ms(outFreqHzA, &audioFrame, &muted));
+    ASSERT_FALSE(muted);
     _outFileA.Write10MsData(audioFrame);
-    EXPECT_EQ(0, _acmRefA->PlayoutData10Ms(outFreqHzA, &audioFrame));
+    EXPECT_EQ(0, _acmRefA->PlayoutData10Ms(outFreqHzA, &audioFrame, &muted));
+    ASSERT_FALSE(muted);
     _outFileRefA.Write10MsData(audioFrame);
-    EXPECT_EQ(0, _acmB->PlayoutData10Ms(outFreqHzB, &audioFrame));
+    EXPECT_EQ(0, _acmB->PlayoutData10Ms(outFreqHzB, &audioFrame, &muted));
+    ASSERT_FALSE(muted);
     _outFileB.Write10MsData(audioFrame);
-    EXPECT_EQ(0, _acmRefB->PlayoutData10Ms(outFreqHzB, &audioFrame));
+    EXPECT_EQ(0, _acmRefB->PlayoutData10Ms(outFreqHzB, &audioFrame, &muted));
+    ASSERT_FALSE(muted);
     _outFileRefB.Write10MsData(audioFrame);
 
     // Update time counters each time a second of data has passed.
diff --git a/modules/audio_coding/test/delay_test.cc b/modules/audio_coding/test/delay_test.cc
index 8fa1fb1..50702f9 100644
--- a/modules/audio_coding/test/delay_test.cc
+++ b/modules/audio_coding/test/delay_test.cc
@@ -204,7 +204,10 @@
 
       in_file_a_.Read10MsData(audio_frame);
       ASSERT_GE(acm_a_->Add10MsData(audio_frame), 0);
-      ASSERT_EQ(0, acm_b_->PlayoutData10Ms(out_freq_hz_b, &audio_frame));
+      bool muted;
+      ASSERT_EQ(0,
+                acm_b_->PlayoutData10Ms(out_freq_hz_b, &audio_frame, &muted));
+      RTC_DCHECK(!muted);
       out_file_b_.Write10MsData(
           audio_frame.data_,
           audio_frame.samples_per_channel_ * audio_frame.num_channels_);
diff --git a/modules/audio_coding/test/iSACTest.cc b/modules/audio_coding/test/iSACTest.cc
index abc84b2..f06833c 100644
--- a/modules/audio_coding/test/iSACTest.cc
+++ b/modules/audio_coding/test/iSACTest.cc
@@ -198,9 +198,12 @@
   EXPECT_GT(_inFileA.Read10MsData(audioFrame), 0);
   EXPECT_GE(_acmA->Add10MsData(audioFrame), 0);
   EXPECT_GE(_acmB->Add10MsData(audioFrame), 0);
-  EXPECT_EQ(0, _acmA->PlayoutData10Ms(32000, &audioFrame));
+  bool muted;
+  EXPECT_EQ(0, _acmA->PlayoutData10Ms(32000, &audioFrame, &muted));
+  ASSERT_FALSE(muted);
   _outFileA.Write10MsData(audioFrame);
-  EXPECT_EQ(0, _acmB->PlayoutData10Ms(32000, &audioFrame));
+  EXPECT_EQ(0, _acmB->PlayoutData10Ms(32000, &audioFrame, &muted));
+  ASSERT_FALSE(muted);
   _outFileB.Write10MsData(audioFrame);
 }
 
diff --git a/modules/audio_coding/test/insert_packet_with_timing.cc b/modules/audio_coding/test/insert_packet_with_timing.cc
index 966f4c6..27a8833 100644
--- a/modules/audio_coding/test/insert_packet_with_timing.cc
+++ b/modules/audio_coding/test/insert_packet_with_timing.cc
@@ -141,8 +141,10 @@
     // Is it time to pull audio?
     if (time_to_playout_audio_ms_ == 0) {
       time_to_playout_audio_ms_ = kPlayoutPeriodMs;
+      bool muted;
       receive_acm_->PlayoutData10Ms(static_cast<int>(FLAGS_output_fs_hz),
-                                    &frame_);
+                                    &frame_, &muted);
+      ASSERT_FALSE(muted);
       fwrite(frame_.data_, sizeof(frame_.data_[0]),
              frame_.samples_per_channel_ * frame_.num_channels_, pcm_out_fid_);
       *action |= kAudioPlayedOut;
diff --git a/modules/audio_coding/test/opus_test.cc b/modules/audio_coding/test/opus_test.cc
index 104b5e5..5d25028 100644
--- a/modules/audio_coding/test/opus_test.cc
+++ b/modules/audio_coding/test/opus_test.cc
@@ -336,7 +336,10 @@
     }
 
     // Run received side of ACM.
-    ASSERT_EQ(0, acm_receiver_->PlayoutData10Ms(out_freq_hz_b, &audio_frame));
+    bool muted;
+    ASSERT_EQ(
+        0, acm_receiver_->PlayoutData10Ms(out_freq_hz_b, &audio_frame, &muted));
+    ASSERT_FALSE(muted);
 
     // Write output speech to file.
     out_file_.Write10MsData(
diff --git a/modules/audio_coding/test/target_delay_unittest.cc b/modules/audio_coding/test/target_delay_unittest.cc
index 99c1c2d..5de5bf2 100644
--- a/modules/audio_coding/test/target_delay_unittest.cc
+++ b/modules/audio_coding/test/target_delay_unittest.cc
@@ -150,8 +150,10 @@
   // Pull audio equivalent to the amount of audio in one RTP packet.
   void Pull() {
     AudioFrame frame;
+    bool muted;
     for (int k = 0; k < kNum10msPerFrame; ++k) {  // Pull one frame.
-      ASSERT_EQ(0, acm_->PlayoutData10Ms(-1, &frame));
+      ASSERT_EQ(0, acm_->PlayoutData10Ms(-1, &frame, &muted));
+      ASSERT_FALSE(muted);
       // Had to use ASSERT_TRUE, ASSERT_EQ generated error.
       ASSERT_TRUE(kSampleRateHz == frame.sample_rate_hz_);
       ASSERT_EQ(1u, frame.num_channels_);
diff --git a/modules/utility/source/coder.cc b/modules/utility/source/coder.cc
index 9e43ca8..3c065e7 100644
--- a/modules/utility/source/coder.cc
+++ b/modules/utility/source/coder.cc
@@ -13,9 +13,18 @@
 #include "webrtc/modules/utility/source/coder.h"
 
 namespace webrtc {
+namespace {
+AudioCodingModule::Config GetAcmConfig(uint32_t id) {
+  AudioCodingModule::Config config;
+  // This class does not handle muted output.
+  config.neteq_config.enable_muted_state = false;
+  config.id = id;
+  return config;
+}
+}  // namespace
 
 AudioCoder::AudioCoder(uint32_t instance_id)
-    : acm_(AudioCodingModule::Create(instance_id)),
+    : acm_(AudioCodingModule::Create(GetAcmConfig(instance_id))),
       receive_codec_(),
       encode_timestamp_(0),
       encoded_data_(nullptr),
@@ -54,12 +63,19 @@
       return -1;
     }
   }
-  return acm_->PlayoutData10Ms((uint16_t)samp_freq_hz, &decoded_audio);
+  bool muted;
+  int32_t ret =
+      acm_->PlayoutData10Ms((uint16_t)samp_freq_hz, &decoded_audio, &muted);
+  RTC_DCHECK(!muted);
+  return ret;
 }
 
 int32_t AudioCoder::PlayoutData(AudioFrame& decoded_audio,
                                 uint16_t& samp_freq_hz) {
-  return acm_->PlayoutData10Ms(samp_freq_hz, &decoded_audio);
+  bool muted;
+  int32_t ret = acm_->PlayoutData10Ms(samp_freq_hz, &decoded_audio, &muted);
+  RTC_DCHECK(!muted);
+  return ret;
 }
 
 int32_t AudioCoder::Encode(const AudioFrame& audio,
diff --git a/voice_engine/channel.cc b/voice_engine/channel.cc
index 37b0270..339a6a5 100644
--- a/voice_engine/channel.cc
+++ b/voice_engine/channel.cc
@@ -483,8 +483,9 @@
     event_log_->LogAudioPlayout(ssrc);
   }
   // Get 10ms raw PCM data from the ACM (mixer limits output frequency)
-  if (audio_coding_->PlayoutData10Ms(audioFrame->sample_rate_hz_, audioFrame) ==
-      -1) {
+  bool muted;
+  if (audio_coding_->PlayoutData10Ms(audioFrame->sample_rate_hz_, audioFrame,
+                                     &muted) == -1) {
     WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_instanceId, _channelId),
                  "Channel::GetAudioFrame() PlayoutData10Ms() failed!");
     // In all likelihood, the audio in this frame is garbage. We return an
@@ -493,6 +494,7 @@
     // irrelevant.
     return -1;
   }
+  RTC_DCHECK(!muted);
 
   if (_RxVadDetection) {
     UpdateRxVadDetection(*audioFrame);
@@ -811,6 +813,7 @@
   }
   acm_config.neteq_config.enable_fast_accelerate =
       config.Get<NetEqFastAccelerate>().enabled;
+  acm_config.neteq_config.enable_muted_state = false;
   audio_coding_.reset(AudioCodingModule::Create(acm_config));
 
   _outputAudioLevel.Clear();