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_AUDIO_DEVICE_BUFFER_H
12#define WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_BUFFER_H
13
14#include "webrtc/modules/audio_device/include/audio_device.h"
15#include "webrtc/system_wrappers/interface/file_wrapper.h"
16#include "webrtc/typedefs.h"
17
18namespace webrtc {
19class CriticalSectionWrapper;
20
21const uint32_t kPulsePeriodMs = 1000;
22const uint32_t kMaxBufferSizeBytes = 3840; // 10ms in stereo @ 96kHz
23
24class AudioDeviceObserver;
25class MediaFile;
26
27class AudioDeviceBuffer
28{
29public:
30    AudioDeviceBuffer();
31    virtual ~AudioDeviceBuffer();
32
33    void SetId(uint32_t id);
34    int32_t RegisterAudioCallback(AudioTransport* audioCallback);
35
36    int32_t InitPlayout();
37    int32_t InitRecording();
38
39    virtual int32_t SetRecordingSampleRate(uint32_t fsHz);
40    virtual int32_t SetPlayoutSampleRate(uint32_t fsHz);
41    int32_t RecordingSampleRate() const;
42    int32_t PlayoutSampleRate() const;
43
44    virtual int32_t SetRecordingChannels(uint8_t channels);
45    virtual int32_t SetPlayoutChannels(uint8_t channels);
46    uint8_t RecordingChannels() const;
47    uint8_t PlayoutChannels() const;
48    int32_t SetRecordingChannel(
49        const AudioDeviceModule::ChannelType channel);
50    int32_t RecordingChannel(
51        AudioDeviceModule::ChannelType& channel) const;
52
53    virtual int32_t SetRecordedBuffer(const void* audioBuffer,
54                                      uint32_t nSamples);
55    int32_t SetCurrentMicLevel(uint32_t level);
56    virtual void SetVQEData(int playDelayMS,
57                            int recDelayMS,
58                            int clockDrift);
59    virtual int32_t DeliverRecordedData();
60    uint32_t NewMicLevel() const;
61
62    virtual int32_t RequestPlayoutData(uint32_t nSamples);
63    virtual int32_t GetPlayoutData(void* audioBuffer);
64
65    int32_t StartInputFileRecording(
66        const char fileName[kAdmMaxFileNameSize]);
67    int32_t StopInputFileRecording();
68    int32_t StartOutputFileRecording(
69        const char fileName[kAdmMaxFileNameSize]);
70    int32_t StopOutputFileRecording();
71
72    int32_t SetTypingStatus(bool typingStatus);
73
74private:
75    int32_t                   _id;
76    CriticalSectionWrapper&         _critSect;
77    CriticalSectionWrapper&         _critSectCb;
78
79    AudioTransport*                 _ptrCbAudioTransport;
80
81    uint32_t                  _recSampleRate;
82    uint32_t                  _playSampleRate;
83
84    uint8_t                   _recChannels;
85    uint8_t                   _playChannels;
86
87    // selected recording channel (left/right/both)
88    AudioDeviceModule::ChannelType _recChannel;
89
90    // 2 or 4 depending on mono or stereo
91    uint8_t                   _recBytesPerSample;
92    uint8_t                   _playBytesPerSample;
93
94    // 10ms in stereo @ 96kHz
95    int8_t                          _recBuffer[kMaxBufferSizeBytes];
96
97    // one sample <=> 2 or 4 bytes
98    uint32_t                  _recSamples;
99    uint32_t                  _recSize;           // in bytes
100
101    // 10ms in stereo @ 96kHz
102    int8_t                          _playBuffer[kMaxBufferSizeBytes];
103
104    // one sample <=> 2 or 4 bytes
105    uint32_t                  _playSamples;
106    uint32_t                  _playSize;          // in bytes
107
108    FileWrapper&                    _recFile;
109    FileWrapper&                    _playFile;
110
111    uint32_t                  _currentMicLevel;
112    uint32_t                  _newMicLevel;
113
114    bool                      _typingStatus;
115
116    int _playDelayMS;
117    int _recDelayMS;
118    int _clockDrift;
119    int high_delay_counter_;
120};
121
122}  // namespace webrtc
123
124#endif  // WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_BUFFER_H
125