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