14765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev/* AudioHardwareALSA.h 24765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ** 34765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ** Copyright 2008-2010, Wind River Systems 44765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ** Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved. 54765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ** 64765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ** Licensed under the Apache License, Version 2.0 (the "License"); 74765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ** you may not use this file except in compliance with the License. 84765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ** You may obtain a copy of the License at 94765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ** 104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ** http://www.apache.org/licenses/LICENSE-2.0 114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ** 124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ** Unless required by applicable law or agreed to in writing, software 134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ** distributed under the License is distributed on an "AS IS" BASIS, 144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ** See the License for the specific language governing permissions and 164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ** limitations under the License. 174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev */ 184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#ifndef ANDROID_AUDIO_HARDWARE_ALSA_H 204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define ANDROID_AUDIO_HARDWARE_ALSA_H 214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 2292919435cbe39335d24a7c0fa6a0adfd4d47d974Ajay Dudani#define QCOM_CSDCLIENT_ENABLED 1 2392919435cbe39335d24a7c0fa6a0adfd4d47d974Ajay Dudani 244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <utils/List.h> 254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <hardware_legacy/AudioHardwareBase.h> 264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <hardware_legacy/AudioHardwareInterface.h> 284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <hardware_legacy/AudioSystemLegacy.h> 294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <system/audio.h> 304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <hardware/audio.h> 314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <utils/threads.h> 325ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani#include <dlfcn.h> 335ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani 349746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_USBAUDIO_ENABLED 354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <AudioUsbALSA.h> 369746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#endif 374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevextern "C" { 394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev #include <sound/asound.h> 404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev #include "alsa_audio.h" 414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev #include "msm8960_use_cases.h" 424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev} 434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <hardware/hardware.h> 454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevnamespace android_audio_legacy 474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevusing android::List; 494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevusing android::Mutex; 504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevclass AudioHardwareALSA; 514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev/** 534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * The id of ALSA module 544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev */ 554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define ALSA_HARDWARE_MODULE_ID "alsa" 564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define ALSA_HARDWARE_NAME "alsa" 574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 58a4e236767e1253c0393b15a82c3fe1cd1304c2ffGlenn Kasten#define DEFAULT_SAMPLING_RATE 48000 594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define DEFAULT_CHANNEL_MODE 2 604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define VOICE_SAMPLING_RATE 8000 614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define VOICE_CHANNEL_MODE 1 62018d1c5b5746dc189b2d7b86a87f1d2fd219994aSathishKumar Mani#define PLAYBACK_LATENCY 170000 634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define RECORD_LATENCY 96000 644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define VOICE_LATENCY 85333 65018d1c5b5746dc189b2d7b86a87f1d2fd219994aSathishKumar Mani#define DEFAULT_BUFFER_SIZE 4096 66bf1c87481d62736cab8832e9085c121fbafdbb6bSathishKumar Mani//4032 = 336(kernel buffer size) * 2(bytes pcm_16) * 6(number of channels) 67bf1c87481d62736cab8832e9085c121fbafdbb6bSathishKumar Mani#define DEFAULT_MULTI_CHANNEL_BUF_SIZE 4032 68018d1c5b5746dc189b2d7b86a87f1d2fd219994aSathishKumar Mani#define DEFAULT_VOICE_BUFFER_SIZE 2048 69e9c7854606c7b731eae7748c15db180ff7e4a368SathishKumar Mani#define PLAYBACK_LOW_LATENCY_BUFFER_SIZE 1024 7077780382b45794eb5bc0e8589d9b7c96bb406772SathishKumar Mani#define PLAYBACK_LOW_LATENCY 22000 7177780382b45794eb5bc0e8589d9b7c96bb406772SathishKumar Mani#define PLAYBACK_LOW_LATENCY_MEASURED 42000 728861338c2a520669a870ee5f3e0c740e438c99bcSathishKumar Mani#define DEFAULT_IN_BUFFER_SIZE 320 7377780382b45794eb5bc0e8589d9b7c96bb406772SathishKumar Mani#define MIN_CAPTURE_BUFFER_SIZE_PER_CH 320 7477780382b45794eb5bc0e8589d9b7c96bb406772SathishKumar Mani#define MAX_CAPTURE_BUFFER_SIZE_PER_CH 2048 754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define FM_BUFFER_SIZE 1024 764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define VOIP_SAMPLING_RATE_8K 8000 784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define VOIP_SAMPLING_RATE_16K 16000 794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define VOIP_DEFAULT_CHANNEL_MODE 1 804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define VOIP_BUFFER_SIZE_8K 320 814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define VOIP_BUFFER_SIZE_16K 640 824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define VOIP_BUFFER_MAX_SIZE VOIP_BUFFER_SIZE_16K 834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define VOIP_PLAYBACK_LATENCY 6400 844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define VOIP_RECORD_LATENCY 6400 854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define MODE_IS127 0x2 874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define MODE_4GV_NB 0x3 884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define MODE_4GV_WB 0x4 894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define MODE_AMR 0x5 904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define MODE_AMR_WB 0xD 914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define MODE_PCM 0xC 924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define DUALMIC_KEY "dualmic_enabled" 944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define FLUENCE_KEY "fluence" 954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define ANC_KEY "anc_enabled" 964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define TTY_MODE_KEY "tty_mode" 974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define BT_SAMPLERATE_KEY "bt_samplerate" 984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define BTHEADSET_VGS "bt_headset_vgs" 994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define WIDEVOICE_KEY "wide_voice_enable" 1004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define VOIPRATE_KEY "voip_rate" 1014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define FENS_KEY "fens_enable" 1024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define ST_KEY "st_enable" 1034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define INCALLMUSIC_KEY "incall_music_enabled" 1044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 1054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define ANC_FLAG 0x00000001 1064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define DMIC_FLAG 0x00000002 1074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define QMIC_FLAG 0x00000004 1089746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_SSR_ENABLED 1094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define SSRQMIC_FLAG 0x00000008 1104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif 1114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 1124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define TTY_OFF 0x00000010 1134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define TTY_FULL 0x00000020 1144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define TTY_VCO 0x00000040 1154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define TTY_HCO 0x00000080 1164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define TTY_CLEAR 0xFFFFFF0F 1174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 1184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define LPA_SESSION_ID 1 1194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define TUNNEL_SESSION_ID 2 1209746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_USBAUDIO_ENABLED 1214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int USBPLAYBACKBIT_MUSIC = (1 << 0); 1224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int USBPLAYBACKBIT_VOICECALL = (1 << 1); 1234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int USBPLAYBACKBIT_VOIPCALL = (1 << 2); 1244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int USBPLAYBACKBIT_FM = (1 << 3); 1254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int USBPLAYBACKBIT_LPA = (1 << 4); 1264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 1274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int USBRECBIT_REC = (1 << 0); 1284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int USBRECBIT_VOICECALL = (1 << 1); 1294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int USBRECBIT_VOIPCALL = (1 << 2); 1304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int USBRECBIT_FM = (1 << 3); 1319746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#endif 1324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 1334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define DEVICE_SPEAKER_HEADSET "Speaker Headset" 1344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define DEVICE_HEADSET "Headset" 1354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define DEVICE_HEADPHONES "Headphones" 1364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 1379746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_SSR_ENABLED 1384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define COEFF_ARRAY_SIZE 4 1394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define FILT_SIZE ((512+1)* 6) /* # ((FFT bins)/2+1)*numOutputs */ 1404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define SSR_FRAME_SIZE 512 1414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define SSR_INPUT_FRAME_SIZE (SSR_FRAME_SIZE * 4) 1424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define SSR_OUTPUT_FRAME_SIZE (SSR_FRAME_SIZE * 6) 1434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif 1444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 1454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define MODE_CALL_KEY "CALL_KEY" 1464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 1474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstruct alsa_device_t; 1484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic uint32_t FLUENCE_MODE_ENDFIRE = 0; 1494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic uint32_t FLUENCE_MODE_BROADSIDE = 1; 1504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 1514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevenum { 1524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev INCALL_REC_MONO, 1534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev INCALL_REC_STEREO, 1544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}; 1554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 1569746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudanienum audio_call_mode { 1579746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani CS_INACTIVE = 0x0, 1589746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani CS_ACTIVE = 0x1, 1599746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani CS_HOLD = 0x2, 1609746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani IMS_INACTIVE = 0x0, 1619746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani IMS_ACTIVE = 0x10, 1629746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani IMS_HOLD = 0x20 1639746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani}; 1649746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani 1659746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani 1664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstruct alsa_handle_t { 1674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev alsa_device_t * module; 1684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev uint32_t devices; 1694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev char useCase[MAX_STR_LEN]; 1704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev struct pcm * handle; 1714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev snd_pcm_format_t format; 1724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev uint32_t channels; 17361f449827974e117406693ef2cc6bdfdaf1fc00bEric Laurent audio_channel_mask_t channelMask; 1744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev uint32_t sampleRate; 1754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev unsigned int latency; // Delay in usec 1764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev unsigned int bufferSize; // Size of sample buffer 1774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev unsigned int periodSize; 1788861338c2a520669a870ee5f3e0c740e438c99bcSathishKumar Mani bool isDeepbufferOutput; 1794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev struct pcm * rxHandle; 1804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev snd_use_case_mgr_t *ucMgr; 1814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}; 1824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 1834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevtypedef List < alsa_handle_t > ALSAHandleList; 1844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 1854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstruct use_case_t { 1864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev char useCase[MAX_STR_LEN]; 1874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}; 1884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 1894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevtypedef List < use_case_t > ALSAUseCaseList; 1904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 1914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstruct alsa_device_t { 1924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev hw_device_t common; 1934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 1944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t (*init)(alsa_device_t *, ALSAHandleList &); 1954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t (*open)(alsa_handle_t *); 1964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t (*close)(alsa_handle_t *); 1974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t (*standby)(alsa_handle_t *); 1984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t (*route)(alsa_handle_t *, uint32_t, int); 1994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t (*startVoiceCall)(alsa_handle_t *); 2004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t (*startVoipCall)(alsa_handle_t *); 2014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t (*startFm)(alsa_handle_t *); 2024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev void (*setVoiceVolume)(int); 2034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev void (*setVoipVolume)(int); 2044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev void (*setMicMute)(int); 2054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev void (*setVoipMicMute)(int); 2064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev void (*setVoipConfig)(int, int); 2074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t (*setFmVolume)(int); 2084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev void (*setBtscoRate)(int); 2094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t (*setLpaVolume)(int); 2104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev void (*enableWideVoice)(bool); 2114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev void (*enableFENS)(bool); 2124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev void (*setFlags)(uint32_t); 2134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t (*setCompressedVolume)(int); 2144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev void (*enableSlowTalk)(bool); 2154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev void (*setVocRecMode)(uint8_t); 2164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev void (*setVoLTEMicMute)(int); 2174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev void (*setVoLTEVolume)(int); 21874060dee8c9a414ad0345176e2422de18a4ff183ty.lee#ifdef SEPERATED_AUDIO_INPUT 21974060dee8c9a414ad0345176e2422de18a4ff183ty.lee void (*setInput)(int); 22074060dee8c9a414ad0345176e2422de18a4ff183ty.lee#endif 2215ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani#ifdef QCOM_CSDCLIENT_ENABLED 2225ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani void (*setCsdHandle)(void*); 2235ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani#endif 2244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}; 2254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 2264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev// ---------------------------------------------------------------------------- 2274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 2284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevclass ALSAMixer 2294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 2304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevpublic: 2314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ALSAMixer(); 2324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual ~ALSAMixer(); 2334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 2344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev bool isValid() { return 1;} 2354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t setMasterVolume(float volume); 2364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t setMasterGain(float gain); 2374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 2384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t setVolume(uint32_t device, float left, float right); 2394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t setGain(uint32_t device, float gain); 2404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 2414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t setCaptureMuteState(uint32_t device, bool state); 2424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t getCaptureMuteState(uint32_t device, bool *state); 2434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t setPlaybackMuteState(uint32_t device, bool state); 2444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t getPlaybackMuteState(uint32_t device, bool *state); 2454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 2464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}; 2474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 2484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevclass ALSAControl 2494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 2504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevpublic: 2514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ALSAControl(const char *device = "/dev/snd/controlC0"); 2524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual ~ALSAControl(); 2534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 2544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t get(const char *name, unsigned int &value, int index = 0); 2554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t set(const char *name, unsigned int value, int index = -1); 2564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t set(const char *name, const char *); 2574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t setext(const char *name, int count, char **setValues); 2584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 2594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevprivate: 2604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev struct mixer* mHandle; 2614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}; 2624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 2634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevclass ALSAStreamOps 2644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 2654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevpublic: 2664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ALSAStreamOps(AudioHardwareALSA *parent, alsa_handle_t *handle); 2674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual ~ALSAStreamOps(); 2684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 2694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t set(int *format, uint32_t *channels, uint32_t *rate, uint32_t device); 2704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 2714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t setParameters(const String8& keyValuePairs); 2724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev String8 getParameters(const String8& keys); 2734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 2744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev uint32_t sampleRate() const; 2754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev size_t bufferSize() const; 2764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int format() const; 2774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev uint32_t channels() const; 2784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 2794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t open(int mode); 2804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev void close(); 2814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 2824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevprotected: 2834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev friend class AudioHardwareALSA; 2844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 2854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev AudioHardwareALSA * mParent; 2864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev alsa_handle_t * mHandle; 2874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev uint32_t mDevices; 2884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}; 2894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 2904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev// ---------------------------------------------------------------------------- 2914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 2924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevclass AudioStreamOutALSA : public AudioStreamOut, public ALSAStreamOps 2934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 2944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevpublic: 2954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev AudioStreamOutALSA(AudioHardwareALSA *parent, alsa_handle_t *handle); 2964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual ~AudioStreamOutALSA(); 2974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 2984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual uint32_t sampleRate() const 2994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev { 3004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return ALSAStreamOps::sampleRate(); 3014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 3024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 3034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual size_t bufferSize() const 3044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev { 3054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return ALSAStreamOps::bufferSize(); 3064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 3074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 3084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual uint32_t channels() const; 3094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 3104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual int format() const 3114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev { 3124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return ALSAStreamOps::format(); 3134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 3144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 3154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual uint32_t latency() const; 3164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 3174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual ssize_t write(const void *buffer, size_t bytes); 3184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual status_t dump(int fd, const Vector<String16>& args); 3194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 3204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t setVolume(float left, float right); 3214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 3224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual status_t standby(); 3234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 3244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual status_t setParameters(const String8& keyValuePairs) { 3254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return ALSAStreamOps::setParameters(keyValuePairs); 3264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 3274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 3284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual String8 getParameters(const String8& keys) { 3294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return ALSAStreamOps::getParameters(keys); 3304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 3314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 3324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev // return the number of audio frames written by the audio dsp to DAC since 3334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev // the output has exited standby 3344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual status_t getRenderPosition(uint32_t *dspFrames); 3354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 3364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t open(int mode); 3374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t close(); 3384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 3394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevprivate: 3404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev uint32_t mFrameCount; 3414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 3424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevprotected: 3434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev AudioHardwareALSA * mParent; 3444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}; 3454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 3464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevclass AudioStreamInALSA : public AudioStreamIn, public ALSAStreamOps 3474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 3484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevpublic: 3494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev AudioStreamInALSA(AudioHardwareALSA *parent, 3504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev alsa_handle_t *handle, 3514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev AudioSystem::audio_in_acoustics audio_acoustics); 3524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual ~AudioStreamInALSA(); 3534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 3544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual uint32_t sampleRate() const 3554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev { 3564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return ALSAStreamOps::sampleRate(); 3574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 3584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 3594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual size_t bufferSize() const 3604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev { 3614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return ALSAStreamOps::bufferSize(); 3624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 3634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 3644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual uint32_t channels() const 3654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev { 3664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return ALSAStreamOps::channels(); 3674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 3684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 3694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual int format() const 3704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev { 3714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return ALSAStreamOps::format(); 3724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 3734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 3744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual ssize_t read(void* buffer, ssize_t bytes); 3754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual status_t dump(int fd, const Vector<String16>& args); 3764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 3774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual status_t setGain(float gain); 3784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 3794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual status_t standby(); 3804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 3814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual status_t setParameters(const String8& keyValuePairs) 3824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev { 3834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return ALSAStreamOps::setParameters(keyValuePairs); 3844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 3854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 3864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual String8 getParameters(const String8& keys) 3874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev { 3884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return ALSAStreamOps::getParameters(keys); 3894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 3904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 3914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev // Return the amount of input frames lost in the audio driver since the last call of this function. 3924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev // Audio driver is expected to reset the value to 0 and restart counting upon returning the current value by this function call. 3934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev // Such loss typically occurs when the user space process is blocked longer than the capacity of audio driver buffers. 3944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev // Unit: the number of input audio frames 3954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual unsigned int getInputFramesLost() const; 3964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 3974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual status_t addAudioEffect(effect_handle_t effect) 3984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev { 3994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return BAD_VALUE; 4004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 4014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 4024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual status_t removeAudioEffect(effect_handle_t effect) 4034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev { 4044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return BAD_VALUE; 4054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 4064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t setAcousticParams(void* params); 4074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 4084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t open(int mode); 4094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t close(); 4109746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_SSR_ENABLED 4114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev // Helper function to initialize the Surround Sound library. 4124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t initSurroundSoundLibrary(unsigned long buffersize); 4134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif 4144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 4154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevprivate: 4164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev void resetFramesLost(); 4174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 4185ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani#ifdef QCOM_CSDCLIENT_ENABLED 4195ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani int start_csd_record(int); 4205ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani int stop_csd_record(void); 4215ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani#endif 4225ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani 4234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev unsigned int mFramesLost; 4244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev AudioSystem::audio_in_acoustics mAcoustics; 4254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 4269746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_SSR_ENABLED 4274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev // Function to read coefficients from files. 4284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t readCoeffsFromFile(); 4294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 4304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev FILE *mFp_4ch; 4314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev FILE *mFp_6ch; 4324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int16_t **mRealCoeffs; 4334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int16_t **mImagCoeffs; 4344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev void *mSurroundObj; 4354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 4364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int16_t *mSurroundInputBuffer; 4374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int16_t *mSurroundOutputBuffer; 4384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int mSurroundInputBufferIdx; 4394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int mSurroundOutputBufferIdx; 4404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif 4414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 4424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevprotected: 4434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev AudioHardwareALSA * mParent; 4444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}; 4454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 4464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevclass AudioHardwareALSA : public AudioHardwareBase 4474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{ 4484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevpublic: 4494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev AudioHardwareALSA(); 4504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual ~AudioHardwareALSA(); 4514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 4524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev /** 4534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * check to see if the audio hardware interface has been initialized. 4544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * return status based on values defined in include/utils/Errors.h 4554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev */ 4564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual status_t initCheck(); 4574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 4584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev /** set the audio volume of a voice call. Range is between 0.0 and 1.0 */ 4594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual status_t setVoiceVolume(float volume); 4604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 4614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev /** 4624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * set the audio volume for all audio activities other than voice call. 4634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * Range between 0.0 and 1.0. If any value other than NO_ERROR is returned, 4644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * the software mixer will emulate this capability. 4654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev */ 4664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual status_t setMasterVolume(float volume); 4679746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_FM_ENABLED 4684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual status_t setFmVolume(float volume); 4694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif 4704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev /** 4714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * setMode is called when the audio mode changes. NORMAL mode is for 4724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * standard audio playback, RINGTONE when a ringtone is playing, and IN_CALL 4734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * when a call is in progress. 4744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev */ 4754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual status_t setMode(int mode); 4764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 4774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev // mic mute 4784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual status_t setMicMute(bool state); 4794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual status_t getMicMute(bool* state); 4804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 4814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev // set/get global audio parameters 4824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual status_t setParameters(const String8& keyValuePairs); 4834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual String8 getParameters(const String8& keys); 4844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 4854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev // Returns audio input buffer size according to parameters passed or 0 if one of the 4864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev // parameters is not supported 4874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channels); 4884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 4899746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_TUNNEL_LPA_ENABLED 4904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev /** This method creates and opens the audio hardware output 4914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * session for LPA */ 4924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual AudioStreamOut* openOutputSession( 4934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev uint32_t devices, 4944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int *format, 4954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t *status, 4964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int sessionId, 4974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev uint32_t samplingRate=0, 4984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev uint32_t channels=0); 4994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual void closeOutputSession(AudioStreamOut* out); 5009746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#endif 5014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 5024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev /** This method creates and opens the audio hardware output stream */ 5034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual AudioStreamOut* openOutputStream( 5044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev uint32_t devices, 5054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int *format=0, 5064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev uint32_t *channels=0, 5074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev uint32_t *sampleRate=0, 5084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t *status=0); 5094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual void closeOutputStream(AudioStreamOut* out); 5104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 5114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev /** This method creates and opens the audio hardware input stream */ 5124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual AudioStreamIn* openInputStream( 5134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev uint32_t devices, 5144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int *format, 5154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev uint32_t *channels, 5164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev uint32_t *sampleRate, 5174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev status_t *status, 5184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev AudioSystem::audio_in_acoustics acoustics); 5194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual void closeInputStream(AudioStreamIn* in); 5204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 5214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev /**This method dumps the state of the audio hardware */ 5224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev //virtual status_t dumpState(int fd, const Vector<String16>& args); 5234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 5244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev static AudioHardwareInterface* create(); 5254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 5264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int mode() 5274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev { 5284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev return mMode; 5294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev } 5304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 5314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevprotected: 5324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual status_t dump(int fd, const Vector<String16>& args); 5334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev virtual uint32_t getVoipMode(int format); 5344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev void doRouting(int device); 5359746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_FM_ENABLED 5364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev void handleFm(int device); 5374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif 5389746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_USBAUDIO_ENABLED 5394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev void closeUSBPlayback(); 5404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev void closeUSBRecording(); 5414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev void closeUsbRecordingIfNothingActive(); 5424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev void closeUsbPlaybackIfNothingActive(); 5434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev void startUsbPlaybackIfNotStarted(); 5444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev void startUsbRecordingIfNotStarted(); 5459746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#endif 5464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 5474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev void disableVoiceCall(char* verb, char* modifier, int mode, int device); 5484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev void enableVoiceCall(char* verb, char* modifier, int mode, int device); 5494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev bool routeVoiceCall(int device, int newMode); 5504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev bool routeVoLTECall(int device, int newMode); 5514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev friend class AudioStreamOutALSA; 5524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev friend class AudioStreamInALSA; 5534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev friend class ALSAStreamOps; 5544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 5554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev alsa_device_t * mALSADevice; 5564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 5574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev ALSAHandleList mDeviceList; 5584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 5599746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_USBAUDIO_ENABLED 5604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev AudioUsbALSA *mAudioUsbALSA; 5619746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#endif 5624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 5634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev Mutex mLock; 5644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 5654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev snd_use_case_mgr_t *mUcMgr; 5664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 5674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev uint32_t mCurDevice; 5684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev /* The flag holds all the audio related device settings from 5694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * Settings and Qualcomm Settings applications */ 5704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev uint32_t mDevSettingsFlag; 5714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev uint32_t mVoipStreamCount; 5724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev uint32_t mVoipBitRate; 5734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev uint32_t mIncallMode; 5744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 5754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev bool mMicMute; 5764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int mCSCallActive; 5774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int mVolteCallActive; 5784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int mCallState; 5794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int mIsFmActive; 5804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev bool mBluetoothVGS; 5814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev bool mFusion3Platform; 5829746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_USBAUDIO_ENABLED 5834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int musbPlaybackState; 5844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev int musbRecordingState; 5859746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#endif 5865ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani void *mAcdbHandle; 5875ff7a02ca497656b711919b81a783e6a10cdcc76SathishKumar Mani void *mCsdHandle; 5884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}; 5894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 5904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev// ---------------------------------------------------------------------------- 5914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev 5924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}; // namespace android_audio_legacy 5934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif // ANDROID_AUDIO_HARDWARE_ALSA_H 594