/*
 *  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_ANDROID_OPENSLES_H
#define WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_ANDROID_OPENSLES_H

#include "audio_device_generic.h"
#include "critical_section_wrapper.h"

#include <jni.h> // For accessing AudioDeviceAndroid.java
#include <stdio.h>
#include <stdlib.h>

#include <SLES/OpenSLES.h>
#include <SLES/OpenSLES_Android.h>
#include <SLES/OpenSLES_AndroidConfiguration.h>

namespace webrtc
{
class EventWrapper;

const WebRtc_UWord32 N_MAX_INTERFACES = 3;
const WebRtc_UWord32 N_MAX_OUTPUT_DEVICES = 6;
const WebRtc_UWord32 N_MAX_INPUT_DEVICES = 3;

const WebRtc_UWord32 N_REC_SAMPLES_PER_SEC = 16000;//44000;  // Default fs
const WebRtc_UWord32 N_PLAY_SAMPLES_PER_SEC = 16000;//44000; // Default fs

const WebRtc_UWord32 N_REC_CHANNELS = 1; // default is mono recording
const WebRtc_UWord32 N_PLAY_CHANNELS = 1; // default is mono playout

const WebRtc_UWord32 REC_BUF_SIZE_IN_SAMPLES = 480; // Handle max 10 ms @ 48 kHz
const WebRtc_UWord32 PLAY_BUF_SIZE_IN_SAMPLES = 480;

// Number of the buffers in playout queue
const WebRtc_UWord16 N_PLAY_QUEUE_BUFFERS = 2;
// Number of buffers in recording queue
const WebRtc_UWord16 N_REC_QUEUE_BUFFERS = 2;
// Number of 10 ms recording blocks in rec buffer
const WebRtc_UWord16 N_REC_BUFFERS = 20;

class ThreadWrapper;

class AudioDeviceAndroidOpenSLES: public AudioDeviceGeneric
{
public:
    AudioDeviceAndroidOpenSLES(const WebRtc_Word32 id);
    ~AudioDeviceAndroidOpenSLES();

    // Retrieve the currently utilized audio layer
    virtual WebRtc_Word32
            ActiveAudioLayer(AudioDeviceModule::AudioLayer& audioLayer) const;

    // Main initializaton and termination
    virtual WebRtc_Word32 Init();
    virtual WebRtc_Word32 Terminate();
    virtual bool Initialized() const;

    // Device enumeration
    virtual WebRtc_Word16 PlayoutDevices();
    virtual WebRtc_Word16 RecordingDevices();
    virtual WebRtc_Word32
            PlayoutDeviceName(WebRtc_UWord16 index,
                              WebRtc_Word8 name[kAdmMaxDeviceNameSize],
                              WebRtc_Word8 guid[kAdmMaxGuidSize]);
    virtual WebRtc_Word32
            RecordingDeviceName(WebRtc_UWord16 index,
                                WebRtc_Word8 name[kAdmMaxDeviceNameSize],
                                WebRtc_Word8 guid[kAdmMaxGuidSize]);

    // Device selection
    virtual WebRtc_Word32 SetPlayoutDevice(WebRtc_UWord16 index);
    virtual WebRtc_Word32
            SetPlayoutDevice(AudioDeviceModule::WindowsDeviceType device);
    virtual WebRtc_Word32 SetRecordingDevice(WebRtc_UWord16 index);
    virtual WebRtc_Word32
            SetRecordingDevice(AudioDeviceModule::WindowsDeviceType device);

    // Audio transport initialization
    virtual WebRtc_Word32 PlayoutIsAvailable(bool& available);
    virtual WebRtc_Word32 InitPlayout();
    virtual bool PlayoutIsInitialized() const;
    virtual WebRtc_Word32 RecordingIsAvailable(bool& available);
    virtual WebRtc_Word32 InitRecording();
    virtual bool RecordingIsInitialized() const;

    // Audio transport control
    virtual WebRtc_Word32 StartPlayout();
    virtual WebRtc_Word32 StopPlayout();
    virtual bool Playing() const;
    virtual WebRtc_Word32 StartRecording();
    virtual WebRtc_Word32 StopRecording();
    virtual bool Recording() const;

    // Microphone Automatic Gain Control (AGC)
    virtual WebRtc_Word32 SetAGC(bool enable);
    virtual bool AGC() const;

    // Volume control based on the Windows Wave API (Windows only)
    virtual WebRtc_Word32 SetWaveOutVolume(WebRtc_UWord16 volumeLeft,
                                           WebRtc_UWord16 volumeRight);
    virtual WebRtc_Word32 WaveOutVolume(WebRtc_UWord16& volumeLeft,
                                        WebRtc_UWord16& volumeRight) const;

    // Audio mixer initialization
    virtual WebRtc_Word32 SpeakerIsAvailable(bool& available);
    virtual WebRtc_Word32 InitSpeaker();
    virtual bool SpeakerIsInitialized() const;
    SLPlayItf playItf;
    virtual WebRtc_Word32 MicrophoneIsAvailable(bool& available);
    virtual WebRtc_Word32 InitMicrophone();
    virtual bool MicrophoneIsInitialized() const;

    // Speaker volume controls
    virtual WebRtc_Word32 SpeakerVolumeIsAvailable(bool& available);
    virtual WebRtc_Word32 SetSpeakerVolume(WebRtc_UWord32 volume);
    virtual WebRtc_Word32 SpeakerVolume(WebRtc_UWord32& volume) const;
    virtual WebRtc_Word32 MaxSpeakerVolume(WebRtc_UWord32& maxVolume) const;
    virtual WebRtc_Word32 MinSpeakerVolume(WebRtc_UWord32& minVolume) const;
    virtual WebRtc_Word32 SpeakerVolumeStepSize(WebRtc_UWord16& stepSize) const;

    // Microphone volume controls
    virtual WebRtc_Word32 MicrophoneVolumeIsAvailable(bool& available);
    virtual WebRtc_Word32 SetMicrophoneVolume(WebRtc_UWord32 volume);
    virtual WebRtc_Word32 MicrophoneVolume(WebRtc_UWord32& volume) const;
    virtual WebRtc_Word32 MaxMicrophoneVolume(WebRtc_UWord32& maxVolume) const;
    virtual WebRtc_Word32 MinMicrophoneVolume(WebRtc_UWord32& minVolume) const;
    virtual WebRtc_Word32
            MicrophoneVolumeStepSize(WebRtc_UWord16& stepSize) const;

    // Speaker mute control
    virtual WebRtc_Word32 SpeakerMuteIsAvailable(bool& available);
    virtual WebRtc_Word32 SetSpeakerMute(bool enable);
    virtual WebRtc_Word32 SpeakerMute(bool& enabled) const;

    // Microphone mute control
    virtual WebRtc_Word32 MicrophoneMuteIsAvailable(bool& available);
    virtual WebRtc_Word32 SetMicrophoneMute(bool enable);
    virtual WebRtc_Word32 MicrophoneMute(bool& enabled) const;

    // Microphone boost control
    virtual WebRtc_Word32 MicrophoneBoostIsAvailable(bool& available);
    virtual WebRtc_Word32 SetMicrophoneBoost(bool enable);
    virtual WebRtc_Word32 MicrophoneBoost(bool& enabled) const;

    // Stereo support
    virtual WebRtc_Word32 StereoPlayoutIsAvailable(bool& available);
    virtual WebRtc_Word32 SetStereoPlayout(bool enable);
    virtual WebRtc_Word32 StereoPlayout(bool& enabled) const;
    virtual WebRtc_Word32 StereoRecordingIsAvailable(bool& available);
    virtual WebRtc_Word32 SetStereoRecording(bool enable);
    virtual WebRtc_Word32 StereoRecording(bool& enabled) const;

    // Delay information and control
    virtual WebRtc_Word32
            SetPlayoutBuffer(const AudioDeviceModule::BufferType type,
                             WebRtc_UWord16 sizeMS);
    virtual WebRtc_Word32 PlayoutBuffer(AudioDeviceModule::BufferType& type,
                                        WebRtc_UWord16& sizeMS) const;
    virtual WebRtc_Word32 PlayoutDelay(WebRtc_UWord16& delayMS) const;
    virtual WebRtc_Word32 RecordingDelay(WebRtc_UWord16& delayMS) const;

    // CPU load
    virtual WebRtc_Word32 CPULoad(WebRtc_UWord16& load) const;

    // Error and warning information
    virtual bool PlayoutWarning() const;
    virtual bool PlayoutError() const;
    virtual bool RecordingWarning() const;
    virtual bool RecordingError() const;
    virtual void ClearPlayoutWarning();
    virtual void ClearPlayoutError();
    virtual void ClearRecordingWarning();
    virtual void ClearRecordingError();

    // Attach audio buffer
    virtual void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer);

    // Speaker audio routing
    virtual WebRtc_Word32 SetLoudspeakerStatus(bool enable);
    virtual WebRtc_Word32 GetLoudspeakerStatus(bool& enable) const;

private:
    // Lock
    void Lock()
    {
        _critSect.Enter();
    };
    void UnLock()
    {
        _critSect.Leave();
    };

    static void PlayerSimpleBufferQueueCallback(
            SLAndroidSimpleBufferQueueItf queueItf,
            void *pContext);
    void PlayerSimpleBufferQueueCallbackHandler(
            SLAndroidSimpleBufferQueueItf queueItf);
    static void RecorderSimpleBufferQueueCallback(
            SLAndroidSimpleBufferQueueItf queueItf,
            void *pContext);
    void RecorderSimpleBufferQueueCallbackHandler(
            SLAndroidSimpleBufferQueueItf queueItf);
    void CheckErr(SLresult res);

    // Delay updates
    void UpdateRecordingDelay();
    void UpdatePlayoutDelay(WebRtc_UWord32 nSamplePlayed);

    // Init
    WebRtc_Word32 InitSampleRate();

    // Threads
    static bool RecThreadFunc(void*);
    static bool PlayThreadFunc(void*);
    bool RecThreadProcess();
    bool PlayThreadProcess();

    // Misc
    AudioDeviceBuffer* _ptrAudioBuffer;
    CriticalSectionWrapper& _critSect;
    WebRtc_Word32 _id;

    // audio unit
    SLObjectItf _slEngineObject;

    // playout device
    SLObjectItf _slPlayer;
    SLEngineItf _slEngine;
    SLPlayItf _slPlayerPlay;
    SLAndroidSimpleBufferQueueItf _slPlayerSimpleBufferQueue;
    SLObjectItf _slOutputMixObject;
    SLVolumeItf _slSpeakerVolume;

    // recording device
    SLObjectItf _slRecorder;
    SLRecordItf _slRecorderRecord;
    SLAudioIODeviceCapabilitiesItf _slAudioIODeviceCapabilities;
    SLAndroidSimpleBufferQueueItf _slRecorderSimpleBufferQueue;
    SLDeviceVolumeItf _slMicVolume;

    WebRtc_UWord32 _micDeviceId;

    // Events
    EventWrapper& _timeEventRec;
    // Threads
    ThreadWrapper* _ptrThreadRec;
    WebRtc_UWord32 _recThreadID;
    // TODO(xians), remove the following flag
    bool _recThreadIsInitialized;

    // Playout buffer
    WebRtc_Word8 _playQueueBuffer[N_PLAY_QUEUE_BUFFERS][2
            * PLAY_BUF_SIZE_IN_SAMPLES];
    WebRtc_UWord32 _playQueueSeq;
    // Recording buffer
    WebRtc_Word8 _recQueueBuffer[N_REC_QUEUE_BUFFERS][2
            * REC_BUF_SIZE_IN_SAMPLES];
    WebRtc_UWord32 _recQueueSeq;
    WebRtc_Word8 _recBuffer[N_REC_BUFFERS][2*REC_BUF_SIZE_IN_SAMPLES];
    WebRtc_UWord32 _recLength[N_REC_BUFFERS];
    WebRtc_UWord32 _recSeqNumber[N_REC_BUFFERS];
    WebRtc_UWord32 _recCurrentSeq;
    // Current total size all data in buffers, used for delay estimate
    WebRtc_UWord32 _recBufferTotalSize;

    // States
    bool _recordingDeviceIsSpecified;
    bool _playoutDeviceIsSpecified;
    bool _initialized;
    bool _recording;
    bool _playing;
    bool _recIsInitialized;
    bool _playIsInitialized;
    bool _micIsInitialized;
    bool _speakerIsInitialized;

    // Warnings and errors
    WebRtc_UWord16 _playWarning;
    WebRtc_UWord16 _playError;
    WebRtc_UWord16 _recWarning;
    WebRtc_UWord16 _recError;

    // Delay
    WebRtc_UWord16 _playoutDelay;
    WebRtc_UWord16 _recordingDelay;

    // AGC state
    bool _AGC;

    // The sampling rate to use with Audio Device Buffer
    WebRtc_UWord32 _adbSampleRate;
    // Stored device properties
    WebRtc_UWord32 _samplingRateIn; // Sampling frequency for Mic
    WebRtc_UWord32 _samplingRateOut; // Sampling frequency for Speaker
    WebRtc_UWord32 _maxSpeakerVolume; // The maximum speaker volume value
    WebRtc_UWord32 _minSpeakerVolume; // The minimum speaker volume value
    bool _loudSpeakerOn;
};

} // namespace webrtc

#endif  // WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_ANDROID_OPENSLES_H
