14765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev/* AudioUsbALSA.h
24765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
34765c439491ddda3de658e62cc4a64d10e726b34Iliyan MalchevCopyright (c) 2012, Code Aurora Forum. All rights reserved.
44765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
54765c439491ddda3de658e62cc4a64d10e726b34Iliyan MalchevRedistribution and use in source and binary forms, with or without
64765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevmodification, are permitted provided that the following conditions are
74765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevmet:
84765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    * Redistributions of source code must retain the above copyright
94765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev      notice, this list of conditions and the following disclaimer.
104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    * Redistributions in binary form must reproduce the above
114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev      copyright notice, this list of conditions and the following
124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev      disclaimer in the documentation and/or other materials provided
134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev      with the distribution.
144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    * Neither the name of Code Aurora Forum, Inc. nor the names of its
154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev      contributors may be used to endorse or promote products derived
164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev      from this software without specific prior written permission.
174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
184765c439491ddda3de658e62cc4a64d10e726b34Iliyan MalchevTHIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
194765c439491ddda3de658e62cc4a64d10e726b34Iliyan MalchevWARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
204765c439491ddda3de658e62cc4a64d10e726b34Iliyan MalchevMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
214765c439491ddda3de658e62cc4a64d10e726b34Iliyan MalchevARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
224765c439491ddda3de658e62cc4a64d10e726b34Iliyan MalchevBE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
234765c439491ddda3de658e62cc4a64d10e726b34Iliyan MalchevCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
244765c439491ddda3de658e62cc4a64d10e726b34Iliyan MalchevSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
254765c439491ddda3de658e62cc4a64d10e726b34Iliyan MalchevBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
264765c439491ddda3de658e62cc4a64d10e726b34Iliyan MalchevWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
274765c439491ddda3de658e62cc4a64d10e726b34Iliyan MalchevOR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
284765c439491ddda3de658e62cc4a64d10e726b34Iliyan MalchevIF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.*/
294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#ifndef ANDROID_AUDIO_USB_ALSA_H
314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define ANDROID_AUDIO_USB_ALSA_H
324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <utils/List.h>
344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <hardware_legacy/AudioHardwareBase.h>
354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <hardware_legacy/AudioHardwareInterface.h>
374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <hardware_legacy/AudioSystemLegacy.h>
384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <system/audio.h>
394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <hardware/audio.h>
404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <utils/threads.h>
414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define DEFAULT_BUFFER_SIZE   2048
434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define POLL_TIMEOUT   3000
444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define DEFAULT_CHANNEL_MODE  2
454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define CHANNEL_MODE_ONE  1
464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define PROXY_DEFAULT_SAMPLING_RATE 48000
474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define SIGNAL_EVENT_TIMEOUT 1
484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define SIGNAL_EVENT_KILLTHREAD 2
494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define BUFFSIZE 1000000
514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define PATH "/proc/asound/card1/stream0"
534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevextern "C" {
554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev   #include <sound/asound.h>
564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev   #include "alsa_audio.h"
574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev   #include "msm8960_use_cases.h"
584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <hardware/hardware.h>
614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevnamespace android_audio_legacy
634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevusing android::List;
654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevusing android::Mutex;
664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevclass AudioUsbALSA;
674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevclass AudioUsbALSA
694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevprivate:
714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int mproxypfdPlayback;
724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int musbpfdPlayback;
734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int mnfdsPlayback;
744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int mnfdsRecording;
754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int mtimeOut;
764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int mtimeOutRecording;
774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct pcm *mproxyRecordingHandle;
784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct pcm *musbRecordingHandle;
794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct pcm *mproxyPlaybackHandle;
804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct pcm *musbPlaybackHandle;
814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    u_int8_t *mdstUsb_addr;
824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    u_int8_t *msrcProxy_addr;
834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    bool mkillPlayBackThread;
844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    bool mkillRecordingThread;
854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    pthread_t mPlaybackUsb;
864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    pthread_t mRecordingUsb;
874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    snd_use_case_mgr_t *mUcMgr;
884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    //Helper functions
909746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani    struct pcm * configureDevice(unsigned flags, char* hw, int sampleRate, int channelCount, int periodSize, bool playback);
914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    status_t syncPtr(struct pcm *handle, bool *killThread);
924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    //playback
944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    void pollForProxyData();
954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    void pollForUsbData();
964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    //recording
984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    void pollForUsbDataForRecording();
994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    void pollForProxyDataForRecording();
1004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    status_t startDevice(pcm *handle, bool *killThread);
1024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    void PlaybackThreadEntry();
1044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    static void *PlaybackThreadWrapper(void *me);
1054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    void RecordingThreadEntry();
1074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    static void *RecordingThreadWrapper(void *me);
1084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1099746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani    status_t setHardwareParams(pcm *local_handle, uint32_t sampleRate, uint32_t channels, int periodSize);
1104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1119746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani    status_t setSoftwareParams(pcm *pcm, bool playback);
1124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    status_t closeDevice(pcm *handle);
1144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1159746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani    status_t getCap(char * type, int &channels, int &sampleRate);
1164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int         getnumOfRates(char *rateStr);
1174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int         mchannelsPlayback;
1184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int         msampleRatePlayback;
1194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int         mchannelsCapture;
1204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int         msampleRateCapture;
1219746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani
1229746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudanipublic:
1239746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani    AudioUsbALSA();
1249746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani    virtual            ~AudioUsbALSA();
1259746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani
1269746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani    void exitPlaybackThread(uint64_t writeVal);
1279746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani    void exitRecordingThread(uint64_t writeVal);
1289746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani    void setkillUsbRecordingThread(bool val);
1299746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani    bool getkillUsbPlaybackThread() {
1309746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani        return mkillPlayBackThread;
1319746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani    }
1329746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani    bool getkillUsbRecordingThread() {
1339746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani        return mkillRecordingThread;
1349746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani    }
1359746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani    //Playback
1369746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani    void startPlayback();
1379746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani
1389746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani    //Capture
1399746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani    void startRecording();
1404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev};
1414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev};        // namespace android_audio_legacy
1434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif    // ANDROID_AUDIO_USB_ALSA_H
144