Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 1 | /* |
| 2 | ** Copyright 2008, The Android Open-Source Project |
| 3 | ** Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. |
Giulio Cervera | 548b319 | 2013-04-20 07:44:26 +0200 | [diff] [blame] | 4 | ** Copyright (c) 2011-2013, The CyanogenMod Project |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 5 | ** Not a Contribution, Apache license notifications and license are retained |
| 6 | ** for attribution purposes only. |
| 7 | ** |
| 8 | ** Licensed under the Apache License, Version 2.0 (the "License"); |
| 9 | ** you may not use this file except in compliance with the License. |
| 10 | ** You may obtain a copy of the License at |
| 11 | ** |
| 12 | ** http://www.apache.org/licenses/LICENSE-2.0 |
| 13 | ** |
| 14 | ** Unless required by applicable law or agreed to in writing, software |
| 15 | ** distributed under the License is distributed on an "AS IS" BASIS, |
| 16 | ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 17 | ** See the License for the specific language governing permissions and |
| 18 | ** limitations under the License. |
| 19 | */ |
| 20 | |
| 21 | #ifndef ANDROID_AUDIO_HARDWARE_H |
| 22 | #define ANDROID_AUDIO_HARDWARE_H |
| 23 | |
| 24 | #include <stdint.h> |
| 25 | #include <sys/types.h> |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 26 | |
| 27 | #include <utils/threads.h> |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 28 | #include <utils/SortedVector.h> |
| 29 | |
| 30 | #include <hardware_legacy/AudioHardwareBase.h> |
| 31 | |
| 32 | extern "C" { |
| 33 | #include <linux/msm_audio.h> |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 34 | #include <linux/msm_audio_aac.h> |
Arne Coucheron | 0c85f77 | 2013-04-23 12:18:53 +0200 | [diff] [blame] | 35 | #ifdef WITH_QCOM_SPEECH |
| 36 | #include <linux/msm_audio_qcp.h> |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 37 | #include <linux/msm_audio_amrnb.h> |
Arne Coucheron | 0c85f77 | 2013-04-23 12:18:53 +0200 | [diff] [blame] | 38 | #endif |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 39 | } |
| 40 | |
| 41 | namespace android_audio_legacy { |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 42 | using android::SortedVector; |
| 43 | using android::Mutex; |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 44 | |
| 45 | // ---------------------------------------------------------------------------- |
| 46 | // Kernel driver interface |
| 47 | // |
| 48 | |
| 49 | #define SAMP_RATE_INDX_8000 0 |
| 50 | #define SAMP_RATE_INDX_11025 1 |
| 51 | #define SAMP_RATE_INDX_12000 2 |
| 52 | #define SAMP_RATE_INDX_16000 3 |
| 53 | #define SAMP_RATE_INDX_22050 4 |
| 54 | #define SAMP_RATE_INDX_24000 5 |
| 55 | #define SAMP_RATE_INDX_32000 6 |
| 56 | #define SAMP_RATE_INDX_44100 7 |
| 57 | #define SAMP_RATE_INDX_48000 8 |
| 58 | |
| 59 | #define EQ_MAX_BAND_NUM 12 |
| 60 | |
| 61 | #define ADRC_ENABLE 0x0001 |
| 62 | #define ADRC_DISABLE 0x0000 |
| 63 | #define EQ_ENABLE 0x0002 |
| 64 | #define EQ_DISABLE 0x0000 |
| 65 | #define RX_IIR_ENABLE 0x0004 |
| 66 | #define RX_IIR_DISABLE 0x0000 |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 67 | |
Michael Bestas | 14030ec | 2013-05-14 20:00:20 +0300 | [diff] [blame] | 68 | #ifdef HTC_AUDIO |
Giulio Cervera | 548b319 | 2013-04-20 07:44:26 +0200 | [diff] [blame] | 69 | #define MOD_PLAY 1 |
| 70 | #define MOD_REC 2 |
| 71 | #define MOD_TX 3 |
| 72 | #define MOD_RX 4 |
| 73 | |
| 74 | #define VOICE_VOLUME_MAX 100 /* Maximum voice volume */ |
| 75 | |
| 76 | #define ACDB_ID_HAC_HANDSET_MIC 107 |
| 77 | #define ACDB_ID_HAC_HANDSET_SPKR 207 |
| 78 | #define ACDB_ID_EXT_MIC_REC 307 |
| 79 | #define ACDB_ID_HEADSET_PLAYBACK 407 |
| 80 | #define ACDB_ID_HEADSET_RINGTONE_PLAYBACK 408 |
| 81 | #define ACDB_ID_INT_MIC_REC 507 |
| 82 | #define ACDB_ID_CAMCORDER 508 |
| 83 | #define ACDB_ID_INT_MIC_VR 509 |
| 84 | #define ACDB_ID_SPKR_PLAYBACK 607 |
| 85 | #define ACDB_ID_ALT_SPKR_PLAYBACK 608 |
Michael Bestas | 14030ec | 2013-05-14 20:00:20 +0300 | [diff] [blame] | 86 | #endif |
Giulio Cervera | 548b319 | 2013-04-20 07:44:26 +0200 | [diff] [blame] | 87 | |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 88 | struct eq_filter_type { |
| 89 | int16_t gain; |
| 90 | uint16_t freq; |
| 91 | uint16_t type; |
| 92 | uint16_t qf; |
| 93 | }; |
| 94 | |
| 95 | struct eqalizer { |
| 96 | uint16_t bands; |
| 97 | uint16_t params[132]; |
| 98 | }; |
| 99 | |
| 100 | struct rx_iir_filter { |
| 101 | uint16_t num_bands; |
| 102 | uint16_t iir_params[48]; |
| 103 | }; |
| 104 | |
| 105 | struct msm_audio_stats { |
Arne Coucheron | 0de404b | 2013-04-23 11:42:42 +0200 | [diff] [blame] | 106 | uint32_t out_bytes; |
| 107 | uint32_t unused[3]; |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 108 | }; |
| 109 | |
Arne Coucheron | 0c85f77 | 2013-04-23 12:18:53 +0200 | [diff] [blame] | 110 | #ifdef WITH_QCOM_SPEECH |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 111 | /* AMR frame type definitions */ |
| 112 | typedef enum { |
| 113 | AMRSUP_SPEECH_GOOD, /* Good speech frame */ |
| 114 | AMRSUP_SPEECH_DEGRADED, /* Speech degraded */ |
| 115 | AMRSUP_ONSET, /* onset */ |
| 116 | AMRSUP_SPEECH_BAD, /* Corrupt speech frame (bad CRC) */ |
| 117 | AMRSUP_SID_FIRST, /* First silence descriptor */ |
| 118 | AMRSUP_SID_UPDATE, /* Comfort noise frame */ |
| 119 | AMRSUP_SID_BAD, /* Corrupt SID frame (bad CRC) */ |
| 120 | AMRSUP_NO_DATA, /* Nothing to transmit */ |
| 121 | AMRSUP_SPEECH_LOST, /* Lost speech in downlink */ |
| 122 | AMRSUP_FRAME_TYPE_MAX |
| 123 | } amrsup_frame_type; |
| 124 | |
| 125 | /* AMR frame mode (frame rate) definitions */ |
| 126 | typedef enum { |
| 127 | AMRSUP_MODE_0475, /* 4.75 kbit /s */ |
| 128 | AMRSUP_MODE_0515, /* 5.15 kbit /s */ |
| 129 | AMRSUP_MODE_0590, /* 5.90 kbit /s */ |
| 130 | AMRSUP_MODE_0670, /* 6.70 kbit /s */ |
| 131 | AMRSUP_MODE_0740, /* 7.40 kbit /s */ |
| 132 | AMRSUP_MODE_0795, /* 7.95 kbit /s */ |
| 133 | AMRSUP_MODE_1020, /* 10.2 kbit /s */ |
| 134 | AMRSUP_MODE_1220, /* 12.2 kbit /s */ |
| 135 | AMRSUP_MODE_MAX |
| 136 | } amrsup_mode_type; |
| 137 | |
| 138 | /* The AMR classes |
| 139 | */ |
| 140 | typedef enum { |
| 141 | AMRSUP_CLASS_A, |
| 142 | AMRSUP_CLASS_B, |
| 143 | AMRSUP_CLASS_C |
| 144 | } amrsup_class_type; |
| 145 | |
| 146 | /* The maximum number of bits in each class */ |
| 147 | #define AMRSUP_CLASS_A_MAX 81 |
| 148 | #define AMRSUP_CLASS_B_MAX 405 |
| 149 | #define AMRSUP_CLASS_C_MAX 60 |
| 150 | |
| 151 | /* The size of the buffer required to hold the vocoder frame */ |
| 152 | #define AMRSUP_VOC_FRAME_BYTES \ |
| 153 | ((AMRSUP_CLASS_A_MAX + AMRSUP_CLASS_B_MAX + AMRSUP_CLASS_C_MAX + 7) / 8) |
| 154 | |
| 155 | /* Size of each AMR class to hold one frame of AMR data */ |
| 156 | #define AMRSUP_CLASS_A_BYTES ((AMRSUP_CLASS_A_MAX + 7) / 8) |
| 157 | #define AMRSUP_CLASS_B_BYTES ((AMRSUP_CLASS_B_MAX + 7) / 8) |
| 158 | #define AMRSUP_CLASS_C_BYTES ((AMRSUP_CLASS_C_MAX + 7) / 8) |
| 159 | |
| 160 | |
| 161 | /* Number of bytes for an AMR IF2 frame */ |
| 162 | #define AMRSUP_IF2_FRAME_BYTES 32 |
| 163 | |
| 164 | /* Frame types for 4-bit frame type as in 3GPP TS 26.101 v3.2.0, Sec.4.1.1 */ |
| 165 | typedef enum { |
| 166 | AMRSUP_FRAME_TYPE_INDEX_0475 = 0, /* 4.75 kbit /s */ |
| 167 | AMRSUP_FRAME_TYPE_INDEX_0515 = 1, /* 5.15 kbit /s */ |
| 168 | AMRSUP_FRAME_TYPE_INDEX_0590 = 2, /* 5.90 kbit /s */ |
| 169 | AMRSUP_FRAME_TYPE_INDEX_0670 = 3, /* 6.70 kbit /s */ |
| 170 | AMRSUP_FRAME_TYPE_INDEX_0740 = 4, /* 7.40 kbit /s */ |
| 171 | AMRSUP_FRAME_TYPE_INDEX_0795 = 5, /* 7.95 kbit /s */ |
| 172 | AMRSUP_FRAME_TYPE_INDEX_1020 = 6, /* 10.2 kbit /s */ |
| 173 | AMRSUP_FRAME_TYPE_INDEX_1220 = 7, /* 12.2 kbit /s */ |
| 174 | AMRSUP_FRAME_TYPE_INDEX_AMR_SID = 8, /* SID frame */ |
| 175 | /* Frame types 9-11 are not supported */ |
| 176 | AMRSUP_FRAME_TYPE_INDEX_NO_DATA = 15, /* No data */ |
| 177 | AMRSUP_FRAME_TYPE_INDEX_MAX, |
| 178 | AMRSUP_FRAME_TYPE_INDEX_UNDEF = AMRSUP_FRAME_TYPE_INDEX_MAX |
| 179 | } amrsup_frame_type_index_type; |
| 180 | |
| 181 | #define AMRSUP_FRAME_TYPE_INDEX_MASK 0x0F /* All frame types */ |
| 182 | #define AMRSUP_FRAME_TYPE_INDEX_SPEECH_MASK 0x07 /* Speech frame */ |
| 183 | |
| 184 | typedef enum { |
| 185 | AMRSUP_CODEC_AMR_NB, |
| 186 | AMRSUP_CODEC_AMR_WB, |
| 187 | AMRSUP_CODEC_MAX |
| 188 | } amrsup_codec_type; |
| 189 | |
| 190 | /* IF1-encoded frame info */ |
| 191 | typedef struct { |
| 192 | amrsup_frame_type_index_type frame_type_index; |
| 193 | unsigned char fqi; /* frame quality indicator: TRUE: good frame, FALSE: bad */ |
| 194 | amrsup_codec_type amr_type; /* AMR-NB or AMR-WB */ |
| 195 | } amrsup_if1_frame_info_type; |
| 196 | |
| 197 | #define AUDFADEC_AMR_FRAME_TYPE_MASK 0x78 |
| 198 | #define AUDFADEC_AMR_FRAME_TYPE_SHIFT 3 |
| 199 | #define AUDFADEC_AMR_FRAME_QUALITY_MASK 0x04 |
| 200 | |
| 201 | #define AMR_CLASS_A_BITS_BAD 0 |
| 202 | |
| 203 | #define AMR_CLASS_A_BITS_SID 39 |
| 204 | |
| 205 | #define AMR_CLASS_A_BITS_122 81 |
| 206 | #define AMR_CLASS_B_BITS_122 103 |
| 207 | #define AMR_CLASS_C_BITS_122 60 |
| 208 | |
| 209 | typedef struct { |
| 210 | int len_a; |
| 211 | unsigned short *class_a; |
| 212 | int len_b; |
| 213 | unsigned short *class_b; |
| 214 | int len_c; |
| 215 | unsigned short *class_c; |
| 216 | } amrsup_frame_order_type; |
Arne Coucheron | 0c85f77 | 2013-04-23 12:18:53 +0200 | [diff] [blame] | 217 | #endif |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 218 | |
Michael Bestas | 14030ec | 2013-05-14 20:00:20 +0300 | [diff] [blame] | 219 | #ifdef HTC_AUDIO |
Giulio Cervera | 548b319 | 2013-04-20 07:44:26 +0200 | [diff] [blame] | 220 | struct msm_bt_endpoint { |
| 221 | int tx; |
| 222 | int rx; |
| 223 | char name[64]; |
| 224 | }; |
Michael Bestas | 14030ec | 2013-05-14 20:00:20 +0300 | [diff] [blame] | 225 | #endif |
Giulio Cervera | 548b319 | 2013-04-20 07:44:26 +0200 | [diff] [blame] | 226 | |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 227 | enum tty_modes { |
| 228 | TTY_OFF = 0, |
| 229 | TTY_VCO = 1, |
| 230 | TTY_HCO = 2, |
| 231 | TTY_FULL = 3 |
| 232 | }; |
| 233 | |
| 234 | #define CODEC_TYPE_PCM 0 |
| 235 | #define AUDIO_HW_NUM_OUT_BUF 2 // Number of buffers in audio driver for output |
| 236 | // TODO: determine actual audio DSP and hardware latency |
| 237 | #define AUDIO_HW_OUT_LATENCY_MS 0 // Additionnal latency introduced by audio DSP and hardware in ms |
| 238 | |
| 239 | #define AUDIO_HW_IN_SAMPLERATE 8000 // Default audio input sample rate |
| 240 | #define AUDIO_HW_IN_CHANNELS (AudioSystem::CHANNEL_IN_MONO) // Default audio input channel mask |
| 241 | #define AUDIO_HW_IN_BUFFERSIZE 2048 // Default audio input buffer size |
| 242 | #define AUDIO_HW_IN_FORMAT (AudioSystem::PCM_16_BIT) // Default audio input sample format |
| 243 | #define AUDIO_HW_VOIP_BUFFERSIZE_8K 320 |
| 244 | #define AUDIO_HW_VOIP_BUFFERSIZE_16K 640 |
| 245 | #define AUDIO_HW_VOIP_SAMPLERATE_8K 8000 |
| 246 | #define AUDIO_HW_VOIP_SAMPLERATE_16K 16000 |
Arne Coucheron | 0c85f77 | 2013-04-23 12:18:53 +0200 | [diff] [blame] | 247 | |
| 248 | #ifdef WITH_QCOM_SPEECH |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 249 | /* ======================== 12.2 kbps mode ========================== */ |
| 250 | const unsigned short amrsup_bit_order_122_a[AMR_CLASS_A_BITS_122] = { |
| 251 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, |
| 252 | 10, 11, 12, 13, 14, 23, 15, 16, 17, 18, |
| 253 | 19, 20, 21, 22, 24, 25, 26, 27, 28, 38, |
| 254 | 141, 39, 142, 40, 143, 41, 144, 42, 145, 43, |
| 255 | 146, 44, 147, 45, 148, 46, 149, 47, 97, 150, |
| 256 | 200, 48, 98, 151, 201, 49, 99, 152, 202, 86, |
| 257 | 136, 189, 239, 87, 137, 190, 240, 88, 138, 191, |
| 258 | 241, 91, 194, 92, 195, 93, 196, 94, 197, 95, |
| 259 | 198 |
| 260 | }; |
| 261 | |
| 262 | const unsigned short amrsup_bit_order_122_b[AMR_CLASS_B_BITS_122] = { |
| 263 | /**/ 29, 30, 31, 32, 33, 34, 35, 50, 100, |
| 264 | 153, 203, 89, 139, 192, 242, 51, 101, 154, 204, |
| 265 | 55, 105, 158, 208, 90, 140, 193, 243, 59, 109, |
| 266 | 162, 212, 63, 113, 166, 216, 67, 117, 170, 220, |
| 267 | 36, 37, 54, 53, 52, 58, 57, 56, 62, 61, |
| 268 | 60, 66, 65, 64, 70, 69, 68, 104, 103, 102, |
| 269 | 108, 107, 106, 112, 111, 110, 116, 115, 114, 120, |
| 270 | 119, 118, 157, 156, 155, 161, 160, 159, 165, 164, |
| 271 | 163, 169, 168, 167, 173, 172, 171, 207, 206, 205, |
| 272 | 211, 210, 209, 215, 214, 213, 219, 218, 217, 223, |
| 273 | 222, 221, 73, 72 |
| 274 | }; |
| 275 | |
| 276 | |
| 277 | const unsigned short amrsup_bit_order_122_c[AMR_CLASS_C_BITS_122] = { |
| 278 | /* ------------- */ 71, 76, 75, 74, 79, 78, |
| 279 | 77, 82, 81, 80, 85, 84, 83, 123, 122, 121, |
| 280 | 126, 125, 124, 129, 128, 127, 132, 131, 130, 135, |
| 281 | 134, 133, 176, 175, 174, 179, 178, 177, 182, 181, |
| 282 | 180, 185, 184, 183, 188, 187, 186, 226, 225, 224, |
| 283 | 229, 228, 227, 232, 231, 230, 235, 234, 233, 238, |
| 284 | 237, 236, 96, 199 |
| 285 | }; |
| 286 | |
| 287 | |
| 288 | const amrsup_frame_order_type amrsup_122_framing = { |
| 289 | AMR_CLASS_A_BITS_122, |
| 290 | (unsigned short *) amrsup_bit_order_122_a, |
| 291 | AMR_CLASS_B_BITS_122, |
| 292 | (unsigned short *) amrsup_bit_order_122_b, |
| 293 | AMR_CLASS_C_BITS_122, |
| 294 | (unsigned short *) amrsup_bit_order_122_c |
| 295 | }; |
Arne Coucheron | 0c85f77 | 2013-04-23 12:18:53 +0200 | [diff] [blame] | 296 | #endif |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 297 | |
| 298 | // ---------------------------------------------------------------------------- |
| 299 | |
| 300 | using android_audio_legacy::AudioHardwareBase; |
| 301 | using android_audio_legacy::AudioStreamOut; |
| 302 | using android_audio_legacy::AudioStreamIn; |
| 303 | using android_audio_legacy::AudioSystem; |
| 304 | using android_audio_legacy::AudioHardwareInterface; |
| 305 | |
| 306 | class AudioHardware : public AudioHardwareBase |
| 307 | { |
| 308 | class AudioStreamOutMSM72xx; |
Arne Coucheron | 0de404b | 2013-04-23 11:42:42 +0200 | [diff] [blame] | 309 | #ifdef QCOM_TUNNEL_LPA_ENABLED |
| 310 | class AudioSessionOutMSM7xxx; |
| 311 | #endif /* QCOM_TUNNEL_LPA_ENABLED */ |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 312 | class AudioStreamInMSM72xx; |
Arne Coucheron | 0c85f77 | 2013-04-23 12:18:53 +0200 | [diff] [blame] | 313 | #ifdef WITH_QCOM_VOIP_OVER_MVS |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 314 | class AudioStreamOutDirect; |
| 315 | class AudioStreamInVoip; |
Arne Coucheron | 0c85f77 | 2013-04-23 12:18:53 +0200 | [diff] [blame] | 316 | #endif |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 317 | |
| 318 | public: |
| 319 | AudioHardware(); |
| 320 | virtual ~AudioHardware(); |
| 321 | virtual status_t initCheck(); |
| 322 | |
| 323 | virtual status_t setVoiceVolume(float volume); |
| 324 | virtual status_t setMasterVolume(float volume); |
| 325 | #ifdef QCOM_FM_ENABLED |
| 326 | virtual status_t setFmVolume(float volume); |
| 327 | #endif |
| 328 | virtual status_t setMode(int mode); |
| 329 | |
| 330 | // mic mute |
| 331 | virtual status_t setMicMute(bool state); |
| 332 | virtual status_t getMicMute(bool* state); |
| 333 | |
| 334 | virtual status_t setParameters(const String8& keyValuePairs); |
| 335 | virtual String8 getParameters(const String8& keys); |
| 336 | |
| 337 | // create I/O streams |
| 338 | virtual AudioStreamOut* openOutputStream( |
| 339 | uint32_t devices, |
| 340 | // audio_output_flags_t flags, |
| 341 | int *format=0, |
| 342 | uint32_t *channels=0, |
| 343 | uint32_t *sampleRate=0, |
| 344 | status_t *status=0); |
Arne Coucheron | 0de404b | 2013-04-23 11:42:42 +0200 | [diff] [blame] | 345 | #ifdef QCOM_TUNNEL_LPA_ENABLED |
| 346 | virtual AudioStreamOut* openOutputSession( |
| 347 | uint32_t devices, |
| 348 | int *format=0, |
| 349 | status_t *status=0, |
| 350 | int sessionId=-1, |
| 351 | uint32_t samplingRate=0, |
| 352 | uint32_t channels=0); |
| 353 | #endif /* QCOM_TUNNEL_LPA_ENABLED */ |
| 354 | |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 355 | virtual AudioStreamIn* openInputStream( |
| 356 | |
| 357 | uint32_t devices, |
| 358 | int *format, |
| 359 | uint32_t *channels, |
| 360 | uint32_t *sampleRate, |
| 361 | status_t *status, |
| 362 | AudioSystem::audio_in_acoustics acoustics); |
| 363 | |
| 364 | virtual void closeOutputStream(AudioStreamOut* out); |
| 365 | virtual void closeInputStream(AudioStreamIn* in); |
| 366 | |
| 367 | virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount); |
| 368 | void clearCurDevice() { mCurSndDevice = -1; } |
| 369 | |
| 370 | protected: |
| 371 | virtual status_t dump(int fd, const Vector<String16>& args); |
Sunil Joseph | 672734e | 2012-10-26 17:19:49 +0530 | [diff] [blame] | 372 | status_t setupDeviceforVoipCall(bool value); |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 373 | |
| 374 | private: |
| 375 | |
Michael Bestas | 14030ec | 2013-05-14 20:00:20 +0300 | [diff] [blame] | 376 | #ifdef HTC_AUDIO |
Giulio Cervera | f0ec98d | 2013-04-21 05:01:48 +0200 | [diff] [blame] | 377 | status_t doAudioRouteOrMuteHTC(uint32_t device); |
Michael Bestas | 14030ec | 2013-05-14 20:00:20 +0300 | [diff] [blame] | 378 | #endif |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 379 | status_t doAudioRouteOrMute(uint32_t device); |
| 380 | status_t setMicMute_nosync(bool state); |
| 381 | status_t checkMicMute(); |
| 382 | status_t dumpInternals(int fd, const Vector<String16>& args); |
| 383 | uint32_t getInputSampleRate(uint32_t sampleRate); |
| 384 | bool checkOutputStandby(); |
Arne Coucheron | 0de404b | 2013-04-23 11:42:42 +0200 | [diff] [blame] | 385 | status_t doRouting(AudioStreamInMSM72xx *input); |
Arne Coucheron | 0c85f77 | 2013-04-23 12:18:53 +0200 | [diff] [blame] | 386 | #ifdef QCOM_FM_ENABLED |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 387 | status_t enableFM(int sndDevice); |
Arne Coucheron | 0c85f77 | 2013-04-23 12:18:53 +0200 | [diff] [blame] | 388 | #endif |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 389 | status_t enableComboDevice(uint32_t sndDevice, bool enableOrDisable); |
Arne Coucheron | 0c85f77 | 2013-04-23 12:18:53 +0200 | [diff] [blame] | 390 | #ifdef QCOM_FM_ENABLED |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 391 | status_t disableFM(); |
Arne Coucheron | 0c85f77 | 2013-04-23 12:18:53 +0200 | [diff] [blame] | 392 | #endif |
Michael Bestas | 14030ec | 2013-05-14 20:00:20 +0300 | [diff] [blame] | 393 | #ifdef HTC_AUDIO |
Giulio Cervera | 548b319 | 2013-04-20 07:44:26 +0200 | [diff] [blame] | 394 | status_t get_mMode(); |
| 395 | status_t set_mRecordState(bool onoff); |
| 396 | status_t get_mRecordState(); |
| 397 | status_t get_snd_dev(); |
| 398 | uint32_t getACDB(int mode, uint32_t device); |
| 399 | status_t do_aic3254_control(uint32_t device); |
| 400 | bool isAic3254Device(uint32_t device); |
| 401 | status_t aic3254_config(uint32_t device); |
| 402 | int aic3254_ioctl(int cmd, const int argc); |
| 403 | void aic3254_powerdown(); |
| 404 | int aic3254_set_volume(int volume); |
Michael Bestas | 14030ec | 2013-05-14 20:00:20 +0300 | [diff] [blame] | 405 | #endif |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 406 | AudioStreamInMSM72xx* getActiveInput_l(); |
Arne Coucheron | 0c85f77 | 2013-04-23 12:18:53 +0200 | [diff] [blame] | 407 | #ifdef WITH_QCOM_VOIP_OVER_MVS |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 408 | AudioStreamInVoip* getActiveVoipInput_l(); |
Arne Coucheron | 0c85f77 | 2013-04-23 12:18:53 +0200 | [diff] [blame] | 409 | #endif |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 410 | FILE *fp; |
| 411 | |
| 412 | class AudioStreamOutMSM72xx : public AudioStreamOut { |
| 413 | public: |
| 414 | AudioStreamOutMSM72xx(); |
| 415 | virtual ~AudioStreamOutMSM72xx(); |
| 416 | status_t set(AudioHardware* mHardware, |
| 417 | uint32_t devices, |
| 418 | int *pFormat, |
| 419 | uint32_t *pChannels, |
| 420 | uint32_t *pRate); |
| 421 | virtual uint32_t sampleRate() const { return 44100; } |
| 422 | // must be 32-bit aligned - driver only seems to like 4800 |
| 423 | virtual size_t bufferSize() const { return 4800; } |
| 424 | virtual uint32_t channels() const { return AudioSystem::CHANNEL_OUT_STEREO; } |
| 425 | virtual int format() const { return AudioSystem::PCM_16_BIT; } |
| 426 | virtual uint32_t latency() const { return (1000*AUDIO_HW_NUM_OUT_BUF*(bufferSize()/frameSize()))/sampleRate()+AUDIO_HW_OUT_LATENCY_MS; } |
| 427 | virtual status_t setVolume(float left, float right) { return INVALID_OPERATION; } |
| 428 | virtual ssize_t write(const void* buffer, size_t bytes); |
| 429 | virtual status_t standby(); |
| 430 | virtual status_t dump(int fd, const Vector<String16>& args); |
| 431 | bool checkStandby(); |
| 432 | virtual status_t setParameters(const String8& keyValuePairs); |
| 433 | virtual String8 getParameters(const String8& keys); |
| 434 | uint32_t devices() { return mDevices; } |
| 435 | virtual status_t getRenderPosition(uint32_t *dspFrames); |
| 436 | |
| 437 | private: |
| 438 | AudioHardware* mHardware; |
| 439 | int mFd; |
| 440 | int mStartCount; |
| 441 | int mRetryCount; |
| 442 | bool mStandby; |
| 443 | uint32_t mDevices; |
| 444 | }; |
Arne Coucheron | 0c85f77 | 2013-04-23 12:18:53 +0200 | [diff] [blame] | 445 | #ifdef WITH_QCOM_VOIP_OVER_MVS |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 446 | class AudioStreamOutDirect : public AudioStreamOut { |
| 447 | public: |
| 448 | AudioStreamOutDirect(); |
| 449 | virtual ~AudioStreamOutDirect(); |
| 450 | status_t set(AudioHardware* mHardware, |
| 451 | uint32_t devices, |
| 452 | int *pFormat, |
| 453 | uint32_t *pChannels, |
| 454 | uint32_t *pRate); |
| 455 | virtual uint32_t sampleRate() const { ALOGE(" AudioStreamOutDirect: sampleRate\n"); return 8000; } |
| 456 | // must be 32-bit aligned - driver only seems to like 4800 |
| 457 | virtual size_t bufferSize() const { ALOGE(" AudioStreamOutDirect: bufferSize\n"); return 320; } |
| 458 | virtual uint32_t channels() const {ALOGD(" AudioStreamOutDirect: channels\n"); return mChannels; } |
| 459 | virtual int format() const {ALOGE(" AudioStreamOutDirect: format\n"); return AudioSystem::PCM_16_BIT; } |
| 460 | virtual uint32_t latency() const { return (1000*AUDIO_HW_NUM_OUT_BUF*(bufferSize()/frameSize()))/sampleRate()+AUDIO_HW_OUT_LATENCY_MS; } |
| 461 | virtual status_t setVolume(float left, float right) { return INVALID_OPERATION; } |
| 462 | virtual ssize_t write(const void* buffer, size_t bytes); |
| 463 | virtual status_t standby(); |
| 464 | virtual status_t dump(int fd, const Vector<String16>& args); |
| 465 | bool checkStandby(); |
| 466 | virtual status_t setParameters(const String8& keyValuePairs); |
| 467 | virtual String8 getParameters(const String8& keys); |
| 468 | uint32_t devices() { return mDevices; } |
| 469 | virtual status_t getRenderPosition(uint32_t *dspFrames); |
| 470 | |
| 471 | private: |
| 472 | AudioHardware* mHardware; |
| 473 | int mFd; |
| 474 | int mStartCount; |
| 475 | int mRetryCount; |
| 476 | bool mStandby; |
| 477 | uint32_t mDevices; |
| 478 | int mSessionId; |
| 479 | uint32_t mChannels; |
| 480 | uint32_t mSampleRate; |
| 481 | size_t mBufferSize; |
| 482 | int mFormat; |
| 483 | |
| 484 | }; |
Arne Coucheron | 0c85f77 | 2013-04-23 12:18:53 +0200 | [diff] [blame] | 485 | #endif |
Arne Coucheron | 0de404b | 2013-04-23 11:42:42 +0200 | [diff] [blame] | 486 | #ifdef QCOM_TUNNEL_LPA_ENABLED |
| 487 | class AudioSessionOutMSM7xxx : public AudioStreamOut { |
| 488 | public: |
| 489 | AudioSessionOutMSM7xxx(); |
| 490 | virtual ~AudioSessionOutMSM7xxx(); |
| 491 | status_t set(AudioHardware* mHardware, |
| 492 | uint32_t devices, |
| 493 | int *pFormat, |
| 494 | int32_t sessionId); |
| 495 | virtual uint32_t sampleRate() const { return 44100; } |
| 496 | // must be 32-bit aligned - driver only seems to like 4800 |
| 497 | virtual size_t bufferSize() const { return 4800; } |
| 498 | virtual uint32_t channels() const { return AudioSystem::CHANNEL_OUT_STEREO; } |
| 499 | virtual int format() const { return AudioSystem::MP3; } |
| 500 | virtual uint32_t latency() const { return 0; } |
| 501 | virtual status_t setVolume(float left, float right); |
| 502 | virtual ssize_t write(const void* buffer, size_t bytes) {return 0;}; |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 503 | virtual status_t standby(); |
Arne Coucheron | 0de404b | 2013-04-23 11:42:42 +0200 | [diff] [blame] | 504 | virtual status_t dump(int fd, const Vector<String16>& args) {return 0;}; |
| 505 | bool checkStandby(); |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 506 | virtual status_t setParameters(const String8& keyValuePairs); |
| 507 | virtual String8 getParameters(const String8& keys); |
Arne Coucheron | 0de404b | 2013-04-23 11:42:42 +0200 | [diff] [blame] | 508 | uint32_t devices() { return mDevices; } |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 509 | virtual status_t getRenderPosition(uint32_t *dspFrames); |
| 510 | |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 511 | private: |
Arne Coucheron | 0de404b | 2013-04-23 11:42:42 +0200 | [diff] [blame] | 512 | AudioHardware* mHardware; |
| 513 | int mStartCount; |
| 514 | int mRetryCount; |
| 515 | bool mStandby; |
| 516 | uint32_t mDevices; |
| 517 | int mSessionId; |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 518 | }; |
Arne Coucheron | 0de404b | 2013-04-23 11:42:42 +0200 | [diff] [blame] | 519 | #endif /* QCOM_TUNNEL_LPA_ENABLED */ |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 520 | |
| 521 | class AudioStreamInMSM72xx : public AudioStreamIn { |
| 522 | public: |
| 523 | enum input_state { |
| 524 | AUDIO_INPUT_CLOSED, |
| 525 | AUDIO_INPUT_OPENED, |
| 526 | AUDIO_INPUT_STARTED |
| 527 | }; |
| 528 | |
| 529 | AudioStreamInMSM72xx(); |
| 530 | virtual ~AudioStreamInMSM72xx(); |
| 531 | status_t set(AudioHardware* mHardware, |
| 532 | uint32_t devices, |
| 533 | int *pFormat, |
| 534 | uint32_t *pChannels, |
| 535 | uint32_t *pRate, |
| 536 | AudioSystem::audio_in_acoustics acoustics); |
| 537 | virtual size_t bufferSize() const { return mBufferSize; } |
| 538 | virtual uint32_t channels() const { return mChannels; } |
| 539 | virtual int format() const { return mFormat; } |
| 540 | virtual uint32_t sampleRate() const { return mSampleRate; } |
| 541 | virtual status_t setGain(float gain) { return INVALID_OPERATION; } |
| 542 | virtual ssize_t read(void* buffer, ssize_t bytes); |
| 543 | virtual status_t dump(int fd, const Vector<String16>& args); |
| 544 | virtual status_t standby(); |
| 545 | virtual status_t setParameters(const String8& keyValuePairs); |
| 546 | virtual String8 getParameters(const String8& keys); |
| 547 | virtual unsigned int getInputFramesLost() const { return 0; } |
| 548 | uint32_t devices() { return mDevices; } |
| 549 | int state() const { return mState; } |
| 550 | virtual status_t addAudioEffect(effect_interface_s**) { return 0;} |
| 551 | virtual status_t removeAudioEffect(effect_interface_s**) { return 0;} |
| 552 | |
| 553 | private: |
| 554 | AudioHardware* mHardware; |
| 555 | int mFd; |
| 556 | int mState; |
| 557 | int mRetryCount; |
| 558 | int mFormat; |
| 559 | uint32_t mChannels; |
| 560 | uint32_t mSampleRate; |
| 561 | size_t mBufferSize; |
| 562 | AudioSystem::audio_in_acoustics mAcoustics; |
| 563 | uint32_t mDevices; |
| 564 | bool mFirstread; |
| 565 | uint32_t mFmRec; |
| 566 | }; |
| 567 | |
Arne Coucheron | 0c85f77 | 2013-04-23 12:18:53 +0200 | [diff] [blame] | 568 | #ifdef WITH_QCOM_VOIP_OVER_MVS |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 569 | class AudioStreamInVoip : public AudioStreamInMSM72xx { //*/ AudioStreamIn { |
| 570 | public: |
| 571 | enum input_state { |
| 572 | AUDIO_INPUT_CLOSED, |
| 573 | AUDIO_INPUT_OPENED, |
| 574 | AUDIO_INPUT_STARTED |
| 575 | }; |
| 576 | |
| 577 | AudioStreamInVoip(); |
| 578 | virtual ~AudioStreamInVoip(); |
| 579 | status_t set(AudioHardware* mHardware, |
| 580 | uint32_t devices, |
| 581 | int *pFormat, |
| 582 | uint32_t *pChannels, |
| 583 | uint32_t *pRate, |
| 584 | AudioSystem::audio_in_acoustics acoustics); |
| 585 | virtual size_t bufferSize() const { ALOGE("\n AudioStreamInVoip mBufferSize %d ",mBufferSize); return mBufferSize; } //320; } |
| 586 | virtual uint32_t channels() const {ALOGD(" AudioStreamInVoip: channels %d \n",mChannels); return mChannels; } |
| 587 | virtual int format() const { ALOGE("\n AudioStreamInVoip mFormat %d",mFormat); return mFormat; }//AUDIO_HW_IN_FORMAT; } |
| 588 | virtual uint32_t sampleRate() const { ALOGE("\n AudioStreamInVoip mSampleRate %d ",mSampleRate); return mSampleRate;} //8000; } |
| 589 | virtual status_t setGain(float gain) { return INVALID_OPERATION; } |
| 590 | virtual ssize_t read(void* buffer, ssize_t bytes); |
| 591 | virtual status_t dump(int fd, const Vector<String16>& args); |
| 592 | virtual status_t standby(); |
| 593 | virtual status_t setParameters(const String8& keyValuePairs); |
| 594 | virtual String8 getParameters(const String8& keys); |
| 595 | virtual unsigned int getInputFramesLost() const { return 0; } |
| 596 | uint32_t devices() { return mDevices; } |
| 597 | int state() const { return mState; } |
| 598 | |
| 599 | private: |
| 600 | AudioHardware* mHardware; |
| 601 | int mFd; |
| 602 | int mState; |
| 603 | int mRetryCount; |
| 604 | int mFormat; |
| 605 | uint32_t mChannels; |
| 606 | uint32_t mSampleRate; |
| 607 | size_t mBufferSize; |
| 608 | AudioSystem::audio_in_acoustics mAcoustics; |
| 609 | uint32_t mDevices; |
| 610 | bool mFirstread; |
| 611 | uint32_t mFmRec; |
| 612 | int mSessionId; |
| 613 | }; |
Arne Coucheron | 0c85f77 | 2013-04-23 12:18:53 +0200 | [diff] [blame] | 614 | #endif |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 615 | static const uint32_t inputSamplingRates[]; |
| 616 | bool mInit; |
| 617 | bool mMicMute; |
| 618 | int mFmFd; |
| 619 | bool mBluetoothNrec; |
| 620 | bool mBluetoothVGS; |
| 621 | uint32_t mBluetoothId; |
Michael Bestas | 14030ec | 2013-05-14 20:00:20 +0300 | [diff] [blame] | 622 | float mVoiceVolume; |
| 623 | #ifdef HTC_AUDIO |
Giulio Cervera | 548b319 | 2013-04-20 07:44:26 +0200 | [diff] [blame] | 624 | bool mHACSetting; |
| 625 | uint32_t mBluetoothIdTx; |
| 626 | uint32_t mBluetoothIdRx; |
| 627 | msm_bt_endpoint *mBTEndpoints; |
| 628 | int mNumBTEndpoints; |
Giulio Cervera | 548b319 | 2013-04-20 07:44:26 +0200 | [diff] [blame] | 629 | int mNoiseSuppressionState; |
| 630 | bool mRecordState; |
| 631 | char mCurDspProfile[22]; |
| 632 | bool mEffectEnabled; |
| 633 | char mActiveAP[10]; |
| 634 | char mEffect[10]; |
Michael Bestas | 14030ec | 2013-05-14 20:00:20 +0300 | [diff] [blame] | 635 | #endif |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 636 | AudioStreamOutMSM72xx* mOutput; |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 637 | SortedVector <AudioStreamInMSM72xx*> mInputs; |
Arne Coucheron | 0c85f77 | 2013-04-23 12:18:53 +0200 | [diff] [blame] | 638 | #ifdef WITH_QCOM_VOIP_OVER_MVS |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 639 | AudioStreamOutDirect* mDirectOutput; |
Arne Coucheron | 0c85f77 | 2013-04-23 12:18:53 +0200 | [diff] [blame] | 640 | #endif |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 641 | int mCurSndDevice; |
| 642 | int m7xsnddriverfd; |
| 643 | bool mDualMicEnabled; |
| 644 | int mTtyMode; |
Arne Coucheron | 0c85f77 | 2013-04-23 12:18:53 +0200 | [diff] [blame] | 645 | #ifdef WITH_QCOM_VOIP_OVER_MVS |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 646 | SortedVector <AudioStreamInVoip*> mVoipInputs; |
Arne Coucheron | 0c85f77 | 2013-04-23 12:18:53 +0200 | [diff] [blame] | 647 | #endif |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 648 | |
| 649 | friend class AudioStreamInMSM72xx; |
| 650 | Mutex mLock; |
Arne Coucheron | 0c85f77 | 2013-04-23 12:18:53 +0200 | [diff] [blame] | 651 | #ifdef WITH_QCOM_VOIP_OVER_MVS |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 652 | int mVoipFd; |
Sunil Joseph | 672734e | 2012-10-26 17:19:49 +0530 | [diff] [blame] | 653 | bool mVoipInActive; |
| 654 | bool mVoipOutActive; |
| 655 | Mutex mVoipLock; |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 656 | int mVoipSession; |
Arne Coucheron | 0c85f77 | 2013-04-23 12:18:53 +0200 | [diff] [blame] | 657 | #endif |
Daniel Hillenbrand | d81f36f | 2013-04-06 18:56:57 +0000 | [diff] [blame] | 658 | }; |
| 659 | |
| 660 | // ---------------------------------------------------------------------------- |
| 661 | |
| 662 | }; // namespace android |
| 663 | |
| 664 | #endif // ANDROID_AUDIO_HARDWARE_MSM72XX_H |