audio_hw.h revision 31aca91506be3beb30ae598cf22f6f940c2aac0b
12dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda/*
22dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * Copyright (C) 2013 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
20b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#include <cutils/list.h>
212dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#include <hardware/audio.h>
222dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
232dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#include <tinyalsa/asoundlib.h>
244e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda#include <tinycompress/tinycompress.h>
252dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
262dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#include <audio_route/audio_route.h>
272dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
28c4aef75c2c5a0d49cac941d22235ac0b9e435ca0Eric Laurent#define VISUALIZER_LIBRARY_PATH "/system/lib/soundfx/libqcomvisualizer.so"
29c4aef75c2c5a0d49cac941d22235ac0b9e435ca0Eric Laurent
30b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent/* Flags used to initialize acdb_settings variable that goes to ACDB library */
31b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define DMIC_FLAG       0x00000002
32b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define TTY_MODE_OFF    0x00000010
33b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define TTY_MODE_FULL   0x00000020
34b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define TTY_MODE_VCO    0x00000040
35b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define TTY_MODE_HCO    0x00000080
36b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define TTY_MODE_CLEAR  0xFFFFFF0F
37b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
382dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#define ACDB_DEV_TYPE_OUT 1
392dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#define ACDB_DEV_TYPE_IN 2
402dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
41b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define MAX_SUPPORTED_CHANNEL_MASKS 2
4207eeafd9390a85c5b9ad1642e89d3973615584cbEric Laurent#define DEFAULT_HDMI_OUT_CHANNELS   2
432dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
44b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurenttypedef int snd_device_t;
452dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
462dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda/* These are the supported use cases by the hardware.
472dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * Each usecase is mapped to a specific PCM device.
482dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * Refer to pcm_device_table[].
492dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda */
502dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandatypedef enum {
512dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    USECASE_INVALID = -1,
522dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    /* Playback usecases */
532dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    USECASE_AUDIO_PLAYBACK_DEEP_BUFFER = 0,
542dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    USECASE_AUDIO_PLAYBACK_LOW_LATENCY,
552dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    USECASE_AUDIO_PLAYBACK_MULTI_CH,
564e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    USECASE_AUDIO_PLAYBACK_OFFLOAD,
572dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
582dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    /* Capture usecases */
592dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    USECASE_AUDIO_RECORD,
602dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    USECASE_AUDIO_RECORD_LOW_LATENCY,
612dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
622dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    USECASE_VOICE_CALL,
632dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    AUDIO_USECASE_MAX
642dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda} audio_usecase_t;
652dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
662dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
672dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
682dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda/*
692dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * tinyAlsa library interprets period size as number of frames
702dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * one frame = channel_count * sizeof (pcm sample)
712dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * so if format = 16-bit PCM and channels = Stereo, frame size = 2 ch * 2 = 4 bytes
722dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * DEEP_BUFFER_OUTPUT_PERIOD_SIZE = 1024 means 1024 * 4 = 4096 bytes
732dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * We should take care of returning proper size when AudioFlinger queries for
742dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * the buffer size of an input/output stream
752dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda */
762dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
774e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamandaenum {
784e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    OFFLOAD_CMD_EXIT,               /* exit compress offload thread loop*/
794e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    OFFLOAD_CMD_DRAIN,              /* send a full drain request to DSP */
804e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    OFFLOAD_CMD_PARTIAL_DRAIN,      /* send a partial drain request to DSP */
814e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    OFFLOAD_CMD_WAIT_FOR_BUFFER,    /* wait for buffer released by DSP */
824e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda};
834e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda
844e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamandaenum {
854e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    OFFLOAD_STATE_IDLE,
864e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    OFFLOAD_STATE_PLAYING,
874e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    OFFLOAD_STATE_PAUSED,
884e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda};
894e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda
904e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamandastruct offload_cmd {
914e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    struct listnode node;
924e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    int cmd;
934e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    int data[];
944e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda};
954e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda
962dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandastruct stream_out {
972dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct audio_stream_out stream;
98150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent    pthread_mutex_t lock; /* see note below on mutex acquisition order */
994e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    pthread_cond_t  cond;
1002dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct pcm_config config;
1014e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    struct compr_config compr_config;
1022dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct pcm *pcm;
1034e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    struct compress *compr;
1042dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    int standby;
1052dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    int pcm_device_id;
1064e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    unsigned int sample_rate;
1072dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_channel_mask_t channel_mask;
1084e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    audio_format_t format;
1092dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_devices_t devices;
1102dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_output_flags_t flags;
1112dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_usecase_t usecase;
1122dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    /* Array of supported channel mask configurations. +1 so that the last entry is always 0 */
1132dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_channel_mask_t supported_channel_masks[MAX_SUPPORTED_CHANNEL_MASKS + 1];
114a9024defa11f6502ca55425a4803cd00441d51e7Eric Laurent    bool muted;
1152ccd7babcde54a8073945dec69660cb60e66a931Glenn Kasten    uint64_t written; /* total frames written, not cleared when entering standby */
116c4aef75c2c5a0d49cac941d22235ac0b9e435ca0Eric Laurent    audio_io_handle_t handle;
1172dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
1184e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    int non_blocking;
1194e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    int playback_started;
1204e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    int offload_state;
1214e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    pthread_cond_t offload_cond;
1224e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    pthread_t offload_thread;
1234e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    struct listnode offload_cmd_list;
1244e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    bool offload_thread_blocked;
1254e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda
1264e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    stream_callback_t offload_callback;
1274e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda    void *offload_cookie;
128352f27bea3ea82b64234485de7a0f87a1991ab06Haynes Mathew George    struct compr_gapless_mdata gapless_mdata;
129352f27bea3ea82b64234485de7a0f87a1991ab06Haynes Mathew George    int send_new_metadata;
1304e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda
1312dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct audio_device *dev;
1322dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda};
1332dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
1342dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandastruct stream_in {
1352dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct audio_stream_in stream;
136150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent    pthread_mutex_t lock; /* see note below on mutex acquisition order */
1372dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct pcm_config config;
1382dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct pcm *pcm;
1392dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    int standby;
1402dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    int source;
1412dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    int pcm_device_id;
1422dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    int device;
1432dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_channel_mask_t channel_mask;
1442dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_usecase_t usecase;
145f70ffb40ca0c4e8cce15c77fd9edff7f2b6980deRavi Kumar Alamanda    bool enable_aec;
1462dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
1472dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct audio_device *dev;
1482dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda};
1492dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
1502dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandatypedef enum {
1512dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    PCM_PLAYBACK,
1522dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    PCM_CAPTURE,
1532dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    VOICE_CALL
1542dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda} usecase_type_t;
1552dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
156096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamandaunion stream_ptr {
157096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamanda    struct stream_in *in;
158096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamanda    struct stream_out *out;
159096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamanda};
160096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamanda
1612dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandastruct audio_usecase {
1623b1816cd594eba53a9869d7b23af36daacf58fa1Ravi Kumar Alamanda    struct listnode list;
1632dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_usecase_t id;
1642dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    usecase_type_t  type;
1652dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_devices_t devices;
16671c84b70ff7c428e35ac187ca4a234acac558240Ravi Kumar Alamanda    snd_device_t out_snd_device;
16771c84b70ff7c428e35ac187ca4a234acac558240Ravi Kumar Alamanda    snd_device_t in_snd_device;
168096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamanda    union stream_ptr stream;
1692dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda};
1702dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
1712dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandastruct audio_device {
1722dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct audio_hw_device device;
173150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent    pthread_mutex_t lock; /* see note below on mutex acquisition order */
1742dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct mixer *mixer;
1752dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_mode_t mode;
176c8400637beb896d2f5d7ae980682cd2d072a9da3Eric Laurent    struct stream_in *active_input;
177096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamanda    struct stream_out *primary_output;
1782dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    int in_call;
1792dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    float voice_volume;
1802dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    bool mic_mute;
1812dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    int tty_mode;
1822dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    bool bluetooth_nrec;
1832dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    bool screen_off;
1842dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct pcm *voice_call_rx;
1852dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct pcm *voice_call_tx;
186b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    int *snd_dev_ref_cnt;
1873b1816cd594eba53a9869d7b23af36daacf58fa1Ravi Kumar Alamanda    struct listnode usecase_list;
1882dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct audio_route *audio_route;
1892dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    int acdb_settings;
190c56336bfad4661796b749fc4db7de3a1e6aba06fJean-Michel Trivi    bool speaker_lr_swap;
19107eeafd9390a85c5b9ad1642e89d3973615584cbEric Laurent    unsigned int cur_hdmi_channels;
1922dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
193b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    void *platform;
194c4aef75c2c5a0d49cac941d22235ac0b9e435ca0Eric Laurent
195c4aef75c2c5a0d49cac941d22235ac0b9e435ca0Eric Laurent    void *visualizer_lib;
196c4aef75c2c5a0d49cac941d22235ac0b9e435ca0Eric Laurent    int (*visualizer_start_output)(audio_io_handle_t);
197c4aef75c2c5a0d49cac941d22235ac0b9e435ca0Eric Laurent    int (*visualizer_stop_output)(audio_io_handle_t);
19831aca91506be3beb30ae598cf22f6f940c2aac0bAndy Hung
19931aca91506be3beb30ae598cf22f6f940c2aac0bAndy Hung    /* The pcm_params use_case_table is loaded by adev_verify_devices() upon
20031aca91506be3beb30ae598cf22f6f940c2aac0bAndy Hung     * calling adev_open().
20131aca91506be3beb30ae598cf22f6f940c2aac0bAndy Hung     *
20231aca91506be3beb30ae598cf22f6f940c2aac0bAndy Hung     * If an entry is not NULL, it can be used to determine if extended precision
20331aca91506be3beb30ae598cf22f6f940c2aac0bAndy Hung     * or other capabilities are present for the device corresponding to that usecase.
20431aca91506be3beb30ae598cf22f6f940c2aac0bAndy Hung     */
20531aca91506be3beb30ae598cf22f6f940c2aac0bAndy Hung    struct pcm_params *use_case_table[AUDIO_USECASE_MAX];
2062dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda};
2072dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
208150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent/*
209150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent * NOTE: when multiple mutexes have to be acquired, always take the
210150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent * stream_in or stream_out mutex first, followed by the audio_device mutex.
211150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent */
212150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent
213b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#endif // QCOM_AUDIO_HW_H
214