160730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org/*
260730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
360730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org *
460730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
560730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
660730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
760730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
860730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
960730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org */
1060730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org
1160730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org#include "webrtc/modules/audio_processing/audio_processing_impl.h"
1260730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org
1360730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org#include "testing/gmock/include/gmock/gmock.h"
1460730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
1512acd6ea8c5dcec953061144b82002d984967807andrew@webrtc.org#include "webrtc/config.h"
1660730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org#include "webrtc/modules/audio_processing/test/test_utils.h"
17ff761fba8274d93bd73e76c8b8a1f2d0776dd840Henrik Kjellander#include "webrtc/modules/include/module_common_types.h"
1860730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org
1960730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.orgusing ::testing::Invoke;
2060730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.orgusing ::testing::Return;
2160730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org
2260730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.orgnamespace webrtc {
2360730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org
2460730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.orgclass MockInitialize : public AudioProcessingImpl {
2560730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org public:
26e84978f3d8612e7e482791552b94e0847967d3baandrew@webrtc.org  explicit MockInitialize(const Config& config) : AudioProcessingImpl(config) {
27e84978f3d8612e7e482791552b94e0847967d3baandrew@webrtc.org  }
2860730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org
29e84978f3d8612e7e482791552b94e0847967d3baandrew@webrtc.org  MOCK_METHOD0(InitializeLocked, int());
30788acd17adf6b3d605b5ea66cf394eb81fc086a9pbos@webrtc.org  int RealInitializeLocked() NO_THREAD_SAFETY_ANALYSIS {
31788acd17adf6b3d605b5ea66cf394eb81fc086a9pbos@webrtc.org    return AudioProcessingImpl::InitializeLocked();
32788acd17adf6b3d605b5ea66cf394eb81fc086a9pbos@webrtc.org  }
3360730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org};
3460730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org
3560730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.orgTEST(AudioProcessingImplTest, AudioParameterChangeTriggersInit) {
36e84978f3d8612e7e482791552b94e0847967d3baandrew@webrtc.org  Config config;
37e84978f3d8612e7e482791552b94e0847967d3baandrew@webrtc.org  MockInitialize mock(config);
3860730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org  ON_CALL(mock, InitializeLocked())
3960730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org      .WillByDefault(Invoke(&mock, &MockInitialize::RealInitializeLocked));
4060730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org
4160730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org  EXPECT_CALL(mock, InitializeLocked()).Times(1);
4260730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org  mock.Initialize();
4360730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org
4460730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org  AudioFrame frame;
4560730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org  // Call with the default parameters; there should be no init.
4660730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org  frame.num_channels_ = 1;
4760730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org  SetFrameSampleRate(&frame, 16000);
4860730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org  EXPECT_CALL(mock, InitializeLocked())
4960730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org      .Times(0);
50a8b97373d5d3154357cc6589ff949ee9f6f99d8dandrew@webrtc.org  EXPECT_NOERR(mock.ProcessStream(&frame));
51a8b97373d5d3154357cc6589ff949ee9f6f99d8dandrew@webrtc.org  EXPECT_NOERR(mock.AnalyzeReverseStream(&frame));
5260730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org
5360730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org  // New sample rate. (Only impacts ProcessStream).
5460730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org  SetFrameSampleRate(&frame, 32000);
5560730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org  EXPECT_CALL(mock, InitializeLocked())
5660730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org      .Times(1);
57a8b97373d5d3154357cc6589ff949ee9f6f99d8dandrew@webrtc.org  EXPECT_NOERR(mock.ProcessStream(&frame));
5860730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org
5960730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org  // New number of channels.
6060730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org  frame.num_channels_ = 2;
6160730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org  EXPECT_CALL(mock, InitializeLocked())
6260730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org      .Times(2);
63a8b97373d5d3154357cc6589ff949ee9f6f99d8dandrew@webrtc.org  EXPECT_NOERR(mock.ProcessStream(&frame));
6460730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org  // ProcessStream sets num_channels_ == num_output_channels.
6560730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org  frame.num_channels_ = 2;
66a8b97373d5d3154357cc6589ff949ee9f6f99d8dandrew@webrtc.org  EXPECT_NOERR(mock.AnalyzeReverseStream(&frame));
6760730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org
6860730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org  // A new sample rate passed to AnalyzeReverseStream should be an error and
6960730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org  // not cause an init.
7060730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org  SetFrameSampleRate(&frame, 16000);
7160730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org  EXPECT_CALL(mock, InitializeLocked())
7260730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org      .Times(0);
7360730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org  EXPECT_EQ(mock.kBadSampleRateError, mock.AnalyzeReverseStream(&frame));
7460730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org}
7560730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org
7660730cfe3ce80e4023cd678373456cb703f000a4andrew@webrtc.org}  // namespace webrtc
77