/*
 *  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 "modules/audio_device/dummy/audio_device_dummy.h"

namespace webrtc {

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

AudioDeviceGeneric::InitStatus AudioDeviceDummy::Init() {
  return InitStatus::OK;
}

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 0;
}

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

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

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

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

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::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::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::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::PlayoutDelay(uint16_t& delayMS) const {
  return -1;
}

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