/*
 *  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.
 */

// This sub-API supports the following functionalities:
//
//  - Audio device handling.
//  - Device information.
//  - CPU load monitoring.
//
// Usage example, omitting error checking:
//
//  using namespace webrtc;
//  VoiceEngine* voe = VoiceEngine::Create();
//  VoEBase* base = VoEBase::GetInterface(voe);
//  VoEHardware* hardware  = VoEHardware::GetInterface(voe);
//  base->Init();
//  ...
//  int n_devices = hardware->GetNumOfPlayoutDevices();
//  ...
//  base->Terminate();
//  base->Release();
//  hardware->Release();
//  VoiceEngine::Delete(voe);
//
#ifndef WEBRTC_VOICE_ENGINE_VOE_HARDWARE_H
#define WEBRTC_VOICE_ENGINE_VOE_HARDWARE_H

#include "webrtc/common_types.h"

namespace webrtc {

class VoiceEngine;

class WEBRTC_DLLEXPORT VoEHardware
{
public:
    // Factory for the VoEHardware sub-API. Increases an internal
    // reference counter if successful. Returns NULL if the API is not
    // supported or if construction fails.
    static VoEHardware* GetInterface(VoiceEngine* voiceEngine);

    // Releases the VoEHardware sub-API and decreases an internal
    // reference counter. Returns the new reference count. This value should
    // be zero for all sub-API:s before the VoiceEngine object can be safely
    // deleted.
    virtual int Release() = 0;

    // Gets the number of audio devices available for recording.
    virtual int GetNumOfRecordingDevices(int& devices) = 0;

    // Gets the number of audio devices available for playout.
    virtual int GetNumOfPlayoutDevices(int& devices) = 0;

    // Gets the name of a specific recording device given by an |index|.
    // On Windows Vista/7, it also retrieves an additional unique ID
    // (GUID) for the recording device.
    virtual int GetRecordingDeviceName(int index, char strNameUTF8[128],
                                       char strGuidUTF8[128]) = 0;

    // Gets the name of a specific playout device given by an |index|.
    // On Windows Vista/7, it also retrieves an additional unique ID
    // (GUID) for the playout device.
    virtual int GetPlayoutDeviceName(int index, char strNameUTF8[128],
                                     char strGuidUTF8[128]) = 0;

    // Sets the audio device used for recording.
    virtual int SetRecordingDevice(
        int index, StereoChannel recordingChannel = kStereoBoth) = 0;

    // Sets the audio device used for playout.
    virtual int SetPlayoutDevice(int index) = 0;

    // Sets the type of audio device layer to use.
    virtual int SetAudioDeviceLayer(AudioLayers audioLayer) = 0;

    // Gets the currently used (active) audio device layer.
    virtual int GetAudioDeviceLayer(AudioLayers& audioLayer) = 0;

    // Native sample rate controls (samples/sec)
    virtual int SetRecordingSampleRate(unsigned int samples_per_sec) = 0;
    virtual int RecordingSampleRate(unsigned int* samples_per_sec) const = 0;
    virtual int SetPlayoutSampleRate(unsigned int samples_per_sec) = 0;
    virtual int PlayoutSampleRate(unsigned int* samples_per_sec) const = 0;

    virtual bool BuiltInAECIsAvailable() const = 0;
    virtual int EnableBuiltInAEC(bool enable) = 0;

    // To be removed. Don't use.
    virtual bool BuiltInAECIsEnabled() const { return false; }
    virtual int GetRecordingDeviceStatus(bool& isAvailable) { return -1; }
    virtual int GetPlayoutDeviceStatus(bool& isAvailable) { return -1; }
    virtual int ResetAudioDevice() { return -1; }
    virtual int AudioDeviceControl(unsigned int par1, unsigned int par2,
            unsigned int par3) { return -1; }
    virtual int SetLoudspeakerStatus(bool enable) { return -1; }
    virtual int GetLoudspeakerStatus(bool& enabled) { return -1; }
    virtual int GetCPULoad(int& loadPercent) { return -1; }


protected:
    VoEHardware() {}
    virtual ~VoEHardware() {}
};

}  // namespace webrtc

#endif  //  WEBRTC_VOICE_ENGINE_VOE_HARDWARE_H
