1 /* 2 * Copyright (C) 2013-2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef QCOM_AUDIO_HW_H 18 #define QCOM_AUDIO_HW_H 19 20 #include <cutils/str_parms.h> 21 #include <cutils/list.h> 22 #include <hardware/audio.h> 23 24 #include <tinyalsa/asoundlib.h> 25 #include <tinycompress/tinycompress.h> 26 27 #include <audio_route/audio_route.h> 28 #include "voice.h" 29 30 #define VISUALIZER_LIBRARY_PATH "/system/lib/soundfx/libqcomvisualizer.so" 31 #define OFFLOAD_EFFECTS_BUNDLE_LIBRARY_PATH "/system/lib/soundfx/libqcompostprocbundle.so" 32 33 /* Flags used to initialize acdb_settings variable that goes to ACDB library */ 34 #define DMIC_FLAG 0x00000002 35 #define TTY_MODE_OFF 0x00000010 36 #define TTY_MODE_FULL 0x00000020 37 #define TTY_MODE_VCO 0x00000040 38 #define TTY_MODE_HCO 0x00000080 39 #define TTY_MODE_CLEAR 0xFFFFFF0F 40 41 #define ACDB_DEV_TYPE_OUT 1 42 #define ACDB_DEV_TYPE_IN 2 43 44 #define MAX_SUPPORTED_CHANNEL_MASKS 2 45 #define DEFAULT_HDMI_OUT_CHANNELS 2 46 47 typedef int snd_device_t; 48 49 /* These are the supported use cases by the hardware. 50 * Each usecase is mapped to a specific PCM device. 51 * Refer to pcm_device_table[]. 52 */ 53 enum { 54 USECASE_INVALID = -1, 55 /* Playback usecases */ 56 USECASE_AUDIO_PLAYBACK_DEEP_BUFFER = 0, 57 USECASE_AUDIO_PLAYBACK_LOW_LATENCY, 58 USECASE_AUDIO_PLAYBACK_MULTI_CH, 59 USECASE_AUDIO_PLAYBACK_OFFLOAD, 60 USECASE_AUDIO_PLAYBACK_TTS, 61 62 /* HFP Use case*/ 63 USECASE_AUDIO_HFP_SCO, 64 USECASE_AUDIO_HFP_SCO_WB, 65 66 /* Capture usecases */ 67 USECASE_AUDIO_RECORD, 68 USECASE_AUDIO_RECORD_LOW_LATENCY, 69 70 USECASE_VOICE_CALL, 71 72 /* Voice extension usecases */ 73 USECASE_VOICE2_CALL, 74 USECASE_VOLTE_CALL, 75 USECASE_QCHAT_CALL, 76 USECASE_VOWLAN_CALL, 77 USECASE_INCALL_REC_UPLINK, 78 USECASE_INCALL_REC_DOWNLINK, 79 USECASE_INCALL_REC_UPLINK_AND_DOWNLINK, 80 81 USECASE_AUDIO_SPKR_CALIB_RX, 82 USECASE_AUDIO_SPKR_CALIB_TX, 83 84 USECASE_AUDIO_PLAYBACK_AFE_PROXY, 85 USECASE_AUDIO_RECORD_AFE_PROXY, 86 USECASE_AUDIO_DSM_FEEDBACK, 87 88 AUDIO_USECASE_MAX 89 }; 90 91 const char * const use_case_table[AUDIO_USECASE_MAX]; 92 93 #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) 94 95 /* 96 * tinyAlsa library interprets period size as number of frames 97 * one frame = channel_count * sizeof (pcm sample) 98 * so if format = 16-bit PCM and channels = Stereo, frame size = 2 ch * 2 = 4 bytes 99 * DEEP_BUFFER_OUTPUT_PERIOD_SIZE = 1024 means 1024 * 4 = 4096 bytes 100 * We should take care of returning proper size when AudioFlinger queries for 101 * the buffer size of an input/output stream 102 */ 103 104 enum { 105 OFFLOAD_CMD_EXIT, /* exit compress offload thread loop*/ 106 OFFLOAD_CMD_DRAIN, /* send a full drain request to DSP */ 107 OFFLOAD_CMD_PARTIAL_DRAIN, /* send a partial drain request to DSP */ 108 OFFLOAD_CMD_WAIT_FOR_BUFFER, /* wait for buffer released by DSP */ 109 }; 110 111 enum { 112 OFFLOAD_STATE_IDLE, 113 OFFLOAD_STATE_PLAYING, 114 OFFLOAD_STATE_PAUSED, 115 }; 116 117 struct offload_cmd { 118 struct listnode node; 119 int cmd; 120 int data[]; 121 }; 122 123 struct stream_out { 124 struct audio_stream_out stream; 125 pthread_mutex_t lock; /* see note below on mutex acquisition order */ 126 pthread_cond_t cond; 127 struct pcm_config config; 128 struct compr_config compr_config; 129 struct pcm *pcm; 130 struct compress *compr; 131 int standby; 132 int pcm_device_id; 133 unsigned int sample_rate; 134 audio_channel_mask_t channel_mask; 135 audio_format_t format; 136 audio_devices_t devices; 137 audio_output_flags_t flags; 138 audio_usecase_t usecase; 139 /* Array of supported channel mask configurations. +1 so that the last entry is always 0 */ 140 audio_channel_mask_t supported_channel_masks[MAX_SUPPORTED_CHANNEL_MASKS + 1]; 141 bool muted; 142 uint64_t written; /* total frames written, not cleared when entering standby */ 143 audio_io_handle_t handle; 144 145 int non_blocking; 146 int playback_started; 147 int offload_state; 148 pthread_cond_t offload_cond; 149 pthread_t offload_thread; 150 struct listnode offload_cmd_list; 151 bool offload_thread_blocked; 152 153 stream_callback_t offload_callback; 154 void *offload_cookie; 155 struct compr_gapless_mdata gapless_mdata; 156 int send_new_metadata; 157 158 struct audio_device *dev; 159 }; 160 161 struct stream_in { 162 struct audio_stream_in stream; 163 pthread_mutex_t lock; /* see note below on mutex acquisition order */ 164 struct pcm_config config; 165 struct pcm *pcm; 166 int standby; 167 int source; 168 int pcm_device_id; 169 audio_devices_t device; 170 audio_channel_mask_t channel_mask; 171 audio_usecase_t usecase; 172 bool enable_aec; 173 bool enable_ns; 174 175 audio_io_handle_t capture_handle; 176 bool is_st_session; 177 bool is_st_session_active; 178 179 struct audio_device *dev; 180 }; 181 182 typedef enum { 183 PCM_PLAYBACK, 184 PCM_CAPTURE, 185 VOICE_CALL, 186 PCM_HFP_CALL 187 } usecase_type_t; 188 189 union stream_ptr { 190 struct stream_in *in; 191 struct stream_out *out; 192 }; 193 194 struct audio_usecase { 195 struct listnode list; 196 audio_usecase_t id; 197 usecase_type_t type; 198 audio_devices_t devices; 199 snd_device_t out_snd_device; 200 snd_device_t in_snd_device; 201 union stream_ptr stream; 202 }; 203 204 struct audio_device { 205 struct audio_hw_device device; 206 pthread_mutex_t lock; /* see note below on mutex acquisition order */ 207 struct mixer *mixer; 208 audio_mode_t mode; 209 struct stream_in *active_input; 210 struct stream_out *primary_output; 211 struct stream_out *voice_tx_output; 212 struct stream_out *current_call_output; 213 bool bluetooth_nrec; 214 bool screen_off; 215 int *snd_dev_ref_cnt; 216 struct listnode usecase_list; 217 struct audio_route *audio_route; 218 int acdb_settings; 219 struct voice voice; 220 unsigned int cur_hdmi_channels; 221 bool bt_wb_speech_enabled; 222 bool mic_muted; 223 bool enable_voicerx; 224 225 int snd_card; 226 void *platform; 227 void *extspk; 228 229 void *visualizer_lib; 230 int (*visualizer_start_output)(audio_io_handle_t, int); 231 int (*visualizer_stop_output)(audio_io_handle_t, int); 232 233 /* The pcm_params use_case_table is loaded by adev_verify_devices() upon 234 * calling adev_open(). 235 * 236 * If an entry is not NULL, it can be used to determine if extended precision 237 * or other capabilities are present for the device corresponding to that usecase. 238 */ 239 struct pcm_params *use_case_table[AUDIO_USECASE_MAX]; 240 void *offload_effects_lib; 241 int (*offload_effects_start_output)(audio_io_handle_t, int); 242 int (*offload_effects_stop_output)(audio_io_handle_t, int); 243 }; 244 245 int select_devices(struct audio_device *adev, 246 audio_usecase_t uc_id); 247 248 int disable_audio_route(struct audio_device *adev, 249 struct audio_usecase *usecase); 250 251 int disable_snd_device(struct audio_device *adev, 252 snd_device_t snd_device); 253 254 int enable_snd_device(struct audio_device *adev, 255 snd_device_t snd_device); 256 257 int enable_audio_route(struct audio_device *adev, 258 struct audio_usecase *usecase); 259 260 struct audio_usecase *get_usecase_from_list(struct audio_device *adev, 261 audio_usecase_t uc_id); 262 263 #define LITERAL_TO_STRING(x) #x 264 #define CHECK(condition) LOG_ALWAYS_FATAL_IF(!(condition), "%s",\ 265 __FILE__ ":" LITERAL_TO_STRING(__LINE__)\ 266 " ASSERT_FATAL(" #condition ") failed.") 267 268 /* 269 * NOTE: when multiple mutexes have to be acquired, always take the 270 * stream_in or stream_out mutex first, followed by the audio_device mutex. 271 */ 272 273 #endif // QCOM_AUDIO_HW_H 274