diff --git a/src/modules/audio_device/main/interface/audio_device.h b/src/modules/audio_device/main/interface/audio_device.h new file mode 100644 index 000000000..ef95ecddd --- /dev/null +++ b/src/modules/audio_device/main/interface/audio_device.h @@ -0,0 +1,207 @@ +/* + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef MODULES_AUDIO_DEVICE_MAIN_INTERFACE_AUDIO_DEVICE_H_ +#define MODULES_AUDIO_DEVICE_MAIN_INTERFACE_AUDIO_DEVICE_H_ + +#include "modules/audio_device/include/audio_device_defines.h" +#include "modules/interface/module.h" + +namespace webrtc { + +class AudioDeviceModule : public RefCountedModule { + public: + enum ErrorCode { + kAdmErrNone = 0, + kAdmErrArgument = 1 + }; + + enum AudioLayer { + kPlatformDefaultAudio = 0, + kWindowsWaveAudio = 1, + kWindowsCoreAudio = 2, + kLinuxAlsaAudio = 3, + kLinuxPulseAudio = 4, + kDummyAudio = 5 + }; + + enum WindowsDeviceType { + kDefaultCommunicationDevice = -1, + kDefaultDevice = -2 + }; + + enum BufferType { + kFixedBufferSize = 0, + kAdaptiveBufferSize = 1 + }; + + enum ChannelType { + kChannelLeft = 0, + kChannelRight = 1, + kChannelBoth = 2 + }; + + public: + // Retrieve the currently utilized audio layer + virtual int32_t ActiveAudioLayer(AudioLayer* audioLayer) const = 0; + + // Error handling + virtual ErrorCode LastError() const = 0; + virtual int32_t RegisterEventObserver(AudioDeviceObserver* eventCallback) = 0; + + // Full-duplex transportation of PCM audio + virtual int32_t RegisterAudioCallback(AudioTransport* audioCallback) = 0; + + // Main initialization and termination + virtual int32_t Init() = 0; + virtual int32_t Terminate() = 0; + virtual bool Initialized() const = 0; + + // Device enumeration + virtual int16_t PlayoutDevices() = 0; + virtual int16_t RecordingDevices() = 0; + virtual int32_t PlayoutDeviceName(uint16_t index, + char name[kAdmMaxDeviceNameSize], + char guid[kAdmMaxGuidSize]) = 0; + virtual int32_t RecordingDeviceName(uint16_t index, + char name[kAdmMaxDeviceNameSize], + char guid[kAdmMaxGuidSize]) = 0; + + // Device selection + virtual int32_t SetPlayoutDevice(uint16_t index) = 0; + virtual int32_t SetPlayoutDevice(WindowsDeviceType device) = 0; + virtual int32_t SetRecordingDevice(uint16_t index) = 0; + virtual int32_t SetRecordingDevice(WindowsDeviceType device) = 0; + + // Audio transport initialization + virtual int32_t PlayoutIsAvailable(bool* available) = 0; + virtual int32_t InitPlayout() = 0; + virtual bool PlayoutIsInitialized() const = 0; + virtual int32_t RecordingIsAvailable(bool* available) = 0; + virtual int32_t InitRecording() = 0; + virtual bool RecordingIsInitialized() const = 0; + + // Audio transport control + virtual int32_t StartPlayout() = 0; + virtual int32_t StopPlayout() = 0; + virtual bool Playing() const = 0; + virtual int32_t StartRecording() = 0; + virtual int32_t StopRecording() = 0; + virtual bool Recording() const = 0; + + // Microphone Automatic Gain Control (AGC) + virtual int32_t SetAGC(bool enable) = 0; + virtual bool AGC() const = 0; + + // Volume control based on the Windows Wave API (Windows only) + virtual int32_t SetWaveOutVolume(uint16_t volumeLeft, + uint16_t volumeRight) = 0; + virtual int32_t WaveOutVolume(uint16_t* volumeLeft, + uint16_t* volumeRight) const = 0; + + // Audio mixer initialization + virtual int32_t SpeakerIsAvailable(bool* available) = 0; + virtual int32_t InitSpeaker() = 0; + virtual bool SpeakerIsInitialized() const = 0; + virtual int32_t MicrophoneIsAvailable(bool* available) = 0; + virtual int32_t InitMicrophone() = 0; + virtual bool MicrophoneIsInitialized() const = 0; + + // Speaker volume controls + virtual int32_t SpeakerVolumeIsAvailable(bool* available) = 0; + virtual int32_t SetSpeakerVolume(uint32_t volume) = 0; + virtual int32_t SpeakerVolume(uint32_t* volume) const = 0; + virtual int32_t MaxSpeakerVolume(uint32_t* maxVolume) const = 0; + virtual int32_t MinSpeakerVolume(uint32_t* minVolume) const = 0; + virtual int32_t SpeakerVolumeStepSize(uint16_t* stepSize) const = 0; + + // Microphone volume controls + virtual int32_t MicrophoneVolumeIsAvailable(bool* available) = 0; + virtual int32_t SetMicrophoneVolume(uint32_t volume) = 0; + virtual int32_t MicrophoneVolume(uint32_t* volume) const = 0; + virtual int32_t MaxMicrophoneVolume(uint32_t* maxVolume) const = 0; + virtual int32_t MinMicrophoneVolume(uint32_t* minVolume) const = 0; + virtual int32_t MicrophoneVolumeStepSize(uint16_t* stepSize) const = 0; + + // Speaker mute control + virtual int32_t SpeakerMuteIsAvailable(bool* available) = 0; + virtual int32_t SetSpeakerMute(bool enable) = 0; + virtual int32_t SpeakerMute(bool* enabled) const = 0; + + // Microphone mute control + virtual int32_t MicrophoneMuteIsAvailable(bool* available) = 0; + virtual int32_t SetMicrophoneMute(bool enable) = 0; + virtual int32_t MicrophoneMute(bool* enabled) const = 0; + + // Microphone boost control + virtual int32_t MicrophoneBoostIsAvailable(bool* available) = 0; + virtual int32_t SetMicrophoneBoost(bool enable) = 0; + virtual int32_t MicrophoneBoost(bool* enabled) const = 0; + + // Stereo support + virtual int32_t StereoPlayoutIsAvailable(bool* available) const = 0; + virtual int32_t SetStereoPlayout(bool enable) = 0; + virtual int32_t StereoPlayout(bool* enabled) const = 0; + virtual int32_t StereoRecordingIsAvailable(bool* available) const = 0; + virtual int32_t SetStereoRecording(bool enable) = 0; + virtual int32_t StereoRecording(bool* enabled) const = 0; + virtual int32_t SetRecordingChannel(const ChannelType channel) = 0; + virtual int32_t RecordingChannel(ChannelType* channel) const = 0; + + // Delay information and control + virtual int32_t SetPlayoutBuffer(const BufferType type, + uint16_t sizeMS = 0) = 0; + virtual int32_t PlayoutBuffer(BufferType* type, uint16_t* sizeMS) const = 0; + virtual int32_t PlayoutDelay(uint16_t* delayMS) const = 0; + virtual int32_t RecordingDelay(uint16_t* delayMS) const = 0; + + // CPU load + virtual int32_t CPULoad(uint16_t* load) const = 0; + + // Recording of raw PCM data + virtual int32_t StartRawOutputFileRecording( + const char pcmFileNameUTF8[kAdmMaxFileNameSize]) = 0; + virtual int32_t StopRawOutputFileRecording() = 0; + virtual int32_t StartRawInputFileRecording( + const char pcmFileNameUTF8[kAdmMaxFileNameSize]) = 0; + virtual int32_t StopRawInputFileRecording() = 0; + + // Native sample rate controls (samples/sec) + virtual int32_t SetRecordingSampleRate(const uint32_t samplesPerSec) = 0; + virtual int32_t RecordingSampleRate(uint32_t* samplesPerSec) const = 0; + virtual int32_t SetPlayoutSampleRate(const uint32_t samplesPerSec) = 0; + virtual int32_t PlayoutSampleRate(uint32_t* samplesPerSec) const = 0; + + // Mobile device specific functions + virtual int32_t ResetAudioDevice() = 0; + virtual int32_t SetLoudspeakerStatus(bool enable) = 0; + virtual int32_t GetLoudspeakerStatus(bool* enabled) const = 0; + + // *Experimental - not recommended for use.* + // Enables the Windows Core Audio built-in AEC. Fails on other platforms. + // + // Must be called before InitRecording(). When enabled: + // 1. StartPlayout() must be called before StartRecording(). + // 2. StopRecording() should be called before StopPlayout(). + // The reverse order may cause garbage audio to be rendered or the + // capture side to halt until StopRecording() is called. + virtual int32_t EnableBuiltInAEC(bool enable) { return -1; } + virtual bool BuiltInAECIsEnabled() const { return false; } + + protected: + virtual ~AudioDeviceModule() {}; +}; + +AudioDeviceModule* CreateAudioDeviceModule( + WebRtc_Word32 id, AudioDeviceModule::AudioLayer audioLayer); + +} // namespace webrtc + +#endif // MODULES_AUDIO_DEVICE_MAIN_INTERFACE_AUDIO_DEVICE_H_ diff --git a/src/modules/audio_device/main/interface/audio_device_defines.h b/src/modules/audio_device/main/interface/audio_device_defines.h new file mode 100644 index 000000000..ab7ed603c --- /dev/null +++ b/src/modules/audio_device/main/interface/audio_device_defines.h @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_DEFINES_H +#define WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_DEFINES_H + +#include "typedefs.h" + +namespace webrtc { + +static const int kAdmMaxDeviceNameSize = 128; +static const int kAdmMaxFileNameSize = 512; +static const int kAdmMaxGuidSize = 128; + +static const int kAdmMinPlayoutBufferSizeMs = 10; +static const int kAdmMaxPlayoutBufferSizeMs = 250; + +// ---------------------------------------------------------------------------- +// AudioDeviceObserver +// ---------------------------------------------------------------------------- + +class AudioDeviceObserver +{ +public: + enum ErrorCode + { + kRecordingError = 0, + kPlayoutError = 1 + }; + enum WarningCode + { + kRecordingWarning = 0, + kPlayoutWarning = 1 + }; + + virtual void OnErrorIsReported(const ErrorCode error) = 0; + virtual void OnWarningIsReported(const WarningCode warning) = 0; + +protected: + virtual ~AudioDeviceObserver() {} +}; + +// ---------------------------------------------------------------------------- +// AudioTransport +// ---------------------------------------------------------------------------- + +class AudioTransport +{ +public: + virtual int32_t RecordedDataIsAvailable(const void* audioSamples, + const uint32_t nSamples, + const uint8_t nBytesPerSample, + const uint8_t nChannels, + const uint32_t samplesPerSec, + const uint32_t totalDelayMS, + const int32_t clockDrift, + const uint32_t currentMicLevel, + uint32_t& newMicLevel) = 0; + + virtual int32_t NeedMorePlayData(const uint32_t nSamples, + const uint8_t nBytesPerSample, + const uint8_t nChannels, + const uint32_t samplesPerSec, + void* audioSamples, + uint32_t& nSamplesOut) = 0; + +protected: + virtual ~AudioTransport() {} +}; + +} // namespace webrtc + +#endif // WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_DEFINES_H