1/*
2 *  Copyright (c) 2012 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#ifndef WEBRTC_AUDIO_DEVICE_FUNC_TEST_MANAGER_H
12#define WEBRTC_AUDIO_DEVICE_FUNC_TEST_MANAGER_H
13
14#include <list>
15#include <string>
16
17#include "webrtc/common_audio/resampler/include/resampler.h"
18#include "webrtc/modules/audio_device/include/audio_device.h"
19#include "webrtc/modules/audio_device/test/audio_device_test_defines.h"
20#include "webrtc/system_wrappers/include/file_wrapper.h"
21#include "webrtc/typedefs.h"
22
23
24#define ADM_AUDIO_LAYER AudioDeviceModule::kPlatformDefaultAudio
25//#define ADM_AUDIO_LAYER AudioDeviceModule::kLinuxPulseAudio
26
27enum TestType
28{
29    TTInvalid = -1,
30    TTAll = 0,
31    TTAudioLayerSelection = 1,
32    TTDeviceEnumeration = 2,
33    TTDeviceSelection = 3,
34    TTAudioTransport = 4,
35    TTSpeakerVolume = 5,
36    TTMicrophoneVolume = 6,
37    TTSpeakerMute = 7,
38    TTMicrophoneMute = 8,
39    TTMicrophoneBoost = 9,
40    TTMicrophoneAGC = 10,
41    TTLoopback = 11,
42    TTDeviceRemoval = 13,
43    TTMobileAPI = 14,
44    TTTest = 66,
45};
46
47struct AudioPacket
48{
49    uint8_t dataBuffer[4 * 960];
50    size_t nSamples;
51    size_t nBytesPerSample;
52    size_t nChannels;
53    uint32_t samplesPerSec;
54};
55
56class ProcessThread;
57
58namespace webrtc
59{
60
61class AudioDeviceModule;
62class AudioEventObserver;
63class AudioTransport;
64
65// ----------------------------------------------------------------------------
66//  AudioEventObserver
67// ----------------------------------------------------------------------------
68
69class AudioEventObserver: public AudioDeviceObserver
70{
71public:
72    virtual void OnErrorIsReported(const ErrorCode error);
73    virtual void OnWarningIsReported(const WarningCode warning);
74    AudioEventObserver(AudioDeviceModule* audioDevice);
75    ~AudioEventObserver();
76public:
77    ErrorCode _error;
78    WarningCode _warning;
79};
80
81// ----------------------------------------------------------------------------
82//  AudioTransport
83// ----------------------------------------------------------------------------
84
85class AudioTransportImpl: public AudioTransport
86{
87public:
88    int32_t RecordedDataIsAvailable(const void* audioSamples,
89                                    const size_t nSamples,
90                                    const size_t nBytesPerSample,
91                                    const size_t nChannels,
92                                    const uint32_t samplesPerSec,
93                                    const uint32_t totalDelayMS,
94                                    const int32_t clockDrift,
95                                    const uint32_t currentMicLevel,
96                                    const bool keyPressed,
97                                    uint32_t& newMicLevel) override;
98
99    int32_t NeedMorePlayData(const size_t nSamples,
100                             const size_t nBytesPerSample,
101                             const size_t nChannels,
102                             const uint32_t samplesPerSec,
103                             void* audioSamples,
104                             size_t& nSamplesOut,
105                             int64_t* elapsed_time_ms,
106                             int64_t* ntp_time_ms) override;
107
108    AudioTransportImpl(AudioDeviceModule* audioDevice);
109    ~AudioTransportImpl();
110
111public:
112    int32_t SetFilePlayout(bool enable, const char* fileName = NULL);
113    void SetFullDuplex(bool enable);
114    void SetSpeakerVolume(bool enable)
115    {
116        _speakerVolume = enable;
117    }
118    ;
119    void SetSpeakerMute(bool enable)
120    {
121        _speakerMute = enable;
122    }
123    ;
124    void SetMicrophoneMute(bool enable)
125    {
126        _microphoneMute = enable;
127    }
128    ;
129    void SetMicrophoneVolume(bool enable)
130    {
131        _microphoneVolume = enable;
132    }
133    ;
134    void SetMicrophoneBoost(bool enable)
135    {
136        _microphoneBoost = enable;
137    }
138    ;
139    void SetLoopbackMeasurements(bool enable)
140    {
141        _loopBackMeasurements = enable;
142    }
143    ;
144    void SetMicrophoneAGC(bool enable)
145    {
146        _microphoneAGC = enable;
147    }
148    ;
149
150private:
151    typedef std::list<AudioPacket*> AudioPacketList;
152    AudioDeviceModule* _audioDevice;
153
154    bool _playFromFile;
155    bool _fullDuplex;
156    bool _speakerVolume;
157    bool _speakerMute;
158    bool _microphoneVolume;
159    bool _microphoneMute;
160    bool _microphoneBoost;
161    bool _microphoneAGC;
162    bool _loopBackMeasurements;
163
164    FileWrapper& _playFile;
165
166    uint32_t _recCount;
167    uint32_t _playCount;
168    AudioPacketList _audioList;
169
170    Resampler _resampler;
171};
172
173// ----------------------------------------------------------------------------
174//  FuncTestManager
175// ----------------------------------------------------------------------------
176
177class FuncTestManager
178{
179public:
180    FuncTestManager();
181    ~FuncTestManager();
182    int32_t Init();
183    int32_t Close();
184    int32_t DoTest(const TestType testType);
185private:
186    int32_t TestAudioLayerSelection();
187    int32_t TestDeviceEnumeration();
188    int32_t TestDeviceSelection();
189    int32_t TestAudioTransport();
190    int32_t TestSpeakerVolume();
191    int32_t TestMicrophoneVolume();
192    int32_t TestSpeakerMute();
193    int32_t TestMicrophoneMute();
194    int32_t TestMicrophoneBoost();
195    int32_t TestLoopback();
196    int32_t TestDeviceRemoval();
197    int32_t TestExtra();
198    int32_t TestMicrophoneAGC();
199    int32_t SelectPlayoutDevice();
200    int32_t SelectRecordingDevice();
201    int32_t TestAdvancedMBAPI();
202private:
203    // Paths to where the resource files to be used for this test are located.
204    std::string _playoutFile48;
205    std::string _playoutFile44;
206    std::string _playoutFile16;
207    std::string _playoutFile8;
208
209    rtc::scoped_ptr<ProcessThread> _processThread;
210    AudioDeviceModule* _audioDevice;
211    AudioEventObserver* _audioEventObserver;
212    AudioTransportImpl* _audioTransport;
213};
214
215}  // namespace webrtc
216
217#endif  // #ifndef WEBRTC_AUDIO_DEVICE_FUNC_TEST_MANAGER_H
218