12dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda/*
24b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava * Copyright (C) 2013-2014 The Android Open Source Project
32dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda *
42dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * Licensed under the Apache License, Version 2.0 (the "License");
52dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * you may not use this file except in compliance with the License.
62dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * You may obtain a copy of the License at
72dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda *
82dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda *      http://www.apache.org/licenses/LICENSE-2.0
92dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda *
102dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * Unless required by applicable law or agreed to in writing, software
112dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * distributed under the License is distributed on an "AS IS" BASIS,
122dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * See the License for the specific language governing permissions and
142dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * limitations under the License.
152dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda */
162dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
17b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#ifndef QCOM_AUDIO_HW_H
18b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define QCOM_AUDIO_HW_H
19b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
208e6e98fc5af6d6f79bc71eb37df470380ae82fadRavi Kumar Alamanda#include <cutils/str_parms.h>
21b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#include <cutils/list.h>
222dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#include <hardware/audio.h>
232dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
242dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#include <tinyalsa/asoundlib.h>
254e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda#include <tinycompress/tinycompress.h>
262dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
272dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#include <audio_route/audio_route.h>
284b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava#include "voice.h"
292dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
30c4aef75c2c5a0d49cac941d22235ac0b9e435ca0Eric Laurent#define VISUALIZER_LIBRARY_PATH "/system/lib/soundfx/libqcomvisualizer.so"
3141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George#define OFFLOAD_EFFECTS_BUNDLE_LIBRARY_PATH "/system/lib/soundfx/libqcompostprocbundle.so"
32c4aef75c2c5a0d49cac941d22235ac0b9e435ca0Eric Laurent
33b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent/* Flags used to initialize acdb_settings variable that goes to ACDB library */
34b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define DMIC_FLAG       0x00000002
35b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define TTY_MODE_OFF    0x00000010
36b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define TTY_MODE_FULL   0x00000020
37b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define TTY_MODE_VCO    0x00000040
38b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define TTY_MODE_HCO    0x00000080
39b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define TTY_MODE_CLEAR  0xFFFFFF0F
40b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
412dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#define ACDB_DEV_TYPE_OUT 1
422dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#define ACDB_DEV_TYPE_IN 2
432dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
44b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define MAX_SUPPORTED_CHANNEL_MASKS 2
4507eeafd9390a85c5b9ad1642e89d3973615584cbEric Laurent#define DEFAULT_HDMI_OUT_CHANNELS   2
462dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
47b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurenttypedef int snd_device_t;
482dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
492dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda/* These are the supported use cases by the hardware.
502dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * Each usecase is mapped to a specific PCM device.
512dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * Refer to pcm_device_table[].
522dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda */
5308dbcfc116e62f5b4007cade7311430ea235a09eRavi Kumar Alamandaenum {
542dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    USECASE_INVALID = -1,
552dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    /* Playback usecases */
562dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    USECASE_AUDIO_PLAYBACK_DEEP_BUFFER = 0,
572dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    USECASE_AUDIO_PLAYBACK_LOW_LATENCY,
582dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    USECASE_AUDIO_PLAYBACK_MULTI_CH,
594e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    USECASE_AUDIO_PLAYBACK_OFFLOAD,
602dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
618e6e98fc5af6d6f79bc71eb37df470380ae82fadRavi Kumar Alamanda    /* HFP Use case*/
628e6e98fc5af6d6f79bc71eb37df470380ae82fadRavi Kumar Alamanda    USECASE_AUDIO_HFP_SCO,
638e6e98fc5af6d6f79bc71eb37df470380ae82fadRavi Kumar Alamanda    USECASE_AUDIO_HFP_SCO_WB,
648e6e98fc5af6d6f79bc71eb37df470380ae82fadRavi Kumar Alamanda
652dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    /* Capture usecases */
662dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    USECASE_AUDIO_RECORD,
672dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    USECASE_AUDIO_RECORD_LOW_LATENCY,
682dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
692dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    USECASE_VOICE_CALL,
704b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
714b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    /* Voice extension usecases */
724b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    USECASE_VOICE2_CALL,
734b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    USECASE_VOLTE_CALL,
744b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    USECASE_QCHAT_CALL,
754b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    USECASE_VOWLAN_CALL,
764b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    USECASE_INCALL_REC_UPLINK,
774b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    USECASE_INCALL_REC_DOWNLINK,
784b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    USECASE_INCALL_REC_UPLINK_AND_DOWNLINK,
7999c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda
8099c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda    USECASE_AUDIO_PLAYBACK_AFE_PROXY,
8199c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda    USECASE_AUDIO_RECORD_AFE_PROXY,
8299c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda
832dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    AUDIO_USECASE_MAX
8408dbcfc116e62f5b4007cade7311430ea235a09eRavi Kumar Alamanda};
8508dbcfc116e62f5b4007cade7311430ea235a09eRavi Kumar Alamanda
8608dbcfc116e62f5b4007cade7311430ea235a09eRavi Kumar Alamandaconst char * const use_case_table[AUDIO_USECASE_MAX];
872dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
882dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
892dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
902dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda/*
912dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * tinyAlsa library interprets period size as number of frames
922dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * one frame = channel_count * sizeof (pcm sample)
932dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * so if format = 16-bit PCM and channels = Stereo, frame size = 2 ch * 2 = 4 bytes
942dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * DEEP_BUFFER_OUTPUT_PERIOD_SIZE = 1024 means 1024 * 4 = 4096 bytes
952dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * We should take care of returning proper size when AudioFlinger queries for
962dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * the buffer size of an input/output stream
972dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda */
982dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
994e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamandaenum {
1004e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    OFFLOAD_CMD_EXIT,               /* exit compress offload thread loop*/
1014e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    OFFLOAD_CMD_DRAIN,              /* send a full drain request to DSP */
1024e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    OFFLOAD_CMD_PARTIAL_DRAIN,      /* send a partial drain request to DSP */
1034e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    OFFLOAD_CMD_WAIT_FOR_BUFFER,    /* wait for buffer released by DSP */
1044e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda};
1054e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda
1064e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamandaenum {
1074e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    OFFLOAD_STATE_IDLE,
1084e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    OFFLOAD_STATE_PLAYING,
1094e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    OFFLOAD_STATE_PAUSED,
1104e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda};
1114e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda
1124e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamandastruct offload_cmd {
1134e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    struct listnode node;
1144e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    int cmd;
1154e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    int data[];
1164e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda};
1174e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda
1182dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandastruct stream_out {
1192dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct audio_stream_out stream;
120150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent    pthread_mutex_t lock; /* see note below on mutex acquisition order */
1214e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    pthread_cond_t  cond;
1222dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct pcm_config config;
1234e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    struct compr_config compr_config;
1242dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct pcm *pcm;
1254e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    struct compress *compr;
1262dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    int standby;
1272dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    int pcm_device_id;
1284e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    unsigned int sample_rate;
1292dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_channel_mask_t channel_mask;
1304e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    audio_format_t format;
1312dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_devices_t devices;
1322dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_output_flags_t flags;
1332dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_usecase_t usecase;
1342dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    /* Array of supported channel mask configurations. +1 so that the last entry is always 0 */
1352dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_channel_mask_t supported_channel_masks[MAX_SUPPORTED_CHANNEL_MASKS + 1];
136a9024defa11f6502ca55425a4803cd00441d51e7Eric Laurent    bool muted;
1372ccd7babcde54a8073945dec69660cb60e66a931Glenn Kasten    uint64_t written; /* total frames written, not cleared when entering standby */
138c4aef75c2c5a0d49cac941d22235ac0b9e435ca0Eric Laurent    audio_io_handle_t handle;
1392dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
1404e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    int non_blocking;
1414e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    int playback_started;
1424e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    int offload_state;
1434e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    pthread_cond_t offload_cond;
1444e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    pthread_t offload_thread;
1454e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    struct listnode offload_cmd_list;
1464e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    bool offload_thread_blocked;
1474e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda
1484e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    stream_callback_t offload_callback;
1494e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    void *offload_cookie;
150352f27bea3ea82b64234485de7a0f87a1991ab06Haynes Mathew George    struct compr_gapless_mdata gapless_mdata;
151352f27bea3ea82b64234485de7a0f87a1991ab06Haynes Mathew George    int send_new_metadata;
1524e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda
1532dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct audio_device *dev;
1542dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda};
1552dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
1562dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandastruct stream_in {
1572dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct audio_stream_in stream;
158150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent    pthread_mutex_t lock; /* see note below on mutex acquisition order */
1592dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct pcm_config config;
1602dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct pcm *pcm;
1612dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    int standby;
1622dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    int source;
1632dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    int pcm_device_id;
16499c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda    audio_devices_t device;
1652dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_channel_mask_t channel_mask;
1662dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_usecase_t usecase;
167f70ffb40ca0c4e8cce15c77fd9edff7f2b6980deRavi Kumar Alamanda    bool enable_aec;
1683ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    bool enable_ns;
1692dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
1702dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct audio_device *dev;
1712dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda};
1722dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
1732dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandatypedef enum {
1742dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    PCM_PLAYBACK,
1752dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    PCM_CAPTURE,
1768e6e98fc5af6d6f79bc71eb37df470380ae82fadRavi Kumar Alamanda    VOICE_CALL,
1778e6e98fc5af6d6f79bc71eb37df470380ae82fadRavi Kumar Alamanda    PCM_HFP_CALL
1782dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda} usecase_type_t;
1792dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
180096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamandaunion stream_ptr {
181096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamanda    struct stream_in *in;
182096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamanda    struct stream_out *out;
183096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamanda};
184096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamanda
1852dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandastruct audio_usecase {
1863b1816cd594eba53a9869d7b23af36daacf58fa1Ravi Kumar Alamanda    struct listnode list;
1872dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_usecase_t id;
1882dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    usecase_type_t  type;
1892dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_devices_t devices;
19071c84b70ff7c428e35ac187ca4a234acac558240Ravi Kumar Alamanda    snd_device_t out_snd_device;
19171c84b70ff7c428e35ac187ca4a234acac558240Ravi Kumar Alamanda    snd_device_t in_snd_device;
192096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamanda    union stream_ptr stream;
1932dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda};
1942dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
1952dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandastruct audio_device {
1962dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct audio_hw_device device;
197150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent    pthread_mutex_t lock; /* see note below on mutex acquisition order */
1982dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct mixer *mixer;
1992dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_mode_t mode;
200c8400637beb896d2f5d7ae980682cd2d072a9da3Eric Laurent    struct stream_in *active_input;
201096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamanda    struct stream_out *primary_output;
20299c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda    struct stream_out *voice_tx_output;
20399c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda    struct stream_out *current_call_output;
2042dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    bool bluetooth_nrec;
2052dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    bool screen_off;
206b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    int *snd_dev_ref_cnt;
2073b1816cd594eba53a9869d7b23af36daacf58fa1Ravi Kumar Alamanda    struct listnode usecase_list;
2082dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct audio_route *audio_route;
2092dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    int acdb_settings;
210c56336bfad4661796b749fc4db7de3a1e6aba06fJean-Michel Trivi    bool speaker_lr_swap;
2114b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    struct voice voice;
21207eeafd9390a85c5b9ad1642e89d3973615584cbEric Laurent    unsigned int cur_hdmi_channels;
2139f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda    bool bt_wb_speech_enabled;
2147b2b5ab2921c4679455faa3bfbeb1457e5eb5f0dEric Laurent    bool mic_muted;
215cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent    bool enable_voicerx;
2162dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
2174b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    int snd_card;
218b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    void *platform;
2190499d4fc40cafb9fbb0e8eace1657cfaf79c5699Eric Laurent    void *extspk;
220c4aef75c2c5a0d49cac941d22235ac0b9e435ca0Eric Laurent
221c4aef75c2c5a0d49cac941d22235ac0b9e435ca0Eric Laurent    void *visualizer_lib;
22241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int (*visualizer_start_output)(audio_io_handle_t, int);
22341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int (*visualizer_stop_output)(audio_io_handle_t, int);
22431aca91506be3beb30ae598cf22f6f940c2aac0bAndy Hung
22531aca91506be3beb30ae598cf22f6f940c2aac0bAndy Hung    /* The pcm_params use_case_table is loaded by adev_verify_devices() upon
22631aca91506be3beb30ae598cf22f6f940c2aac0bAndy Hung     * calling adev_open().
22731aca91506be3beb30ae598cf22f6f940c2aac0bAndy Hung     *
22831aca91506be3beb30ae598cf22f6f940c2aac0bAndy Hung     * If an entry is not NULL, it can be used to determine if extended precision
22931aca91506be3beb30ae598cf22f6f940c2aac0bAndy Hung     * or other capabilities are present for the device corresponding to that usecase.
23031aca91506be3beb30ae598cf22f6f940c2aac0bAndy Hung     */
23131aca91506be3beb30ae598cf22f6f940c2aac0bAndy Hung    struct pcm_params *use_case_table[AUDIO_USECASE_MAX];
23241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    void *offload_effects_lib;
23341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int (*offload_effects_start_output)(audio_io_handle_t, int);
23441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int (*offload_effects_stop_output)(audio_io_handle_t, int);
2352dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda};
2362dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
2378e6e98fc5af6d6f79bc71eb37df470380ae82fadRavi Kumar Alamandaint select_devices(struct audio_device *adev,
2388e6e98fc5af6d6f79bc71eb37df470380ae82fadRavi Kumar Alamanda                   audio_usecase_t uc_id);
2394b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
2408e6e98fc5af6d6f79bc71eb37df470380ae82fadRavi Kumar Alamandaint disable_audio_route(struct audio_device *adev,
2418e6e98fc5af6d6f79bc71eb37df470380ae82fadRavi Kumar Alamanda                        struct audio_usecase *usecase);
2424b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
2438e6e98fc5af6d6f79bc71eb37df470380ae82fadRavi Kumar Alamandaint disable_snd_device(struct audio_device *adev,
2448e6e98fc5af6d6f79bc71eb37df470380ae82fadRavi Kumar Alamanda                       snd_device_t snd_device);
2454b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
2468e6e98fc5af6d6f79bc71eb37df470380ae82fadRavi Kumar Alamandaint enable_snd_device(struct audio_device *adev,
2478e6e98fc5af6d6f79bc71eb37df470380ae82fadRavi Kumar Alamanda                      snd_device_t snd_device);
2484b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
2498e6e98fc5af6d6f79bc71eb37df470380ae82fadRavi Kumar Alamandaint enable_audio_route(struct audio_device *adev,
2508e6e98fc5af6d6f79bc71eb37df470380ae82fadRavi Kumar Alamanda                       struct audio_usecase *usecase);
2514b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
2528e6e98fc5af6d6f79bc71eb37df470380ae82fadRavi Kumar Alamandastruct audio_usecase *get_usecase_from_list(struct audio_device *adev,
2538e6e98fc5af6d6f79bc71eb37df470380ae82fadRavi Kumar Alamanda                                            audio_usecase_t uc_id);
2548e6e98fc5af6d6f79bc71eb37df470380ae82fadRavi Kumar Alamanda
2554b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava#define LITERAL_TO_STRING(x) #x
2564b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava#define CHECK(condition) LOG_ALWAYS_FATAL_IF(!(condition), "%s",\
2574b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava            __FILE__ ":" LITERAL_TO_STRING(__LINE__)\
2584b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava            " ASSERT_FATAL(" #condition ") failed.")
2594b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
260150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent/*
261150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent * NOTE: when multiple mutexes have to be acquired, always take the
262150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent * stream_in or stream_out mutex first, followed by the audio_device mutex.
263150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent */
264150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent
265b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#endif // QCOM_AUDIO_HW_H
266