Add a Config parameter to AudioProcessing::Create().

Also add a parameter-less version; the (int) version is deprecated and
should be removed.

TBR=aluebs,bjornv
BUG=2844

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

git-svn-id: http://webrtc.googlecode.com/svn/trunk@5431 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 6a89b9c..8b9044f 100644
--- a/webrtc/modules/audio_processing/audio_processing_impl.cc
+++ b/webrtc/modules/audio_processing/audio_processing_impl.cc
@@ -53,7 +53,16 @@
 COMPILE_ASSERT(AudioProcessing::kNoError == 0, no_error_must_be_zero);
 
 AudioProcessing* AudioProcessing::Create(int id) {
-  AudioProcessingImpl* apm = new AudioProcessingImpl();
+  return Create();
+}
+
+AudioProcessing* AudioProcessing::Create() {
+  Config config;
+  return Create(config);
+}
+
+AudioProcessing* AudioProcessing::Create(const Config& config) {
+  AudioProcessingImpl* apm = new AudioProcessingImpl(config);
   if (apm->Initialize() != kNoError) {
     delete apm;
     apm = NULL;
@@ -65,7 +74,7 @@
 int32_t AudioProcessing::TimeUntilNextProcess() { return -1; }
 int32_t AudioProcessing::Process() { return -1; }
 
-AudioProcessingImpl::AudioProcessingImpl()
+AudioProcessingImpl::AudioProcessingImpl(const Config& config)
     : echo_cancellation_(NULL),
       echo_control_mobile_(NULL),
       gain_control_(NULL),
@@ -109,6 +118,8 @@
 
   voice_detection_ = new VoiceDetectionImpl(this);
   component_list_.push_back(voice_detection_);
+
+  SetExtraOptions(config);
 }
 
 AudioProcessingImpl::~AudioProcessingImpl() {
@@ -193,6 +204,7 @@
 }
 
 void AudioProcessingImpl::SetExtraOptions(const Config& config) {
+  CriticalSectionScoped crit_scoped(crit_);
   std::list<ProcessingComponent*>::iterator it;
   for (it = component_list_.begin(); it != component_list_.end(); ++it)
     (*it)->SetExtraOptions(config);
diff --git a/webrtc/modules/audio_processing/audio_processing_impl.h b/webrtc/modules/audio_processing/audio_processing_impl.h
index caf93dc..249b789 100644
--- a/webrtc/modules/audio_processing/audio_processing_impl.h
+++ b/webrtc/modules/audio_processing/audio_processing_impl.h
@@ -47,7 +47,7 @@
     kSampleRate32kHz = 32000
   };
 
-  AudioProcessingImpl();
+  explicit AudioProcessingImpl(const Config& config);
   virtual ~AudioProcessingImpl();
 
   CriticalSectionWrapper* crit() const;
diff --git a/webrtc/modules/audio_processing/audio_processing_impl_unittest.cc b/webrtc/modules/audio_processing/audio_processing_impl_unittest.cc
index 75b9230..a10fd5e 100644
--- a/webrtc/modules/audio_processing/audio_processing_impl_unittest.cc
+++ b/webrtc/modules/audio_processing/audio_processing_impl_unittest.cc
@@ -22,13 +22,16 @@
 
 class MockInitialize : public AudioProcessingImpl {
  public:
-  MOCK_METHOD0(InitializeLocked, int());
+  explicit MockInitialize(const Config& config) : AudioProcessingImpl(config) {
+  }
 
+  MOCK_METHOD0(InitializeLocked, int());
   int RealInitializeLocked() { return AudioProcessingImpl::InitializeLocked(); }
 };
 
 TEST(AudioProcessingImplTest, AudioParameterChangeTriggersInit) {
-  MockInitialize mock;
+  Config config;
+  MockInitialize mock(config);
   ON_CALL(mock, InitializeLocked())
       .WillByDefault(Invoke(&mock, &MockInitialize::RealInitializeLocked));
 
diff --git a/webrtc/modules/audio_processing/include/audio_processing.h b/webrtc/modules/audio_processing/include/audio_processing.h
index 6ed23f4..edb9962 100644
--- a/webrtc/modules/audio_processing/include/audio_processing.h
+++ b/webrtc/modules/audio_processing/include/audio_processing.h
@@ -134,6 +134,9 @@
   // typically be one instance for the near-end stream, and additional instances
   // for each far-end stream which requires processing. On the server-side,
   // this would typically be one instance for every incoming stream.
+  static AudioProcessing* Create();
+  static AudioProcessing* Create(const Config& config);
+  // TODO(ajm): Deprecated; remove all calls to it.
   static AudioProcessing* Create(int id);
   virtual ~AudioProcessing() {}