audio_hw.h revision 096c87f83ccc1439acb639dbab00faf5a393afa7
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
172dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#include <hardware/audio.h>
182dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
192dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#include <tinyalsa/asoundlib.h>
202dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
212dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#include <audio_route/audio_route.h>
222dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
232dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#define ACDB_DEV_TYPE_OUT 1
242dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#define ACDB_DEV_TYPE_IN 2
252dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
2672c411f8ef451934ababc209eef482b9cc7005a8Ravi Kumar Alamanda#define DUALMIC_CONFIG_NONE 0      /* Target does not contain 2 mics */
2772c411f8ef451934ababc209eef482b9cc7005a8Ravi Kumar Alamanda#define DUALMIC_CONFIG_ENDFIRE 1
2872c411f8ef451934ababc209eef482b9cc7005a8Ravi Kumar Alamanda#define DUALMIC_CONFIG_BROADSIDE 2
2972c411f8ef451934ababc209eef482b9cc7005a8Ravi Kumar Alamanda
302dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda/* Sound devices specific to the platform
312dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * The DEVICE_OUT_* and DEVICE_IN_* should be mapped to these sound
322dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * devices to enable corresponding mixer paths
332dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda */
342dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandatypedef enum {
3575d924d06336949440090c214af199fd05d5bb06Ravi Kumar Alamanda    SND_DEVICE_NONE = 0,
3675d924d06336949440090c214af199fd05d5bb06Ravi Kumar Alamanda
3775d924d06336949440090c214af199fd05d5bb06Ravi Kumar Alamanda    /* Playback devices */
3875d924d06336949440090c214af199fd05d5bb06Ravi Kumar Alamanda    SND_DEVICE_MIN,
3975d924d06336949440090c214af199fd05d5bb06Ravi Kumar Alamanda    SND_DEVICE_OUT_BEGIN = SND_DEVICE_MIN,
402dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    SND_DEVICE_OUT_HANDSET = SND_DEVICE_OUT_BEGIN,
412dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    SND_DEVICE_OUT_SPEAKER,
422dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    SND_DEVICE_OUT_HEADPHONES,
432dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES,
442dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    SND_DEVICE_OUT_VOICE_SPEAKER,
452dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    SND_DEVICE_OUT_VOICE_HEADPHONES,
4675d924d06336949440090c214af199fd05d5bb06Ravi Kumar Alamanda    SND_DEVICE_OUT_HDMI,
472dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    SND_DEVICE_OUT_SPEAKER_AND_HDMI,
482dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    SND_DEVICE_OUT_BT_SCO,
4972c411f8ef451934ababc209eef482b9cc7005a8Ravi Kumar Alamanda    SND_DEVICE_OUT_VOICE_HANDSET_TMUS,
50f99670408844a07cdfabf9a01078ed7ef4c71bbfRavi Kumar Alamanda    SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES,
51f99670408844a07cdfabf9a01078ed7ef4c71bbfRavi Kumar Alamanda    SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES,
52f99670408844a07cdfabf9a01078ed7ef4c71bbfRavi Kumar Alamanda    SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET,
532dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    SND_DEVICE_OUT_END,
542dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
5575d924d06336949440090c214af199fd05d5bb06Ravi Kumar Alamanda    /*
5675d924d06336949440090c214af199fd05d5bb06Ravi Kumar Alamanda     * Note: IN_BEGIN should be same as OUT_END because total number of devices
5775d924d06336949440090c214af199fd05d5bb06Ravi Kumar Alamanda     * SND_DEVICES_MAX should not exceed MAX_RX + MAX_TX devices.
582dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda     */
5975d924d06336949440090c214af199fd05d5bb06Ravi Kumar Alamanda    /* Capture devices */
602dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    SND_DEVICE_IN_BEGIN = SND_DEVICE_OUT_END,
612dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    SND_DEVICE_IN_HANDSET_MIC  = SND_DEVICE_IN_BEGIN,
622dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    SND_DEVICE_IN_SPEAKER_MIC,
632dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    SND_DEVICE_IN_HEADSET_MIC,
642dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    SND_DEVICE_IN_VOICE_SPEAKER_MIC,
652dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    SND_DEVICE_IN_VOICE_HEADSET_MIC,
662dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    SND_DEVICE_IN_HDMI_MIC,
6775d924d06336949440090c214af199fd05d5bb06Ravi Kumar Alamanda    SND_DEVICE_IN_BT_SCO_MIC,
682dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    SND_DEVICE_IN_CAMCORDER_MIC,
6972c411f8ef451934ababc209eef482b9cc7005a8Ravi Kumar Alamanda    SND_DEVICE_IN_VOICE_DMIC_EF,
7072c411f8ef451934ababc209eef482b9cc7005a8Ravi Kumar Alamanda    SND_DEVICE_IN_VOICE_DMIC_BS,
7172c411f8ef451934ababc209eef482b9cc7005a8Ravi Kumar Alamanda    SND_DEVICE_IN_VOICE_DMIC_EF_TMUS,
7272c411f8ef451934ababc209eef482b9cc7005a8Ravi Kumar Alamanda    SND_DEVICE_IN_VOICE_SPEAKER_DMIC_EF,
7372c411f8ef451934ababc209eef482b9cc7005a8Ravi Kumar Alamanda    SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BS,
74f99670408844a07cdfabf9a01078ed7ef4c71bbfRavi Kumar Alamanda    SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC,
75f99670408844a07cdfabf9a01078ed7ef4c71bbfRavi Kumar Alamanda    SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC,
76f99670408844a07cdfabf9a01078ed7ef4c71bbfRavi Kumar Alamanda    SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC,
772dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    SND_DEVICE_IN_VOICE_REC_MIC,
7872c411f8ef451934ababc209eef482b9cc7005a8Ravi Kumar Alamanda    SND_DEVICE_IN_VOICE_REC_DMIC_EF,
7972c411f8ef451934ababc209eef482b9cc7005a8Ravi Kumar Alamanda    SND_DEVICE_IN_VOICE_REC_DMIC_BS,
80c8400637beb896d2f5d7ae980682cd2d072a9da3Eric Laurent    SND_DEVICE_IN_VOICE_REC_DMIC_EF_FLUENCE,
81c8400637beb896d2f5d7ae980682cd2d072a9da3Eric Laurent    SND_DEVICE_IN_VOICE_REC_DMIC_BS_FLUENCE,
822dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    SND_DEVICE_IN_END,
832dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
8475d924d06336949440090c214af199fd05d5bb06Ravi Kumar Alamanda    SND_DEVICE_MAX = SND_DEVICE_IN_END,
8575d924d06336949440090c214af199fd05d5bb06Ravi Kumar Alamanda
862dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda} snd_device_t;
872dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
882dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
892dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda/* These are the supported use cases by the hardware.
902dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * Each usecase is mapped to a specific PCM device.
912dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * Refer to pcm_device_table[].
922dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda */
932dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandatypedef enum {
942dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    USECASE_INVALID = -1,
952dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    /* Playback usecases */
962dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    USECASE_AUDIO_PLAYBACK_DEEP_BUFFER = 0,
972dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    USECASE_AUDIO_PLAYBACK_LOW_LATENCY,
982dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    USECASE_AUDIO_PLAYBACK_MULTI_CH,
992dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
1002dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    /* Capture usecases */
1012dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    USECASE_AUDIO_RECORD,
1022dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    USECASE_AUDIO_RECORD_LOW_LATENCY,
1032dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
1042dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    USECASE_VOICE_CALL,
1052dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
1062dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    AUDIO_USECASE_MAX
1072dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda} audio_usecase_t;
1082dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
1092dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
1102dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
1112dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#define SOUND_CARD 0
1122dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
1132dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#define DEFAULT_OUTPUT_SAMPLING_RATE 48000
1142dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
1152dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda/*
1162dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * tinyAlsa library interprets period size as number of frames
1172dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * one frame = channel_count * sizeof (pcm sample)
1182dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * so if format = 16-bit PCM and channels = Stereo, frame size = 2 ch * 2 = 4 bytes
1192dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * DEEP_BUFFER_OUTPUT_PERIOD_SIZE = 1024 means 1024 * 4 = 4096 bytes
1202dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * We should take care of returning proper size when AudioFlinger queries for
1212dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * the buffer size of an input/output stream
1222dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda */
1232dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#define DEEP_BUFFER_OUTPUT_PERIOD_SIZE 1024
1242dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#define DEEP_BUFFER_OUTPUT_PERIOD_COUNT 8
1252dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
1262dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#define LOW_LATENCY_OUTPUT_PERIOD_SIZE 256
1272dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#define LOW_LATENCY_OUTPUT_PERIOD_COUNT 2
1282dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
1292dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#define HDMI_MULTI_PERIOD_SIZE  336
1302dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#define HDMI_MULTI_PERIOD_COUNT 8
1312dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#define HDMI_MULTI_DEFAULT_CHANNEL_COUNT 6
1322dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#define HDMI_MULTI_PERIOD_BYTES (HDMI_MULTI_PERIOD_SIZE * HDMI_MULTI_DEFAULT_CHANNEL_COUNT * 2)
1332dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
1342dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#define AUDIO_CAPTURE_PERIOD_SIZE 320
1352dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#define AUDIO_CAPTURE_PERIOD_COUNT 2
1362dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
1372dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#define MAX_SUPPORTED_CHANNEL_MASKS 2
1382dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
1392dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandastruct stream_out {
1402dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct audio_stream_out stream;
141150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent    pthread_mutex_t lock; /* see note below on mutex acquisition order */
1422dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct pcm_config config;
1432dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct pcm *pcm;
1442dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    int standby;
1452dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    int pcm_device_id;
1462dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_channel_mask_t channel_mask;
1472dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_devices_t devices;
1482dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_output_flags_t flags;
1492dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_usecase_t usecase;
1502dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    /* Array of supported channel mask configurations. +1 so that the last entry is always 0 */
1512dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_channel_mask_t supported_channel_masks[MAX_SUPPORTED_CHANNEL_MASKS + 1];
1522dfba2b9264a43951889e591260162a67894c0d0Ravi 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;
1642dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    int device;
1652dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_channel_mask_t channel_mask;
1662dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_usecase_t usecase;
1672dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
1682dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct audio_device *dev;
1692dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda};
1702dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
1712dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandatypedef enum {
1722dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    PCM_PLAYBACK,
1732dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    PCM_CAPTURE,
1742dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    VOICE_CALL
1752dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda} usecase_type_t;
1762dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
177096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamandaunion stream_ptr {
178096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamanda    struct stream_in *in;
179096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamanda    struct stream_out *out;
180096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamanda};
181096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamanda
1822dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandastruct audio_usecase {
1833b1816cd594eba53a9869d7b23af36daacf58fa1Ravi Kumar Alamanda    struct listnode list;
1842dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_usecase_t id;
1852dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    usecase_type_t  type;
1862dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_devices_t devices;
187096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamanda    union stream_ptr stream;
1882dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda};
1892dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
1902dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandatypedef void (*acdb_deallocate_t)();
1912dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandatypedef int  (*acdb_init_t)();
19275d924d06336949440090c214af199fd05d5bb06Ravi Kumar Alamandatypedef void (*acdb_send_audio_cal_t)(int, int);
19375d924d06336949440090c214af199fd05d5bb06Ravi Kumar Alamandatypedef void (*acdb_send_voice_cal_t)(int, int);
1942dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
1952dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandatypedef int (*csd_client_init_t)();
1962dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandatypedef int (*csd_client_deinit_t)();
1972dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandatypedef int (*csd_disable_device_t)();
1982dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandatypedef int (*csd_enable_device_t)(int, int, uint32_t);
1992dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandatypedef int (*csd_volume_t)(int);
2002dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandatypedef int (*csd_mic_mute_t)(int);
2012dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandatypedef int (*csd_start_voice_t)();
2022dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandatypedef int (*csd_stop_voice_t)();
2032dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
2042dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandastruct audio_device {
2052dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct audio_hw_device device;
206150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent    pthread_mutex_t lock; /* see note below on mutex acquisition order */
2072dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct mixer *mixer;
2082dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_mode_t mode;
2092dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    audio_devices_t out_device;
210c8400637beb896d2f5d7ae980682cd2d072a9da3Eric Laurent    struct stream_in *active_input;
211096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamanda    struct stream_out *primary_output;
2122dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    int in_call;
2132dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    float voice_volume;
2142dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    bool mic_mute;
2152dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    int tty_mode;
2162dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    bool bluetooth_nrec;
2172dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    bool screen_off;
2182dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct pcm *voice_call_rx;
2192dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct pcm *voice_call_tx;
2202dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    snd_device_t cur_out_snd_device;
2212dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    snd_device_t cur_in_snd_device;
2222dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    bool out_snd_device_active;
2232dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    bool in_snd_device_active;
2243b1816cd594eba53a9869d7b23af36daacf58fa1Ravi Kumar Alamanda    struct listnode usecase_list;
2252dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    struct audio_route *audio_route;
2262dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    int acdb_settings;
2272dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
22872c411f8ef451934ababc209eef482b9cc7005a8Ravi Kumar Alamanda    bool mic_type_analog;
22972c411f8ef451934ababc209eef482b9cc7005a8Ravi Kumar Alamanda    bool fluence_in_voice_call;
23072c411f8ef451934ababc209eef482b9cc7005a8Ravi Kumar Alamanda    bool fluence_in_voice_rec;
23172c411f8ef451934ababc209eef482b9cc7005a8Ravi Kumar Alamanda    int  dualmic_config;
23272c411f8ef451934ababc209eef482b9cc7005a8Ravi Kumar Alamanda
2332dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    /* Audio calibration related functions */
2342dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    void *acdb_handle;
2352dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    acdb_init_t acdb_init;
2362dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    acdb_deallocate_t acdb_deallocate;
2372dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    acdb_send_audio_cal_t acdb_send_audio_cal;
2382dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    acdb_send_voice_cal_t acdb_send_voice_cal;
2392dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
2402dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    /* CSD Client related functions for voice call */
2412dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    void *csd_client;
2422dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    csd_client_init_t csd_client_init;
2432dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    csd_client_deinit_t csd_client_deinit;
2442dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    csd_disable_device_t csd_disable_device;
2452dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    csd_enable_device_t csd_enable_device;
2462dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    csd_volume_t csd_volume;
2472dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    csd_mic_mute_t csd_mic_mute;
2482dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    csd_start_voice_t csd_start_voice;
2492dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    csd_stop_voice_t csd_stop_voice;
2502dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda};
2512dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
252150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent/*
253150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent * NOTE: when multiple mutexes have to be acquired, always take the
254150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent * stream_in or stream_out mutex first, followed by the audio_device mutex.
255150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent */
256150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent
2572dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandastruct pcm_config pcm_config_deep_buffer = {
2582dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    .channels = 2,
2592dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    .rate = DEFAULT_OUTPUT_SAMPLING_RATE,
2602dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    .period_size = DEEP_BUFFER_OUTPUT_PERIOD_SIZE,
2612dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    .period_count = DEEP_BUFFER_OUTPUT_PERIOD_COUNT,
2622dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    .format = PCM_FORMAT_S16_LE,
2632dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    .start_threshold = DEEP_BUFFER_OUTPUT_PERIOD_SIZE / 4,
2642dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    .avail_min = DEEP_BUFFER_OUTPUT_PERIOD_SIZE / 4,
2652dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda};
2662dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
2672dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandastruct pcm_config pcm_config_low_latency = {
2682dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    .channels = 2,
2692dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    .rate = DEFAULT_OUTPUT_SAMPLING_RATE,
2702dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    .period_size = LOW_LATENCY_OUTPUT_PERIOD_SIZE,
2712dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    .period_count = LOW_LATENCY_OUTPUT_PERIOD_COUNT,
2722dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    .format = PCM_FORMAT_S16_LE,
2732dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    .start_threshold = LOW_LATENCY_OUTPUT_PERIOD_SIZE / 4,
2742dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    .avail_min = LOW_LATENCY_OUTPUT_PERIOD_SIZE / 4,
2752dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda};
2762dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
2772dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandastruct pcm_config pcm_config_hdmi_multi = {
2782dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    .channels = HDMI_MULTI_DEFAULT_CHANNEL_COUNT, /* changed when the stream is opened */
2792dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    .rate = DEFAULT_OUTPUT_SAMPLING_RATE, /* changed when the stream is opened */
2802dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    .period_size = HDMI_MULTI_PERIOD_SIZE,
2812dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    .period_count = HDMI_MULTI_PERIOD_COUNT,
2822dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    .format = PCM_FORMAT_S16_LE,
2832dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    .start_threshold = 0,
2842dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    .avail_min = 0,
2852dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda};
2862dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
2872dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandastruct pcm_config pcm_config_audio_capture = {
2882dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    .channels = 2,
2892dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    .period_size = AUDIO_CAPTURE_PERIOD_SIZE,
2902dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    .period_count = AUDIO_CAPTURE_PERIOD_COUNT,
2912dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    .format = PCM_FORMAT_S16_LE,
2922dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda};
2932dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
2942dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandastruct pcm_config pcm_config_voice_call = {
2952dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    .channels = 1,
2962dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    .rate = 8000,
2972dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    .period_size = 160,
2982dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    .period_count = 2,
2992dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda    .format = PCM_FORMAT_S16_LE,
3002dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda};
3012dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda
302