Reland "Add ability to state whether the APM output will be used"

This is a reland of 8be2f201ba8790501f6f3fa39f00017f02fca46d

Original change's description:
> Add ability to state whether the APM output will be used
> 
> This CL adds the ability for the surrounding code to state that the
> APM output will not be used. The intended usecase for this is to allow
> APM to run at a lower complexity when the endpoint is muted.
> When APM has been informed that the output will not be used, it can
> turn off code that is needed only for ensuring that the output audio
> will sound good.
> 
> Bug: b/154437967,b/163802450
> Change-Id: I8e22989e35354372e96191d15da44beb9d1b26ae
> Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/181200
> Reviewed-by: Alessio Bazzica <alessiob@webrtc.org>
> Commit-Queue: Per Åhgren <peah@webrtc.org>
> Cr-Commit-Position: refs/heads/master@{#31949}

Bug: b/154437967
Bug: b/163802450
Change-Id: Ia77a9e43f913929d1afa72212f1ea6c192d0e519
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/181887
Reviewed-by: Alessio Bazzica <alessiob@webrtc.org>
Commit-Queue: Per Åhgren <peah@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#31957}
diff --git a/modules/audio_processing/aec_dump/aec_dump_impl.cc b/modules/audio_processing/aec_dump/aec_dump_impl.cc
index 1299738..18f8572 100644
--- a/modules/audio_processing/aec_dump/aec_dump_impl.cc
+++ b/modules/audio_processing/aec_dump/aec_dump_impl.cc
@@ -203,6 +203,12 @@
       setting->set_capture_fixed_post_gain(x);
       break;
     }
+    case AudioProcessing::RuntimeSetting::Type::kCaptureOutputUsed: {
+      bool x;
+      runtime_setting.GetBool(&x);
+      setting->set_capture_output_used(x);
+      break;
+    }
     case AudioProcessing::RuntimeSetting::Type::kPlayoutVolumeChange: {
       int x;
       runtime_setting.GetInt(&x);
diff --git a/modules/audio_processing/audio_processing_impl.cc b/modules/audio_processing/audio_processing_impl.cc
index b155bdb..485022a 100644
--- a/modules/audio_processing/audio_processing_impl.cc
+++ b/modules/audio_processing/audio_processing_impl.cc
@@ -705,6 +705,7 @@
     case RuntimeSetting::Type::kCapturePreGain:
     case RuntimeSetting::Type::kCaptureCompressionGain:
     case RuntimeSetting::Type::kCaptureFixedPostGain:
+    case RuntimeSetting::Type::kCaptureOutputUsed:
       capture_runtime_settings_enqueuer_.Enqueue(setting);
       return;
     case RuntimeSetting::Type::kPlayoutVolumeChange:
@@ -865,6 +866,10 @@
       case RuntimeSetting::Type::kNotSpecified:
         RTC_NOTREACHED();
         break;
+      case RuntimeSetting::Type::kCaptureOutputUsed:
+        // TODO(b/154437967): Add support for reducing complexity when it is
+        // known that the capture output will not be used.
+        break;
     }
   }
 }
@@ -886,6 +891,7 @@
       case RuntimeSetting::Type::kCapturePreGain:          // fall-through
       case RuntimeSetting::Type::kCaptureCompressionGain:  // fall-through
       case RuntimeSetting::Type::kCaptureFixedPostGain:    // fall-through
+      case RuntimeSetting::Type::kCaptureOutputUsed:       // fall-through
       case RuntimeSetting::Type::kNotSpecified:
         RTC_NOTREACHED();
         break;
diff --git a/modules/audio_processing/debug.proto b/modules/audio_processing/debug.proto
index af5e22c..07cce23 100644
--- a/modules/audio_processing/debug.proto
+++ b/modules/audio_processing/debug.proto
@@ -91,6 +91,7 @@
   optional float capture_fixed_post_gain = 3;
   optional int32 playout_volume_change = 4;
   optional PlayoutAudioDeviceInfo playout_audio_device_change = 5;
+  optional bool capture_output_used = 6;
 }
 
 message Event {
diff --git a/modules/audio_processing/include/audio_processing.h b/modules/audio_processing/include/audio_processing.h
index d84318f..9e2d6dc 100644
--- a/modules/audio_processing/include/audio_processing.h
+++ b/modules/audio_processing/include/audio_processing.h
@@ -384,7 +384,8 @@
       kCaptureFixedPostGain,
       kPlayoutVolumeChange,
       kCustomRenderProcessingRuntimeSetting,
-      kPlayoutAudioDeviceChange
+      kPlayoutAudioDeviceChange,
+      kCaptureOutputUsed
     };
 
     // Play-out audio device properties.
@@ -434,6 +435,10 @@
       return {Type::kCustomRenderProcessingRuntimeSetting, payload};
     }
 
+    static RuntimeSetting CreateCaptureOutputUsedSetting(bool payload) {
+      return {Type::kCaptureOutputUsed, payload};
+    }
+
     Type type() const { return type_; }
     // Getters do not return a value but instead modify the argument to protect
     // from implicit casting.
@@ -445,6 +450,10 @@
       RTC_DCHECK(value);
       *value = value_.int_value;
     }
+    void GetBool(bool* value) const {
+      RTC_DCHECK(value);
+      *value = value_.bool_value;
+    }
     void GetPlayoutAudioDeviceInfo(PlayoutAudioDeviceInfo* value) const {
       RTC_DCHECK(value);
       *value = value_.playout_audio_device_info;
@@ -463,6 +472,7 @@
       U(PlayoutAudioDeviceInfo value) : playout_audio_device_info(value) {}
       float float_value;
       int int_value;
+      bool bool_value;
       PlayoutAudioDeviceInfo playout_audio_device_info;
     } value_;
   };
diff --git a/modules/audio_processing/test/aec_dump_based_simulator.cc b/modules/audio_processing/test/aec_dump_based_simulator.cc
index f5bd645..49372a9 100644
--- a/modules/audio_processing/test/aec_dump_based_simulator.cc
+++ b/modules/audio_processing/test/aec_dump_based_simulator.cc
@@ -544,6 +544,10 @@
         AudioProcessing::RuntimeSetting::CreatePlayoutAudioDeviceChange(
             {msg.playout_audio_device_change().id(),
              msg.playout_audio_device_change().max_volume()}));
+  } else if (msg.has_capture_output_used()) {
+    ap_->SetRuntimeSetting(
+        AudioProcessing::RuntimeSetting::CreateCaptureOutputUsedSetting(
+            msg.capture_output_used()));
   }
 }
 
diff --git a/modules/audio_processing/test/runtime_setting_util.cc b/modules/audio_processing/test/runtime_setting_util.cc
index 8876187..4899d2d 100644
--- a/modules/audio_processing/test/runtime_setting_util.cc
+++ b/modules/audio_processing/test/runtime_setting_util.cc
@@ -41,6 +41,10 @@
         AudioProcessing::RuntimeSetting::CreatePlayoutAudioDeviceChange(
             {setting.playout_audio_device_change().id(),
              setting.playout_audio_device_change().max_volume()}));
+  } else if (setting.has_capture_output_used()) {
+    apm->SetRuntimeSetting(
+        AudioProcessing::RuntimeSetting::CreateCaptureOutputUsedSetting(
+            setting.capture_output_used()));
   }
 }
 }  // namespace webrtc