Add Config option to enable 48kHz support in AudioProcessing

BUG=webrtc:3146
R=andrew@webrtc.org, bjornv@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/45389004

Cr-Commit-Position: refs/heads/master@{#8563}
git-svn-id: http://webrtc.googlecode.com/svn/trunk@8563 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/modules/audio_processing/audio_processing_impl.cc b/webrtc/modules/audio_processing/audio_processing_impl.cc
index 091a557..5029bc7 100644
--- a/webrtc/modules/audio_processing/audio_processing_impl.cc
+++ b/webrtc/modules/audio_processing/audio_processing_impl.cc
@@ -191,7 +191,8 @@
       transient_suppressor_enabled_(config.Get<ExperimentalNs>().enabled),
       beamformer_enabled_(config.Get<Beamforming>().enabled),
       beamformer_(beamformer),
-      array_geometry_(config.Get<Beamforming>().array_geometry) {
+      array_geometry_(config.Get<Beamforming>().array_geometry),
+      supports_48kHz_(config.Get<AudioProcessing48kHzSupport>().enabled) {
   echo_cancellation_ = new EchoCancellationImpl(this, crit_);
   component_list_.push_back(echo_cancellation_);
 
@@ -353,7 +354,9 @@
   // We process at the closest native rate >= min(input rate, output rate)...
   int min_proc_rate = std::min(fwd_in_format_.rate(), fwd_out_format_.rate());
   int fwd_proc_rate;
-  if (min_proc_rate > kSampleRate16kHz) {
+  if (supports_48kHz_ && min_proc_rate > kSampleRate32kHz) {
+    fwd_proc_rate = kSampleRate48kHz;
+  } else if (min_proc_rate > kSampleRate16kHz) {
     fwd_proc_rate = kSampleRate32kHz;
   } else if (min_proc_rate > kSampleRate8kHz) {
     fwd_proc_rate = kSampleRate16kHz;
diff --git a/webrtc/modules/audio_processing/audio_processing_impl.h b/webrtc/modules/audio_processing/audio_processing_impl.h
index 9d99bf0..d82ef02 100644
--- a/webrtc/modules/audio_processing/audio_processing_impl.h
+++ b/webrtc/modules/audio_processing/audio_processing_impl.h
@@ -222,6 +222,8 @@
   const bool beamformer_enabled_;
   rtc::scoped_ptr<Beamformer> beamformer_;
   const std::vector<Point> array_geometry_;
+
+  const bool supports_48kHz_;
 };
 
 }  // namespace webrtc
diff --git a/webrtc/modules/audio_processing/include/audio_processing.h b/webrtc/modules/audio_processing/include/audio_processing.h
index 3715b34..4004a62 100644
--- a/webrtc/modules/audio_processing/include/audio_processing.h
+++ b/webrtc/modules/audio_processing/include/audio_processing.h
@@ -105,6 +105,15 @@
   const std::vector<Point> array_geometry;
 };
 
+// Use to enable 48kHz support in audio processing. Must be provided through the
+// constructor. It will have no impact if used with
+// AudioProcessing::SetExtraOptions().
+struct AudioProcessing48kHzSupport {
+  AudioProcessing48kHzSupport() : enabled(false) {}
+  explicit AudioProcessing48kHzSupport(bool enabled) : enabled(enabled) {}
+  bool enabled;
+};
+
 static const int kAudioProcMaxNativeSampleRateHz = 32000;
 
 // The Audio Processing Module (APM) provides a collection of voice processing