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
19 using ::testing::Invoke;
20 using ::testing::Return;
21
22 namespace webrtc {
23
24 class MockInitialize : public AudioProcessingImpl {
25 public:
MockInitialize(const Config & config)26 explicit MockInitialize(const Config& config) : AudioProcessingImpl(config) {
27 }
28
29 MOCK_METHOD0(InitializeLocked, int());
RealInitializeLocked()30 int RealInitializeLocked() NO_THREAD_SAFETY_ANALYSIS {
31 return AudioProcessingImpl::InitializeLocked();
32 }
33 };
34
TEST(AudioProcessingImplTest,AudioParameterChangeTriggersInit)35 TEST(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