audio_hw.h revision 2ccd7babcde54a8073945dec69660cb60e66a931
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 28b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent/* Flags used to initialize acdb_settings variable that goes to ACDB library */ 29b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define DMIC_FLAG 0x00000002 30b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define TTY_MODE_OFF 0x00000010 31b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define TTY_MODE_FULL 0x00000020 32b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define TTY_MODE_VCO 0x00000040 33b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define TTY_MODE_HCO 0x00000080 34b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define TTY_MODE_CLEAR 0xFFFFFF0F 35b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent 362dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#define ACDB_DEV_TYPE_OUT 1 372dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#define ACDB_DEV_TYPE_IN 2 382dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda 39b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define MAX_SUPPORTED_CHANNEL_MASKS 2 402dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda 41b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurenttypedef int snd_device_t; 422dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda 432dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda/* These are the supported use cases by the hardware. 442dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * Each usecase is mapped to a specific PCM device. 452dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * Refer to pcm_device_table[]. 462dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda */ 472dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandatypedef enum { 482dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda USECASE_INVALID = -1, 492dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda /* Playback usecases */ 502dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda USECASE_AUDIO_PLAYBACK_DEEP_BUFFER = 0, 512dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda USECASE_AUDIO_PLAYBACK_LOW_LATENCY, 522dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda USECASE_AUDIO_PLAYBACK_MULTI_CH, 534e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda USECASE_AUDIO_PLAYBACK_OFFLOAD, 542dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda 552dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda /* Capture usecases */ 562dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda USECASE_AUDIO_RECORD, 572dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda USECASE_AUDIO_RECORD_LOW_LATENCY, 582dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda 592dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda USECASE_VOICE_CALL, 602dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda AUDIO_USECASE_MAX 612dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda} audio_usecase_t; 622dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda 632dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) 642dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda 652dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda/* 662dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * tinyAlsa library interprets period size as number of frames 672dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * one frame = channel_count * sizeof (pcm sample) 682dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * so if format = 16-bit PCM and channels = Stereo, frame size = 2 ch * 2 = 4 bytes 692dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * DEEP_BUFFER_OUTPUT_PERIOD_SIZE = 1024 means 1024 * 4 = 4096 bytes 702dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * We should take care of returning proper size when AudioFlinger queries for 712dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda * the buffer size of an input/output stream 722dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda */ 732dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda 744e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamandaenum { 754e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda OFFLOAD_CMD_EXIT, /* exit compress offload thread loop*/ 764e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda OFFLOAD_CMD_DRAIN, /* send a full drain request to DSP */ 774e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda OFFLOAD_CMD_PARTIAL_DRAIN, /* send a partial drain request to DSP */ 784e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda OFFLOAD_CMD_WAIT_FOR_BUFFER, /* wait for buffer released by DSP */ 794e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda}; 804e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda 814e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamandaenum { 824e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda OFFLOAD_STATE_IDLE, 834e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda OFFLOAD_STATE_PLAYING, 844e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda OFFLOAD_STATE_PAUSED, 854e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda}; 864e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda 874e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamandastruct offload_cmd { 884e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda struct listnode node; 894e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda int cmd; 904e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda int data[]; 914e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda}; 924e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda 932dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandastruct stream_out { 942dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda struct audio_stream_out stream; 95150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent pthread_mutex_t lock; /* see note below on mutex acquisition order */ 964e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda pthread_cond_t cond; 972dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda struct pcm_config config; 984e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda struct compr_config compr_config; 992dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda struct pcm *pcm; 1004e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda struct compress *compr; 1012dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda int standby; 1022dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda int pcm_device_id; 1034e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda unsigned int sample_rate; 1042dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda audio_channel_mask_t channel_mask; 1054e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda audio_format_t format; 1062dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda audio_devices_t devices; 1072dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda audio_output_flags_t flags; 1082dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda audio_usecase_t usecase; 1092dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda /* Array of supported channel mask configurations. +1 so that the last entry is always 0 */ 1102dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda audio_channel_mask_t supported_channel_masks[MAX_SUPPORTED_CHANNEL_MASKS + 1]; 111a9024defa11f6502ca55425a4803cd00441d51e7Eric Laurent bool muted; 1122ccd7babcde54a8073945dec69660cb60e66a931Glenn Kasten uint64_t written; /* total frames written, not cleared when entering standby */ 1132dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda 1144e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda int non_blocking; 1154e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda int playback_started; 1164e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda int offload_state; 1174e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda pthread_cond_t offload_cond; 1184e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda pthread_t offload_thread; 1194e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda struct listnode offload_cmd_list; 1204e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda bool offload_thread_blocked; 1214e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda 1224e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda stream_callback_t offload_callback; 1234e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda void *offload_cookie; 1244e02e5575f2eb440632a60fb8bed0a44ddae83afRavi Kumar Alamanda 1252dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda struct audio_device *dev; 1262dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda}; 1272dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda 1282dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandastruct stream_in { 1292dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda struct audio_stream_in stream; 130150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent pthread_mutex_t lock; /* see note below on mutex acquisition order */ 1312dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda struct pcm_config config; 1322dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda struct pcm *pcm; 1332dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda int standby; 1342dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda int source; 1352dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda int pcm_device_id; 1362dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda int device; 1372dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda audio_channel_mask_t channel_mask; 1382dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda audio_usecase_t usecase; 139f70ffb40ca0c4e8cce15c77fd9edff7f2b6980deRavi Kumar Alamanda bool enable_aec; 1402dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda 1412dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda struct audio_device *dev; 1422dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda}; 1432dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda 1442dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandatypedef enum { 1452dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda PCM_PLAYBACK, 1462dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda PCM_CAPTURE, 1472dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda VOICE_CALL 1482dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda} usecase_type_t; 1492dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda 150096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamandaunion stream_ptr { 151096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamanda struct stream_in *in; 152096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamanda struct stream_out *out; 153096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamanda}; 154096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamanda 1552dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandastruct audio_usecase { 1563b1816cd594eba53a9869d7b23af36daacf58fa1Ravi Kumar Alamanda struct listnode list; 1572dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda audio_usecase_t id; 1582dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda usecase_type_t type; 1592dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda audio_devices_t devices; 16071c84b70ff7c428e35ac187ca4a234acac558240Ravi Kumar Alamanda snd_device_t out_snd_device; 16171c84b70ff7c428e35ac187ca4a234acac558240Ravi Kumar Alamanda snd_device_t in_snd_device; 162096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamanda union stream_ptr stream; 1632dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda}; 1642dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda 1652dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamandastruct audio_device { 1662dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda struct audio_hw_device device; 167150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent pthread_mutex_t lock; /* see note below on mutex acquisition order */ 1682dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda struct mixer *mixer; 1692dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda audio_mode_t mode; 1702dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda audio_devices_t out_device; 171c8400637beb896d2f5d7ae980682cd2d072a9da3Eric Laurent struct stream_in *active_input; 172096c87f83ccc1439acb639dbab00faf5a393afa7Ravi Kumar Alamanda struct stream_out *primary_output; 1732dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda int in_call; 1742dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda float voice_volume; 1752dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda bool mic_mute; 1762dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda int tty_mode; 1772dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda bool bluetooth_nrec; 1782dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda bool screen_off; 1792dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda struct pcm *voice_call_rx; 1802dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda struct pcm *voice_call_tx; 181b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent int *snd_dev_ref_cnt; 1823b1816cd594eba53a9869d7b23af36daacf58fa1Ravi Kumar Alamanda struct listnode usecase_list; 1832dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda struct audio_route *audio_route; 1842dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda int acdb_settings; 185c56336bfad4661796b749fc4db7de3a1e6aba06fJean-Michel Trivi bool speaker_lr_swap; 1862dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda 187b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent void *platform; 1882dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda}; 1892dfba2b9264a43951889e591260162a67894c0d0Ravi Kumar Alamanda 190150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent/* 191150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent * NOTE: when multiple mutexes have to be acquired, always take the 192150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent * stream_in or stream_out mutex first, followed by the audio_device mutex. 193150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent */ 194150dbfe8b5b3ab634604d2a309d4ef9fb7602f4aEric Laurent 195b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#endif // QCOM_AUDIO_HW_H 196