• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef WEBRTC_AUDIO_DEVICE_FILE_AUDIO_DEVICE_H
12 #define WEBRTC_AUDIO_DEVICE_FILE_AUDIO_DEVICE_H
13 
14 #include <stdio.h>
15 
16 #include <string>
17 
18 #include "webrtc/modules/audio_device/audio_device_generic.h"
19 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
20 #include "webrtc/system_wrappers/interface/file_wrapper.h"
21 #include "webrtc/system_wrappers/interface/clock.h"
22 
23 namespace webrtc {
24 class EventWrapper;
25 class ThreadWrapper;
26 
27 // This is a fake audio device which plays audio from a file as its microphone
28 // and plays out into a file.
29 class FileAudioDevice : public AudioDeviceGeneric {
30  public:
31   // Constructs a file audio device with |id|. It will read audio from
32   // |inputFilename| and record output audio to |outputFilename|.
33   //
34   // The input file should be a readable 48k stereo raw file, and the output
35   // file should point to a writable location. The output format will also be
36   // 48k stereo raw audio.
37   FileAudioDevice(const int32_t id,
38                   const char* inputFilename,
39                   const char* outputFilename);
40   virtual ~FileAudioDevice();
41 
42   // Retrieve the currently utilized audio layer
43   virtual int32_t ActiveAudioLayer(
44       AudioDeviceModule::AudioLayer& audioLayer) const OVERRIDE;
45 
46   // Main initializaton and termination
47   virtual int32_t Init() OVERRIDE;
48   virtual int32_t Terminate() OVERRIDE;
49   virtual bool Initialized() const OVERRIDE;
50 
51   // Device enumeration
52   virtual int16_t PlayoutDevices() OVERRIDE;
53   virtual int16_t RecordingDevices() OVERRIDE;
54   virtual int32_t PlayoutDeviceName(uint16_t index,
55                                     char name[kAdmMaxDeviceNameSize],
56                                     char guid[kAdmMaxGuidSize]) OVERRIDE;
57   virtual int32_t RecordingDeviceName(uint16_t index,
58                                       char name[kAdmMaxDeviceNameSize],
59                                       char guid[kAdmMaxGuidSize]) OVERRIDE;
60 
61   // Device selection
62   virtual int32_t SetPlayoutDevice(uint16_t index) OVERRIDE;
63   virtual int32_t SetPlayoutDevice(
64       AudioDeviceModule::WindowsDeviceType device) OVERRIDE;
65   virtual int32_t SetRecordingDevice(uint16_t index) OVERRIDE;
66   virtual int32_t SetRecordingDevice(
67       AudioDeviceModule::WindowsDeviceType device) OVERRIDE;
68 
69   // Audio transport initialization
70   virtual int32_t PlayoutIsAvailable(bool& available) OVERRIDE;
71   virtual int32_t InitPlayout() OVERRIDE;
72   virtual bool PlayoutIsInitialized() const OVERRIDE;
73   virtual int32_t RecordingIsAvailable(bool& available) OVERRIDE;
74   virtual int32_t InitRecording() OVERRIDE;
75   virtual bool RecordingIsInitialized() const OVERRIDE;
76 
77   // Audio transport control
78   virtual int32_t StartPlayout() OVERRIDE;
79   virtual int32_t StopPlayout() OVERRIDE;
80   virtual bool Playing() const OVERRIDE;
81   virtual int32_t StartRecording() OVERRIDE;
82   virtual int32_t StopRecording() OVERRIDE;
83   virtual bool Recording() const OVERRIDE;
84 
85   // Microphone Automatic Gain Control (AGC)
86   virtual int32_t SetAGC(bool enable) OVERRIDE;
87   virtual bool AGC() const OVERRIDE;
88 
89   // Volume control based on the Windows Wave API (Windows only)
90   virtual int32_t SetWaveOutVolume(uint16_t volumeLeft,
91                                    uint16_t volumeRight) OVERRIDE;
92   virtual int32_t WaveOutVolume(uint16_t& volumeLeft,
93                                 uint16_t& volumeRight) const OVERRIDE;
94 
95   // Audio mixer initialization
96   virtual int32_t InitSpeaker() OVERRIDE;
97   virtual bool SpeakerIsInitialized() const OVERRIDE;
98   virtual int32_t InitMicrophone() OVERRIDE;
99   virtual bool MicrophoneIsInitialized() const OVERRIDE;
100 
101   // Speaker volume controls
102   virtual int32_t SpeakerVolumeIsAvailable(bool& available) OVERRIDE;
103   virtual int32_t SetSpeakerVolume(uint32_t volume) OVERRIDE;
104   virtual int32_t SpeakerVolume(uint32_t& volume) const OVERRIDE;
105   virtual int32_t MaxSpeakerVolume(uint32_t& maxVolume) const OVERRIDE;
106   virtual int32_t MinSpeakerVolume(uint32_t& minVolume) const OVERRIDE;
107   virtual int32_t SpeakerVolumeStepSize(uint16_t& stepSize) const OVERRIDE;
108 
109   // Microphone volume controls
110   virtual int32_t MicrophoneVolumeIsAvailable(bool& available) OVERRIDE;
111   virtual int32_t SetMicrophoneVolume(uint32_t volume) OVERRIDE;
112   virtual int32_t MicrophoneVolume(uint32_t& volume) const OVERRIDE;
113   virtual int32_t MaxMicrophoneVolume(uint32_t& maxVolume) const OVERRIDE;
114   virtual int32_t MinMicrophoneVolume(uint32_t& minVolume) const OVERRIDE;
115   virtual int32_t MicrophoneVolumeStepSize(uint16_t& stepSize) const OVERRIDE;
116 
117   // Speaker mute control
118   virtual int32_t SpeakerMuteIsAvailable(bool& available) OVERRIDE;
119   virtual int32_t SetSpeakerMute(bool enable) OVERRIDE;
120   virtual int32_t SpeakerMute(bool& enabled) const OVERRIDE;
121 
122   // Microphone mute control
123   virtual int32_t MicrophoneMuteIsAvailable(bool& available) OVERRIDE;
124   virtual int32_t SetMicrophoneMute(bool enable) OVERRIDE;
125   virtual int32_t MicrophoneMute(bool& enabled) const OVERRIDE;
126 
127   // Microphone boost control
128   virtual int32_t MicrophoneBoostIsAvailable(bool& available) OVERRIDE;
129   virtual int32_t SetMicrophoneBoost(bool enable) OVERRIDE;
130   virtual int32_t MicrophoneBoost(bool& enabled) const OVERRIDE;
131 
132   // Stereo support
133   virtual int32_t StereoPlayoutIsAvailable(bool& available) OVERRIDE;
134   virtual int32_t SetStereoPlayout(bool enable) OVERRIDE;
135   virtual int32_t StereoPlayout(bool& enabled) const OVERRIDE;
136   virtual int32_t StereoRecordingIsAvailable(bool& available) OVERRIDE;
137   virtual int32_t SetStereoRecording(bool enable) OVERRIDE;
138   virtual int32_t StereoRecording(bool& enabled) const OVERRIDE;
139 
140   // Delay information and control
141   virtual int32_t SetPlayoutBuffer(const AudioDeviceModule::BufferType type,
142                                    uint16_t sizeMS) OVERRIDE;
143   virtual int32_t PlayoutBuffer(AudioDeviceModule::BufferType& type,
144                                 uint16_t& sizeMS) const OVERRIDE;
145   virtual int32_t PlayoutDelay(uint16_t& delayMS) const OVERRIDE;
146   virtual int32_t RecordingDelay(uint16_t& delayMS) const OVERRIDE;
147 
148   // CPU load
149   virtual int32_t CPULoad(uint16_t& load) const OVERRIDE;
150 
151   virtual bool PlayoutWarning() const OVERRIDE;
152   virtual bool PlayoutError() const OVERRIDE;
153   virtual bool RecordingWarning() const OVERRIDE;
154   virtual bool RecordingError() const OVERRIDE;
155   virtual void ClearPlayoutWarning() OVERRIDE;
156   virtual void ClearPlayoutError() OVERRIDE;
157   virtual void ClearRecordingWarning() OVERRIDE;
158   virtual void ClearRecordingError() OVERRIDE;
159 
160   virtual void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer) OVERRIDE;
161 
162  private:
163   static bool RecThreadFunc(void*);
164   static bool PlayThreadFunc(void*);
165   bool RecThreadProcess();
166   bool PlayThreadProcess();
167 
168   int32_t _playout_index;
169   int32_t _record_index;
170   AudioDeviceModule::BufferType _playBufType;
171   AudioDeviceBuffer* _ptrAudioBuffer;
172   int8_t* _recordingBuffer;  // In bytes.
173   int8_t* _playoutBuffer;  // In bytes.
174   uint32_t _recordingFramesLeft;
175   uint32_t _playoutFramesLeft;
176   CriticalSectionWrapper& _critSect;
177 
178   uint32_t _recordingBufferSizeIn10MS;
179   uint32_t _recordingFramesIn10MS;
180   uint32_t _playoutFramesIn10MS;
181 
182   ThreadWrapper* _ptrThreadRec;
183   ThreadWrapper* _ptrThreadPlay;
184   uint32_t _recThreadID;
185   uint32_t _playThreadID;
186 
187   bool _playing;
188   bool _recording;
189   uint64_t _lastCallPlayoutMillis;
190   uint64_t _lastCallRecordMillis;
191 
192   FileWrapper& _outputFile;
193   FileWrapper& _inputFile;
194   std::string _outputFilename;
195   std::string _inputFilename;
196 
197   Clock* _clock;
198 };
199 
200 }  // namespace webrtc
201 
202 #endif  // WEBRTC_AUDIO_DEVICE_FILE_AUDIO_DEVICE_H
203