1/*
2 *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "webrtc/modules/audio_processing/audio_processing_impl.h"
12
13#include "testing/gmock/include/gmock/gmock.h"
14#include "testing/gtest/include/gtest/gtest.h"
15#include "webrtc/config.h"
16#include "webrtc/modules/audio_processing/test/test_utils.h"
17#include "webrtc/modules/include/module_common_types.h"
18
19using ::testing::Invoke;
20using ::testing::Return;
21
22namespace webrtc {
23
24class MockInitialize : public AudioProcessingImpl {
25 public:
26  explicit MockInitialize(const Config& config) : AudioProcessingImpl(config) {
27  }
28
29  MOCK_METHOD0(InitializeLocked, int());
30  int RealInitializeLocked() NO_THREAD_SAFETY_ANALYSIS {
31    return AudioProcessingImpl::InitializeLocked();
32  }
33};
34
35TEST(AudioProcessingImplTest, AudioParameterChangeTriggersInit) {
36  Config config;
37  MockInitialize mock(config);
38  ON_CALL(mock, InitializeLocked())
39      .WillByDefault(Invoke(&mock, &MockInitialize::RealInitializeLocked));
40
41  EXPECT_CALL(mock, InitializeLocked()).Times(1);
42  mock.Initialize();
43
44  AudioFrame frame;
45  // Call with the default parameters; there should be no init.
46  frame.num_channels_ = 1;
47  SetFrameSampleRate(&frame, 16000);
48  EXPECT_CALL(mock, InitializeLocked())
49      .Times(0);
50  EXPECT_NOERR(mock.ProcessStream(&frame));
51  EXPECT_NOERR(mock.AnalyzeReverseStream(&frame));
52
53  // New sample rate. (Only impacts ProcessStream).
54  SetFrameSampleRate(&frame, 32000);
55  EXPECT_CALL(mock, InitializeLocked())
56      .Times(1);
57  EXPECT_NOERR(mock.ProcessStream(&frame));
58
59  // New number of channels.
60  frame.num_channels_ = 2;
61  EXPECT_CALL(mock, InitializeLocked())
62      .Times(2);
63  EXPECT_NOERR(mock.ProcessStream(&frame));
64  // ProcessStream sets num_channels_ == num_output_channels.
65  frame.num_channels_ = 2;
66  EXPECT_NOERR(mock.AnalyzeReverseStream(&frame));
67
68  // A new sample rate passed to AnalyzeReverseStream should be an error and
69  // not cause an init.
70  SetFrameSampleRate(&frame, 16000);
71  EXPECT_CALL(mock, InitializeLocked())
72      .Times(0);
73  EXPECT_EQ(mock.kBadSampleRateError, mock.AnalyzeReverseStream(&frame));
74}
75
76}  // namespace webrtc
77