Reland (rev 7259) "Convert AcmReceiverTest to new AudioCoding interface"

Was reverted by mistake in 7260. Actual culprit was 7258.

BUG=3520
R=henrik.lundin@webrtc.org

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

git-svn-id: http://webrtc.googlecode.com/svn/trunk/webrtc@7272 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/modules/audio_coding/main/acm2/acm_receiver_unittest.cc b/modules/audio_coding/main/acm2/acm_receiver_unittest.cc
index 94d51b7..9cfef3a 100644
--- a/modules/audio_coding/main/acm2/acm_receiver_unittest.cc
+++ b/modules/audio_coding/main/acm2/acm_receiver_unittest.cc
@@ -47,9 +47,10 @@
         packet_sent_(false),
         last_packet_send_timestamp_(timestamp_),
         last_frame_type_(kFrameEmpty) {
-    AudioCodingModule::Config config;
-    acm_.reset(new AudioCodingModuleImpl(config));
-    receiver_.reset(new AcmReceiver(config));
+    AudioCoding::Config config;
+    config.transport = this;
+    acm_.reset(new AudioCodingImpl(config));
+    receiver_.reset(new AcmReceiver(config.ToOldConfig()));
   }
 
   ~AcmReceiverTest() {}
@@ -61,10 +62,6 @@
       ASSERT_EQ(0, ACMCodecDB::Codec(n, &codecs_[n]));
     }
 
-    acm_->InitializeReceiver();
-    acm_->InitializeSender();
-    acm_->RegisterTransportCallback(this);
-
     rtp_header_.header.sequenceNumber = 0;
     rtp_header_.header.timestamp = 0;
     rtp_header_.header.markerBit = false;
@@ -82,12 +79,12 @@
     CodecInst codec;
     ACMCodecDB::Codec(codec_id, &codec);
     if (timestamp_ == 0) {  // This is the first time inserting audio.
-      ASSERT_EQ(0, acm_->RegisterSendCodec(codec));
+      ASSERT_TRUE(acm_->RegisterSendCodec(codec_id, codec.pltype));
     } else {
-      CodecInst current_codec;
-      ASSERT_EQ(0, acm_->SendCodec(&current_codec));
-      if (!CodecsEqual(codec, current_codec))
-        ASSERT_EQ(0, acm_->RegisterSendCodec(codec));
+      const CodecInst* current_codec = acm_->GetSenderCodecInst();
+      ASSERT_TRUE(current_codec);
+      if (!CodecsEqual(codec, *current_codec))
+        ASSERT_TRUE(acm_->RegisterSendCodec(codec_id, codec.pltype));
     }
     AudioFrame frame;
     // Frame setup according to the codec.
@@ -102,8 +99,7 @@
     while (num_bytes == 0) {
       frame.timestamp_ = timestamp_;
       timestamp_ += frame.samples_per_channel_;
-      ASSERT_EQ(0, acm_->Add10MsData(frame));
-      num_bytes = acm_->Process();
+      num_bytes = acm_->Add10MsAudio(frame);
       ASSERT_GE(num_bytes, 0);
     }
     ASSERT_TRUE(packet_sent_);  // Sanity check.
@@ -151,7 +147,7 @@
 
   scoped_ptr<AcmReceiver> receiver_;
   CodecInst codecs_[ACMCodecDB::kMaxNumCodecs];
-  scoped_ptr<AudioCodingModule> acm_;
+  scoped_ptr<AudioCoding> acm_;
   WebRtcRTPHeader rtp_header_;
   uint32_t timestamp_;
   bool packet_sent_;  // Set when SendData is called reset when inserting audio.
@@ -307,7 +303,7 @@
   // Register CNG at sender side.
   int n = 0;
   while (kCngId[n] > 0) {
-    ASSERT_EQ(0, acm_->RegisterSendCodec(codecs_[kCngId[n]]));
+    ASSERT_TRUE(acm_->RegisterSendCodec(kCngId[n], codecs_[kCngId[n]].pltype));
     ++n;
   }
 
@@ -316,7 +312,7 @@
   EXPECT_EQ(-1, receiver_->LastAudioCodec(&codec));
 
   // Start with sending DTX.
-  ASSERT_EQ(0, acm_->SetVAD(true, true, VADVeryAggr));
+  ASSERT_TRUE(acm_->SetVad(true, true, VADVeryAggr));
   packet_sent_ = false;
   InsertOnePacketOfSilence(kCodecId[0]);  // Enough to test with one codec.
   ASSERT_TRUE(packet_sent_);
@@ -330,7 +326,7 @@
   n = 0;
   while (kCodecId[n] >= 0) {  // Loop over codecs.
     // Set DTX off to send audio payload.
-    acm_->SetVAD(false, false, VADAggr);
+    acm_->SetVad(false, false, VADAggr);
     packet_sent_ = false;
     InsertOnePacketOfSilence(kCodecId[n]);
 
@@ -342,7 +338,7 @@
 
     // Set VAD on to send DTX. Then check if the "Last Audio codec" returns
     // the expected codec.
-    acm_->SetVAD(true, true, VADAggr);
+    acm_->SetVad(true, true, VADAggr);
 
     // Do as many encoding until a DTX is sent.
     while (last_frame_type_ != kAudioFrameCN) {
diff --git a/modules/audio_coding/main/acm2/acm_receiver_unittest_oldapi.cc b/modules/audio_coding/main/acm2/acm_receiver_unittest_oldapi.cc
new file mode 100644
index 0000000..ef890ec
--- /dev/null
+++ b/modules/audio_coding/main/acm2/acm_receiver_unittest_oldapi.cc
@@ -0,0 +1,364 @@
+/*
+ *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include "webrtc/modules/audio_coding/main/acm2/acm_receiver.h"
+
+#include <algorithm>  // std::min
+
+#include "testing/gtest/include/gtest/gtest.h"
+#include "webrtc/modules/audio_coding/main/interface/audio_coding_module.h"
+#include "webrtc/modules/audio_coding/main/acm2/audio_coding_module_impl.h"
+#include "webrtc/modules/audio_coding/main/acm2/acm_codec_database.h"
+#include "webrtc/modules/audio_coding/neteq/tools/rtp_generator.h"
+#include "webrtc/system_wrappers/interface/clock.h"
+#include "webrtc/system_wrappers/interface/scoped_ptr.h"
+#include "webrtc/test/test_suite.h"
+#include "webrtc/test/testsupport/fileutils.h"
+#include "webrtc/test/testsupport/gtest_disable.h"
+
+namespace webrtc {
+
+namespace acm2 {
+namespace {
+
+bool CodecsEqual(const CodecInst& codec_a, const CodecInst& codec_b) {
+    if (strcmp(codec_a.plname, codec_b.plname) != 0 ||
+        codec_a.plfreq != codec_b.plfreq ||
+        codec_a.pltype != codec_b.pltype ||
+        codec_b.channels != codec_a.channels)
+      return false;
+    return true;
+}
+
+}  // namespace
+
+class AcmReceiverTestOldApi : public AudioPacketizationCallback,
+                              public ::testing::Test {
+ protected:
+  AcmReceiverTestOldApi()
+      : timestamp_(0),
+        packet_sent_(false),
+        last_packet_send_timestamp_(timestamp_),
+        last_frame_type_(kFrameEmpty) {
+    AudioCodingModule::Config config;
+    acm_.reset(new AudioCodingModuleImpl(config));
+    receiver_.reset(new AcmReceiver(config));
+  }
+
+  ~AcmReceiverTestOldApi() {}
+
+  virtual void SetUp() OVERRIDE {
+    ASSERT_TRUE(receiver_.get() != NULL);
+    ASSERT_TRUE(acm_.get() != NULL);
+    for (int n = 0; n < ACMCodecDB::kNumCodecs; n++) {
+      ASSERT_EQ(0, ACMCodecDB::Codec(n, &codecs_[n]));
+    }
+
+    acm_->InitializeReceiver();
+    acm_->InitializeSender();
+    acm_->RegisterTransportCallback(this);
+
+    rtp_header_.header.sequenceNumber = 0;
+    rtp_header_.header.timestamp = 0;
+    rtp_header_.header.markerBit = false;
+    rtp_header_.header.ssrc = 0x12345678;  // Arbitrary.
+    rtp_header_.header.numCSRCs = 0;
+    rtp_header_.header.payloadType = 0;
+    rtp_header_.frameType = kAudioFrameSpeech;
+    rtp_header_.type.Audio.isCNG = false;
+  }
+
+  virtual void TearDown() OVERRIDE {
+  }
+
+  void InsertOnePacketOfSilence(int codec_id) {
+    CodecInst codec;
+    ACMCodecDB::Codec(codec_id, &codec);
+    if (timestamp_ == 0) {  // This is the first time inserting audio.
+      ASSERT_EQ(0, acm_->RegisterSendCodec(codec));
+    } else {
+      CodecInst current_codec;
+      ASSERT_EQ(0, acm_->SendCodec(&current_codec));
+      if (!CodecsEqual(codec, current_codec))
+        ASSERT_EQ(0, acm_->RegisterSendCodec(codec));
+    }
+    AudioFrame frame;
+    // Frame setup according to the codec.
+    frame.sample_rate_hz_ = codec.plfreq;
+    frame.samples_per_channel_ = codec.plfreq / 100;  // 10 ms.
+    frame.num_channels_ = codec.channels;
+    memset(frame.data_, 0, frame.samples_per_channel_ * frame.num_channels_ *
+           sizeof(int16_t));
+    int num_bytes = 0;
+    packet_sent_ = false;
+    last_packet_send_timestamp_ = timestamp_;
+    while (num_bytes == 0) {
+      frame.timestamp_ = timestamp_;
+      timestamp_ += frame.samples_per_channel_;
+      ASSERT_EQ(0, acm_->Add10MsData(frame));
+      num_bytes = acm_->Process();
+      ASSERT_GE(num_bytes, 0);
+    }
+    ASSERT_TRUE(packet_sent_);  // Sanity check.
+  }
+
+  // Last element of id should be negative.
+  void AddSetOfCodecs(const int* id) {
+    int n = 0;
+    while (id[n] >= 0) {
+      ASSERT_EQ(0, receiver_->AddCodec(id[n], codecs_[id[n]].pltype,
+                                       codecs_[id[n]].channels, NULL));
+      ++n;
+    }
+  }
+
+  virtual int SendData(
+      FrameType frame_type,
+      uint8_t payload_type,
+      uint32_t timestamp,
+      const uint8_t* payload_data,
+      uint16_t payload_len_bytes,
+      const RTPFragmentationHeader* fragmentation) OVERRIDE {
+    if (frame_type == kFrameEmpty)
+      return 0;
+
+    rtp_header_.header.payloadType = payload_type;
+    rtp_header_.frameType = frame_type;
+    if (frame_type == kAudioFrameSpeech)
+      rtp_header_.type.Audio.isCNG = false;
+    else
+      rtp_header_.type.Audio.isCNG = true;
+    rtp_header_.header.timestamp = timestamp;
+
+    int ret_val = receiver_->InsertPacket(rtp_header_, payload_data,
+                                          payload_len_bytes);
+    if (ret_val < 0) {
+      assert(false);
+      return -1;
+    }
+    rtp_header_.header.sequenceNumber++;
+    packet_sent_ = true;
+    last_frame_type_ = frame_type;
+    return 0;
+  }
+
+  scoped_ptr<AcmReceiver> receiver_;
+  CodecInst codecs_[ACMCodecDB::kMaxNumCodecs];
+  scoped_ptr<AudioCodingModule> acm_;
+  WebRtcRTPHeader rtp_header_;
+  uint32_t timestamp_;
+  bool packet_sent_;  // Set when SendData is called reset when inserting audio.
+  uint32_t last_packet_send_timestamp_;
+  FrameType last_frame_type_;
+};
+
+TEST_F(AcmReceiverTestOldApi, DISABLED_ON_ANDROID(AddCodecGetCodec)) {
+  // Add codec.
+  for (int n = 0; n < ACMCodecDB::kNumCodecs; ++n) {
+    if (n & 0x1)  // Just add codecs with odd index.
+      EXPECT_EQ(0, receiver_->AddCodec(n, codecs_[n].pltype,
+                                       codecs_[n].channels, NULL));
+  }
+  // Get codec and compare.
+  for (int n = 0; n < ACMCodecDB::kNumCodecs; ++n) {
+    CodecInst my_codec;
+    if (n & 0x1) {
+      // Codecs with odd index should match the reference.
+      EXPECT_EQ(0, receiver_->DecoderByPayloadType(codecs_[n].pltype,
+                                                   &my_codec));
+      EXPECT_TRUE(CodecsEqual(codecs_[n], my_codec));
+    } else {
+      // Codecs with even index are not registered.
+      EXPECT_EQ(-1, receiver_->DecoderByPayloadType(codecs_[n].pltype,
+                                                    &my_codec));
+    }
+  }
+}
+
+TEST_F(AcmReceiverTestOldApi, DISABLED_ON_ANDROID(AddCodecChangePayloadType)) {
+  CodecInst ref_codec;
+  const int codec_id = ACMCodecDB::kPCMA;
+  EXPECT_EQ(0, ACMCodecDB::Codec(codec_id, &ref_codec));
+  const int payload_type = ref_codec.pltype;
+  EXPECT_EQ(0, receiver_->AddCodec(codec_id, ref_codec.pltype,
+                                   ref_codec.channels, NULL));
+  CodecInst test_codec;
+  EXPECT_EQ(0, receiver_->DecoderByPayloadType(payload_type, &test_codec));
+  EXPECT_EQ(true, CodecsEqual(ref_codec, test_codec));
+
+  // Re-register the same codec with different payload.
+  ref_codec.pltype = payload_type + 1;
+  EXPECT_EQ(0, receiver_->AddCodec(codec_id, ref_codec.pltype,
+                                   ref_codec.channels, NULL));
+
+  // Payload type |payload_type| should not exist.
+  EXPECT_EQ(-1, receiver_->DecoderByPayloadType(payload_type, &test_codec));
+
+  // Payload type |payload_type + 1| should exist.
+  EXPECT_EQ(0, receiver_->DecoderByPayloadType(payload_type + 1, &test_codec));
+  EXPECT_TRUE(CodecsEqual(test_codec, ref_codec));
+}
+
+TEST_F(AcmReceiverTestOldApi, DISABLED_ON_ANDROID(AddCodecRemoveCodec)) {
+  CodecInst codec;
+  const int codec_id = ACMCodecDB::kPCMA;
+  EXPECT_EQ(0, ACMCodecDB::Codec(codec_id, &codec));
+  const int payload_type = codec.pltype;
+  EXPECT_EQ(0, receiver_->AddCodec(codec_id, codec.pltype,
+                                   codec.channels, NULL));
+
+  // Remove non-existing codec should not fail. ACM1 legacy.
+  EXPECT_EQ(0, receiver_->RemoveCodec(payload_type + 1));
+
+  // Remove an existing codec.
+  EXPECT_EQ(0, receiver_->RemoveCodec(payload_type));
+
+  // Ask for the removed codec, must fail.
+  EXPECT_EQ(-1, receiver_->DecoderByPayloadType(payload_type, &codec));
+}
+
+TEST_F(AcmReceiverTestOldApi, DISABLED_ON_ANDROID(SampleRate)) {
+  const int kCodecId[] = {
+      ACMCodecDB::kISAC, ACMCodecDB::kISACSWB, ACMCodecDB::kISACFB,
+      -1  // Terminator.
+  };
+  AddSetOfCodecs(kCodecId);
+
+  AudioFrame frame;
+  const int kOutSampleRateHz = 8000;  // Different than codec sample rate.
+  int n = 0;
+  while (kCodecId[n] >= 0) {
+    const int num_10ms_frames = codecs_[kCodecId[n]].pacsize /
+        (codecs_[kCodecId[n]].plfreq / 100);
+    InsertOnePacketOfSilence(kCodecId[n]);
+    for (int k = 0; k < num_10ms_frames; ++k) {
+      EXPECT_EQ(0, receiver_->GetAudio(kOutSampleRateHz, &frame));
+    }
+    EXPECT_EQ(std::min(32000, codecs_[kCodecId[n]].plfreq),
+              receiver_->current_sample_rate_hz());
+    ++n;
+  }
+}
+
+// Verify that the playout mode is set correctly.
+TEST_F(AcmReceiverTestOldApi, DISABLED_ON_ANDROID(PlayoutMode)) {
+  receiver_->SetPlayoutMode(voice);
+  EXPECT_EQ(voice, receiver_->PlayoutMode());
+
+  receiver_->SetPlayoutMode(streaming);
+  EXPECT_EQ(streaming, receiver_->PlayoutMode());
+
+  receiver_->SetPlayoutMode(fax);
+  EXPECT_EQ(fax, receiver_->PlayoutMode());
+
+  receiver_->SetPlayoutMode(off);
+  EXPECT_EQ(off, receiver_->PlayoutMode());
+}
+
+TEST_F(AcmReceiverTestOldApi, DISABLED_ON_ANDROID(PostdecodingVad)) {
+  receiver_->EnableVad();
+  EXPECT_TRUE(receiver_->vad_enabled());
+
+  const int id = ACMCodecDB::kPCM16Bwb;
+  ASSERT_EQ(0, receiver_->AddCodec(id, codecs_[id].pltype, codecs_[id].channels,
+                                   NULL));
+  const int kNumPackets = 5;
+  const int num_10ms_frames = codecs_[id].pacsize / (codecs_[id].plfreq / 100);
+  AudioFrame frame;
+  for (int n = 0; n < kNumPackets; ++n) {
+    InsertOnePacketOfSilence(id);
+    for (int k = 0; k < num_10ms_frames; ++k)
+      ASSERT_EQ(0, receiver_->GetAudio(codecs_[id].plfreq, &frame));
+  }
+  EXPECT_EQ(AudioFrame::kVadPassive, frame.vad_activity_);
+
+  receiver_->DisableVad();
+  EXPECT_FALSE(receiver_->vad_enabled());
+
+  for (int n = 0; n < kNumPackets; ++n) {
+    InsertOnePacketOfSilence(id);
+    for (int k = 0; k < num_10ms_frames; ++k)
+      ASSERT_EQ(0, receiver_->GetAudio(codecs_[id].plfreq, &frame));
+  }
+  EXPECT_EQ(AudioFrame::kVadUnknown, frame.vad_activity_);
+}
+
+TEST_F(AcmReceiverTestOldApi, DISABLED_ON_ANDROID(LastAudioCodec)) {
+  const int kCodecId[] = {
+      ACMCodecDB::kISAC, ACMCodecDB::kPCMA, ACMCodecDB::kISACSWB,
+      ACMCodecDB::kPCM16Bswb32kHz, ACMCodecDB::kG722_1C_48,
+      -1  // Terminator.
+  };
+  AddSetOfCodecs(kCodecId);
+
+  const int kCngId[] = {  // Not including full-band.
+      ACMCodecDB::kCNNB, ACMCodecDB::kCNWB, ACMCodecDB::kCNSWB,
+      -1  // Terminator.
+  };
+  AddSetOfCodecs(kCngId);
+
+  // Register CNG at sender side.
+  int n = 0;
+  while (kCngId[n] > 0) {
+    ASSERT_EQ(0, acm_->RegisterSendCodec(codecs_[kCngId[n]]));
+    ++n;
+  }
+
+  CodecInst codec;
+  // No audio payload is received.
+  EXPECT_EQ(-1, receiver_->LastAudioCodec(&codec));
+
+  // Start with sending DTX.
+  ASSERT_EQ(0, acm_->SetVAD(true, true, VADVeryAggr));
+  packet_sent_ = false;
+  InsertOnePacketOfSilence(kCodecId[0]);  // Enough to test with one codec.
+  ASSERT_TRUE(packet_sent_);
+  EXPECT_EQ(kAudioFrameCN, last_frame_type_);
+
+  // Has received, only, DTX. Last Audio codec is undefined.
+  EXPECT_EQ(-1, receiver_->LastAudioCodec(&codec));
+  EXPECT_EQ(-1, receiver_->last_audio_codec_id());
+  EXPECT_EQ(-1, receiver_->last_audio_payload_type());
+
+  n = 0;
+  while (kCodecId[n] >= 0) {  // Loop over codecs.
+    // Set DTX off to send audio payload.
+    acm_->SetVAD(false, false, VADAggr);
+    packet_sent_ = false;
+    InsertOnePacketOfSilence(kCodecId[n]);
+
+    // Sanity check if Actually an audio payload received, and it should be
+    // of type "speech."
+    ASSERT_TRUE(packet_sent_);
+    ASSERT_EQ(kAudioFrameSpeech, last_frame_type_);
+    EXPECT_EQ(kCodecId[n], receiver_->last_audio_codec_id());
+
+    // Set VAD on to send DTX. Then check if the "Last Audio codec" returns
+    // the expected codec.
+    acm_->SetVAD(true, true, VADAggr);
+
+    // Do as many encoding until a DTX is sent.
+    while (last_frame_type_ != kAudioFrameCN) {
+      packet_sent_ = false;
+      InsertOnePacketOfSilence(kCodecId[n]);
+      ASSERT_TRUE(packet_sent_);
+    }
+    EXPECT_EQ(kCodecId[n], receiver_->last_audio_codec_id());
+    EXPECT_EQ(codecs_[kCodecId[n]].pltype,
+              receiver_->last_audio_payload_type());
+    EXPECT_EQ(0, receiver_->LastAudioCodec(&codec));
+    EXPECT_TRUE(CodecsEqual(codecs_[kCodecId[n]], codec));
+    ++n;
+  }
+}
+
+}  // namespace acm2
+
+}  // namespace webrtc
diff --git a/modules/audio_coding/main/acm2/audio_coding_module_impl.cc b/modules/audio_coding/main/acm2/audio_coding_module_impl.cc
index 2212f83..687c5b8 100644
--- a/modules/audio_coding/main/acm2/audio_coding_module_impl.cc
+++ b/modules/audio_coding/main/acm2/audio_coding_module_impl.cc
@@ -2073,6 +2073,13 @@
   FATAL() << "Not implemented yet.";
 }
 
+const CodecInst* AudioCodingImpl::GetSenderCodecInst() {
+  if (acm_old_->SendCodec(&current_send_codec_) != 0) {
+    return NULL;
+  }
+  return &current_send_codec_;
+}
+
 int AudioCodingImpl::Add10MsAudio(const AudioFrame& audio_frame) {
   if (acm_old_->Add10MsData(audio_frame) != 0) {
     return -1;
@@ -2151,6 +2158,12 @@
   FATAL() << "Not implemented yet.";
 }
 
+bool AudioCodingImpl::SetVad(bool enable_dtx,
+                             bool enable_vad,
+                             ACMVADMode vad_mode) {
+  return acm_old_->SetVAD(enable_dtx, enable_vad, vad_mode) == 0;
+}
+
 std::vector<uint16_t> AudioCodingImpl::GetNackList(
     int round_trip_time_ms) const {
   return acm_old_->GetNackList(round_trip_time_ms);
diff --git a/modules/audio_coding/main/acm2/audio_coding_module_impl.h b/modules/audio_coding/main/acm2/audio_coding_module_impl.h
index 93fd96b..6e03e5e 100644
--- a/modules/audio_coding/main/acm2/audio_coding_module_impl.h
+++ b/modules/audio_coding/main/acm2/audio_coding_module_impl.h
@@ -390,10 +390,7 @@
 class AudioCodingImpl : public AudioCoding {
  public:
   AudioCodingImpl(const Config& config) {
-    AudioCodingModule::Config config_old;
-    config_old.id = 0;
-    config_old.neteq_config = config.neteq_config;
-    config_old.clock = config.clock;
+    AudioCodingModule::Config config_old = config.ToOldConfig();
     acm_old_.reset(new acm2::AudioCodingModuleImpl(config_old));
     acm_old_->RegisterTransportCallback(config.transport);
     acm_old_->RegisterVADCallback(config.vad_callback);
@@ -414,6 +411,8 @@
 
   virtual const AudioEncoder* GetSenderInfo() const OVERRIDE;
 
+  virtual const CodecInst* GetSenderCodecInst() OVERRIDE;
+
   virtual int Add10MsAudio(const AudioFrame& audio_frame) OVERRIDE;
 
   virtual const ReceiverInfo* GetReceiverInfo() const OVERRIDE;
@@ -449,6 +448,10 @@
 
   virtual void DisableNack() OVERRIDE;
 
+  virtual bool SetVad(bool enable_dtx,
+                      bool enable_vad,
+                      ACMVADMode vad_mode) OVERRIDE;
+
   virtual std::vector<uint16_t> GetNackList(
       int round_trip_time_ms) const OVERRIDE;
 
@@ -465,8 +468,11 @@
                                        int* sample_rate_hz,
                                        int* channels);
 
-  scoped_ptr<acm2::AudioCodingModuleImpl> acm_old_;
   int playout_frequency_hz_;
+  // TODO(henrik.lundin): All members below this line are temporary and should
+  // be removed after refactoring is completed.
+  scoped_ptr<acm2::AudioCodingModuleImpl> acm_old_;
+  CodecInst current_send_codec_;
 };
 
 }  // namespace webrtc
diff --git a/modules/audio_coding/main/interface/audio_coding_module.h b/modules/audio_coding/main/interface/audio_coding_module.h
index 389b93f..8d73285 100644
--- a/modules/audio_coding/main/interface/audio_coding_module.h
+++ b/modules/audio_coding/main/interface/audio_coding_module.h
@@ -1015,6 +1015,14 @@
           playout_channels(1),
           playout_frequency_hz(32000) {}
 
+    AudioCodingModule::Config ToOldConfig() const {
+      AudioCodingModule::Config old_config;
+      old_config.id = 0;
+      old_config.neteq_config = neteq_config;
+      old_config.clock = clock;
+      return old_config;
+    }
+
     NetEq::Config neteq_config;
     Clock* clock;
     AudioPacketizationCallback* transport;
@@ -1046,6 +1054,9 @@
   // codec that was registered in the latest call to RegisterSendCodec().
   virtual const AudioEncoder* GetSenderInfo() const = 0;
 
+  // Temporary solution to be used during refactoring.
+  virtual const CodecInst* GetSenderCodecInst() = 0;
+
   // Adds 10 ms of raw (PCM) audio data to the encoder. If the sampling
   // frequency of the audio does not match the sampling frequency of the
   // current encoder, ACM will resample the audio.
@@ -1139,6 +1150,22 @@
   // Disables NACK.
   virtual void DisableNack() = 0;
 
+
+  // Temporary solution to be used during refactoring.
+  // If DTX is enabled and the codec does not have internal DTX/VAD
+  // WebRtc VAD will be automatically enabled and |enable_vad| is ignored.
+  //
+  // If DTX is disabled but VAD is enabled no DTX packets are sent,
+  // regardless of whether the codec has internal DTX/VAD or not. In this
+  // case, WebRtc VAD is running to label frames as active/in-active.
+  //
+  // NOTE! VAD/DTX is not supported when sending stereo.
+  //
+  // Return true if successful, false otherwise.
+  virtual bool SetVad(bool enable_dtx,
+                      bool enable_vad,
+                      ACMVADMode vad_mode) = 0;
+
   // Returns a list of packets to request retransmission of.
   // |round_trip_time_ms| is an estimate of the round-trip-time (in
   // milliseconds). Missing packets which will be decoded sooner than the
diff --git a/modules/modules.gyp b/modules/modules.gyp
index 4086299..1025d01 100644
--- a/modules/modules.gyp
+++ b/modules/modules.gyp
@@ -104,6 +104,7 @@
           'sources': [
             'audio_coding/main/acm2/acm_opus_unittest.cc',
             'audio_coding/main/acm2/acm_receiver_unittest.cc',
+            'audio_coding/main/acm2/acm_receiver_unittest_oldapi.cc',
             'audio_coding/main/acm2/audio_coding_module_unittest.cc',
             'audio_coding/main/acm2/call_statistics_unittest.cc',
             'audio_coding/main/acm2/initial_delay_manager_unittest.cc',