/* AudioUsbALSA.h

Copyright (c) 2012, The Linux Foundation. All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above
      copyright notice, this list of conditions and the following
      disclaimer in the documentation and/or other materials provided
      with the distribution.
    * Neither the name of The Linux Foundation nor the names of its
      contributors may be used to endorse or promote products derived
      from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.*/

#ifndef ANDROID_AUDIO_USB_ALSA_H
#define ANDROID_AUDIO_USB_ALSA_H

#include <utils/List.h>
#include <hardware_legacy/AudioHardwareBase.h>

#include <hardware_legacy/AudioHardwareInterface.h>
#include <hardware_legacy/AudioSystemLegacy.h>
#include <system/audio.h>
#include <hardware/audio.h>
#include <utils/threads.h>

#define DEFAULT_BUFFER_SIZE   2048
#define POLL_TIMEOUT   3000
#define DEFAULT_CHANNEL_MODE  2
#define CHANNEL_MODE_ONE  1
#define PROXY_DEFAULT_SAMPLING_RATE 48000
#define SIGNAL_EVENT_TIMEOUT 1
#define SIGNAL_EVENT_KILLTHREAD 2

#define BUFFSIZE 1000000

#define PATH "/proc/asound/card1/stream0"

extern "C" {
   #include <sound/asound.h>
   #include "alsa_audio.h"
   #include "msm8960_use_cases.h"
}

#include <hardware/hardware.h>

namespace android_audio_legacy
{
using android::List;
using android::Mutex;
class AudioUsbALSA;

class AudioUsbALSA
{
private:
    int mproxypfdPlayback;
    int musbpfdPlayback;
    int mnfdsPlayback;
    int mnfdsRecording;
    int mtimeOut;
    int mtimeOutRecording;
    struct pcm *mproxyRecordingHandle;
    struct pcm *musbRecordingHandle;
    struct pcm *mproxyPlaybackHandle;
    struct pcm *musbPlaybackHandle;
    u_int8_t *mdstUsb_addr;
    u_int8_t *msrcProxy_addr;
    bool mkillPlayBackThread;
    bool mkillRecordingThread;
    pthread_t mPlaybackUsb;
    pthread_t mRecordingUsb;
    snd_use_case_mgr_t *mUcMgr;

    //Helper functions
    struct pcm * configureDevice(unsigned flags, char* hw, int sampleRate, int channelCount, int periodSize, bool playback);
    status_t syncPtr(struct pcm *handle, bool *killThread);

    //playback
    void pollForProxyData();
    void pollForUsbData();

    //recording
    void pollForUsbDataForRecording();
    void pollForProxyDataForRecording();

    status_t startDevice(pcm *handle, bool *killThread);

    void PlaybackThreadEntry();
    static void *PlaybackThreadWrapper(void *me);

    void RecordingThreadEntry();
    static void *RecordingThreadWrapper(void *me);

    status_t setHardwareParams(pcm *local_handle, uint32_t sampleRate, uint32_t channels, int periodSize);

    status_t setSoftwareParams(pcm *pcm, bool playback);

    status_t closeDevice(pcm *handle);

    status_t getCap(char * type, int &channels, int &sampleRate);
    int         getnumOfRates(char *rateStr);
    int         mchannelsPlayback;
    int         msampleRatePlayback;
    int         mchannelsCapture;
    int         msampleRateCapture;

public:
    AudioUsbALSA();
    virtual            ~AudioUsbALSA();

    void exitPlaybackThread(uint64_t writeVal);
    void exitRecordingThread(uint64_t writeVal);
    void setkillUsbRecordingThread(bool val);
    bool getkillUsbPlaybackThread() {
        return mkillPlayBackThread;
    }
    bool getkillUsbRecordingThread() {
        return mkillRecordingThread;
    }
    //Playback
    void startPlayback();

    //Capture
    void startRecording();
};

};        // namespace android_audio_legacy
#endif    // ANDROID_AUDIO_USB_ALSA_H
