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