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 "webrtc/config.h"
14 #include "webrtc/modules/audio_processing/test/test_utils.h"
15 #include "webrtc/modules/include/module_common_types.h"
16 #include "webrtc/test/gmock.h"
17 #include "webrtc/test/gtest.h"
18 
19 using ::testing::Invoke;
20 using ::testing::Return;
21 
22 namespace webrtc {
23 
24 class MockInitialize : public AudioProcessingImpl {
25  public:
MockInitialize(const webrtc::Config & config)26   explicit MockInitialize(const webrtc::Config& config)
27       : AudioProcessingImpl(config) {}
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   webrtc::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 an init.
46   frame.num_channels_ = 1;
47   SetFrameSampleRate(&frame, 16000);
48   EXPECT_CALL(mock, InitializeLocked())
49       .Times(1);
50   EXPECT_NOERR(mock.ProcessStream(&frame));
51   EXPECT_NOERR(mock.ProcessReverseStream(&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   // TODO(peah): Investigate why this causes 2 inits.
61   frame.num_channels_ = 2;
62   EXPECT_CALL(mock, InitializeLocked())
63       .Times(2);
64   EXPECT_NOERR(mock.ProcessStream(&frame));
65   // ProcessStream sets num_channels_ == num_output_channels.
66   frame.num_channels_ = 2;
67   EXPECT_NOERR(mock.ProcessReverseStream(&frame));
68 
69   // A new sample rate passed to ProcessReverseStream should cause an init.
70   SetFrameSampleRate(&frame, 16000);
71   EXPECT_CALL(mock, InitializeLocked()).Times(1);
72   EXPECT_NOERR(mock.ProcessReverseStream(&frame));
73 }
74 
75 }  // namespace webrtc
76