/*
 *  Copyright (c) 2013 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.
 */

#include "webrtc/modules/audio_device/dummy/audio_device_dummy.h"

namespace webrtc {

int32_t AudioDeviceDummy::ActiveAudioLayer(
    AudioDeviceModule::AudioLayer& audioLayer) const {
  return -1;
}

int32_t AudioDeviceDummy::Init() { return 0; }

int32_t AudioDeviceDummy::Terminate() { return 0; }

bool AudioDeviceDummy::Initialized() const { return true; }

int16_t AudioDeviceDummy::PlayoutDevices() { return -1; }

int16_t AudioDeviceDummy::RecordingDevices() { return -1; }

int32_t AudioDeviceDummy::PlayoutDeviceName(uint16_t index,
                                            char name[kAdmMaxDeviceNameSize],
                                            char guid[kAdmMaxGuidSize]) {
  return -1;
}

int32_t AudioDeviceDummy::RecordingDeviceName(uint16_t index,
                                              char name[kAdmMaxDeviceNameSize],
                                              char guid[kAdmMaxGuidSize]) {
  return -1;
}

int32_t AudioDeviceDummy::SetPlayoutDevice(uint16_t index) { return -1; }

int32_t AudioDeviceDummy::SetPlayoutDevice(
    AudioDeviceModule::WindowsDeviceType device) {
  return -1;
}

int32_t AudioDeviceDummy::SetRecordingDevice(uint16_t index) { return -1; }

int32_t AudioDeviceDummy::SetRecordingDevice(
    AudioDeviceModule::WindowsDeviceType device) {
  return -1;
}

int32_t AudioDeviceDummy::PlayoutIsAvailable(bool& available) { return -1; }

int32_t AudioDeviceDummy::InitPlayout() { return -1; }

bool AudioDeviceDummy::PlayoutIsInitialized() const { return false; }

int32_t AudioDeviceDummy::RecordingIsAvailable(bool& available) { return -1; }

int32_t AudioDeviceDummy::InitRecording() { return -1; }

bool AudioDeviceDummy::RecordingIsInitialized() const { return false; }

int32_t AudioDeviceDummy::StartPlayout() { return -1; }

int32_t AudioDeviceDummy::StopPlayout() { return -1; }

bool AudioDeviceDummy::Playing() const { return false; }

int32_t AudioDeviceDummy::StartRecording() { return -1; }

int32_t AudioDeviceDummy::StopRecording() { return -1; }

bool AudioDeviceDummy::Recording() const { return false; }

int32_t AudioDeviceDummy::SetAGC(bool enable) { return -1; }

bool AudioDeviceDummy::AGC() const { return false; }

int32_t AudioDeviceDummy::SetWaveOutVolume(uint16_t volumeLeft,
                                           uint16_t volumeRight) {
  return -1;
}

int32_t AudioDeviceDummy::WaveOutVolume(uint16_t& volumeLeft,
                                        uint16_t& volumeRight) const {
  return -1;
}

int32_t AudioDeviceDummy::InitSpeaker() { return -1; }

bool AudioDeviceDummy::SpeakerIsInitialized() const { return false; }

int32_t AudioDeviceDummy::InitMicrophone() { return -1; }

bool AudioDeviceDummy::MicrophoneIsInitialized() const { return false; }

int32_t AudioDeviceDummy::SpeakerVolumeIsAvailable(bool& available) {
  return -1;
}

int32_t AudioDeviceDummy::SetSpeakerVolume(uint32_t volume) { return -1; }

int32_t AudioDeviceDummy::SpeakerVolume(uint32_t& volume) const { return -1; }

int32_t AudioDeviceDummy::MaxSpeakerVolume(uint32_t& maxVolume) const {
  return -1;
}

int32_t AudioDeviceDummy::MinSpeakerVolume(uint32_t& minVolume) const {
  return -1;
}

int32_t AudioDeviceDummy::SpeakerVolumeStepSize(uint16_t& stepSize) const {
  return -1;
}

int32_t AudioDeviceDummy::MicrophoneVolumeIsAvailable(bool& available) {
  return -1;
}

int32_t AudioDeviceDummy::SetMicrophoneVolume(uint32_t volume) { return -1; }

int32_t AudioDeviceDummy::MicrophoneVolume(uint32_t& volume) const {
  return -1;
}

int32_t AudioDeviceDummy::MaxMicrophoneVolume(uint32_t& maxVolume) const {
  return -1;
}

int32_t AudioDeviceDummy::MinMicrophoneVolume(uint32_t& minVolume) const {
  return -1;
}

int32_t AudioDeviceDummy::MicrophoneVolumeStepSize(uint16_t& stepSize) const {
  return -1;
}

int32_t AudioDeviceDummy::SpeakerMuteIsAvailable(bool& available) { return -1; }

int32_t AudioDeviceDummy::SetSpeakerMute(bool enable) { return -1; }

int32_t AudioDeviceDummy::SpeakerMute(bool& enabled) const { return -1; }

int32_t AudioDeviceDummy::MicrophoneMuteIsAvailable(bool& available) {
  return -1;
}

int32_t AudioDeviceDummy::SetMicrophoneMute(bool enable) { return -1; }

int32_t AudioDeviceDummy::MicrophoneMute(bool& enabled) const { return -1; }

int32_t AudioDeviceDummy::MicrophoneBoostIsAvailable(bool& available) {
  return -1;
}

int32_t AudioDeviceDummy::SetMicrophoneBoost(bool enable) { return -1; }

int32_t AudioDeviceDummy::MicrophoneBoost(bool& enabled) const { return -1; }

int32_t AudioDeviceDummy::StereoPlayoutIsAvailable(bool& available) {
  return -1;
}
int32_t AudioDeviceDummy::SetStereoPlayout(bool enable) { return -1; }

int32_t AudioDeviceDummy::StereoPlayout(bool& enabled) const { return -1; }

int32_t AudioDeviceDummy::StereoRecordingIsAvailable(bool& available) {
  return -1;
}

int32_t AudioDeviceDummy::SetStereoRecording(bool enable) { return -1; }

int32_t AudioDeviceDummy::StereoRecording(bool& enabled) const { return -1; }

int32_t AudioDeviceDummy::SetPlayoutBuffer(
    const AudioDeviceModule::BufferType type,
    uint16_t sizeMS) {
  return -1;
}

int32_t AudioDeviceDummy::PlayoutBuffer(AudioDeviceModule::BufferType& type,
                                        uint16_t& sizeMS) const {
  return -1;
}

int32_t AudioDeviceDummy::PlayoutDelay(uint16_t& delayMS) const { return -1; }

int32_t AudioDeviceDummy::RecordingDelay(uint16_t& delayMS) const { return -1; }

int32_t AudioDeviceDummy::CPULoad(uint16_t& load) const { return -1; }

bool AudioDeviceDummy::PlayoutWarning() const { return false; }

bool AudioDeviceDummy::PlayoutError() const { return false; }

bool AudioDeviceDummy::RecordingWarning() const { return false; }

bool AudioDeviceDummy::RecordingError() const { return false; }

void AudioDeviceDummy::ClearPlayoutWarning() {}

void AudioDeviceDummy::ClearPlayoutError() {}

void AudioDeviceDummy::ClearRecordingWarning() {}

void AudioDeviceDummy::ClearRecordingError() {}

void AudioDeviceDummy::AttachAudioBuffer(AudioDeviceBuffer* audioBuffer) {}
}  // namespace webrtc
