blob: 9a5b7f571675251e742080288cc5418a9acdeb73 [file] [log] [blame]
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +00001/*
2** Copyright 2008, The Android Open-Source Project
3** Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
Giulio Cervera548b3192013-04-20 07:44:26 +02004** Copyright (c) 2011-2013, The CyanogenMod Project
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +00005** 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 Hillenbrandd81f36f2013-04-06 18:56:57 +000026
27#include <utils/threads.h>
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +000028#include <utils/SortedVector.h>
29
30#include <hardware_legacy/AudioHardwareBase.h>
31
32extern "C" {
33#include <linux/msm_audio.h>
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +000034#include <linux/msm_audio_aac.h>
Arne Coucheron0c85f772013-04-23 12:18:53 +020035#ifdef WITH_QCOM_SPEECH
36#include <linux/msm_audio_qcp.h>
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +000037#include <linux/msm_audio_amrnb.h>
Arne Coucheron0c85f772013-04-23 12:18:53 +020038#endif
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +000039}
40
41namespace android_audio_legacy {
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +000042using android::SortedVector;
43using android::Mutex;
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +000044
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 Hillenbrandd81f36f2013-04-06 18:56:57 +000067
Michael Bestas14030ec2013-05-14 20:00:20 +030068#ifdef HTC_AUDIO
Giulio Cervera548b3192013-04-20 07:44:26 +020069#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 Bestas14030ec2013-05-14 20:00:20 +030086#endif
Giulio Cervera548b3192013-04-20 07:44:26 +020087
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +000088struct eq_filter_type {
89 int16_t gain;
90 uint16_t freq;
91 uint16_t type;
92 uint16_t qf;
93};
94
95struct eqalizer {
96 uint16_t bands;
97 uint16_t params[132];
98};
99
100struct rx_iir_filter {
101 uint16_t num_bands;
102 uint16_t iir_params[48];
103};
104
105struct msm_audio_stats {
Arne Coucheron0de404b2013-04-23 11:42:42 +0200106 uint32_t out_bytes;
107 uint32_t unused[3];
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000108};
109
Arne Coucheron0c85f772013-04-23 12:18:53 +0200110#ifdef WITH_QCOM_SPEECH
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000111/* AMR frame type definitions */
112typedef 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 */
126typedef 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*/
140typedef 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 */
165typedef 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
184typedef 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 */
191typedef 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
209typedef 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 Coucheron0c85f772013-04-23 12:18:53 +0200217#endif
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000218
Michael Bestas14030ec2013-05-14 20:00:20 +0300219#ifdef HTC_AUDIO
Giulio Cervera548b3192013-04-20 07:44:26 +0200220struct msm_bt_endpoint {
221 int tx;
222 int rx;
223 char name[64];
224};
Michael Bestas14030ec2013-05-14 20:00:20 +0300225#endif
Giulio Cervera548b3192013-04-20 07:44:26 +0200226
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000227enum 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 Coucheron0c85f772013-04-23 12:18:53 +0200247
248#ifdef WITH_QCOM_SPEECH
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000249/* ======================== 12.2 kbps mode ========================== */
250const 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
262const 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
277const 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
288const 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 Coucheron0c85f772013-04-23 12:18:53 +0200296#endif
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000297
298// ----------------------------------------------------------------------------
299
300using android_audio_legacy::AudioHardwareBase;
301using android_audio_legacy::AudioStreamOut;
302using android_audio_legacy::AudioStreamIn;
303using android_audio_legacy::AudioSystem;
304using android_audio_legacy::AudioHardwareInterface;
305
306class AudioHardware : public AudioHardwareBase
307{
308 class AudioStreamOutMSM72xx;
Arne Coucheron0de404b2013-04-23 11:42:42 +0200309#ifdef QCOM_TUNNEL_LPA_ENABLED
310 class AudioSessionOutMSM7xxx;
311#endif /* QCOM_TUNNEL_LPA_ENABLED */
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000312 class AudioStreamInMSM72xx;
Arne Coucheron0c85f772013-04-23 12:18:53 +0200313#ifdef WITH_QCOM_VOIP_OVER_MVS
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000314 class AudioStreamOutDirect;
315 class AudioStreamInVoip;
Arne Coucheron0c85f772013-04-23 12:18:53 +0200316#endif
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000317
318public:
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 Coucheron0de404b2013-04-23 11:42:42 +0200345#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 Hillenbrandd81f36f2013-04-06 18:56:57 +0000355 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
370protected:
371 virtual status_t dump(int fd, const Vector<String16>& args);
Sunil Joseph672734e2012-10-26 17:19:49 +0530372 status_t setupDeviceforVoipCall(bool value);
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000373
374private:
375
Michael Bestas14030ec2013-05-14 20:00:20 +0300376#ifdef HTC_AUDIO
Giulio Cerveraf0ec98d2013-04-21 05:01:48 +0200377 status_t doAudioRouteOrMuteHTC(uint32_t device);
Michael Bestas14030ec2013-05-14 20:00:20 +0300378#endif
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000379 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 Coucheron0de404b2013-04-23 11:42:42 +0200385 status_t doRouting(AudioStreamInMSM72xx *input);
Arne Coucheron0c85f772013-04-23 12:18:53 +0200386#ifdef QCOM_FM_ENABLED
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000387 status_t enableFM(int sndDevice);
Arne Coucheron0c85f772013-04-23 12:18:53 +0200388#endif
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000389 status_t enableComboDevice(uint32_t sndDevice, bool enableOrDisable);
Arne Coucheron0c85f772013-04-23 12:18:53 +0200390#ifdef QCOM_FM_ENABLED
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000391 status_t disableFM();
Arne Coucheron0c85f772013-04-23 12:18:53 +0200392#endif
Michael Bestas14030ec2013-05-14 20:00:20 +0300393#ifdef HTC_AUDIO
Giulio Cervera548b3192013-04-20 07:44:26 +0200394 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 Bestas14030ec2013-05-14 20:00:20 +0300405#endif
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000406 AudioStreamInMSM72xx* getActiveInput_l();
Arne Coucheron0c85f772013-04-23 12:18:53 +0200407#ifdef WITH_QCOM_VOIP_OVER_MVS
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000408 AudioStreamInVoip* getActiveVoipInput_l();
Arne Coucheron0c85f772013-04-23 12:18:53 +0200409#endif
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000410 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 Coucheron0c85f772013-04-23 12:18:53 +0200445#ifdef WITH_QCOM_VOIP_OVER_MVS
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000446 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 Coucheron0c85f772013-04-23 12:18:53 +0200485#endif
Arne Coucheron0de404b2013-04-23 11:42:42 +0200486#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 Hillenbrandd81f36f2013-04-06 18:56:57 +0000503 virtual status_t standby();
Arne Coucheron0de404b2013-04-23 11:42:42 +0200504 virtual status_t dump(int fd, const Vector<String16>& args) {return 0;};
505 bool checkStandby();
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000506 virtual status_t setParameters(const String8& keyValuePairs);
507 virtual String8 getParameters(const String8& keys);
Arne Coucheron0de404b2013-04-23 11:42:42 +0200508 uint32_t devices() { return mDevices; }
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000509 virtual status_t getRenderPosition(uint32_t *dspFrames);
510
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000511 private:
Arne Coucheron0de404b2013-04-23 11:42:42 +0200512 AudioHardware* mHardware;
513 int mStartCount;
514 int mRetryCount;
515 bool mStandby;
516 uint32_t mDevices;
517 int mSessionId;
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000518 };
Arne Coucheron0de404b2013-04-23 11:42:42 +0200519#endif /* QCOM_TUNNEL_LPA_ENABLED */
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000520
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 Coucheron0c85f772013-04-23 12:18:53 +0200568#ifdef WITH_QCOM_VOIP_OVER_MVS
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000569 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 Coucheron0c85f772013-04-23 12:18:53 +0200614#endif
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000615 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 Bestas14030ec2013-05-14 20:00:20 +0300622 float mVoiceVolume;
623#ifdef HTC_AUDIO
Giulio Cervera548b3192013-04-20 07:44:26 +0200624 bool mHACSetting;
625 uint32_t mBluetoothIdTx;
626 uint32_t mBluetoothIdRx;
627 msm_bt_endpoint *mBTEndpoints;
628 int mNumBTEndpoints;
Giulio Cervera548b3192013-04-20 07:44:26 +0200629 int mNoiseSuppressionState;
630 bool mRecordState;
631 char mCurDspProfile[22];
632 bool mEffectEnabled;
633 char mActiveAP[10];
634 char mEffect[10];
Michael Bestas14030ec2013-05-14 20:00:20 +0300635#endif
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000636 AudioStreamOutMSM72xx* mOutput;
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000637 SortedVector <AudioStreamInMSM72xx*> mInputs;
Arne Coucheron0c85f772013-04-23 12:18:53 +0200638#ifdef WITH_QCOM_VOIP_OVER_MVS
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000639 AudioStreamOutDirect* mDirectOutput;
Arne Coucheron0c85f772013-04-23 12:18:53 +0200640#endif
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000641 int mCurSndDevice;
642 int m7xsnddriverfd;
643 bool mDualMicEnabled;
644 int mTtyMode;
Arne Coucheron0c85f772013-04-23 12:18:53 +0200645#ifdef WITH_QCOM_VOIP_OVER_MVS
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000646 SortedVector <AudioStreamInVoip*> mVoipInputs;
Arne Coucheron0c85f772013-04-23 12:18:53 +0200647#endif
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000648
649 friend class AudioStreamInMSM72xx;
650 Mutex mLock;
Arne Coucheron0c85f772013-04-23 12:18:53 +0200651#ifdef WITH_QCOM_VOIP_OVER_MVS
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000652 int mVoipFd;
Sunil Joseph672734e2012-10-26 17:19:49 +0530653 bool mVoipInActive;
654 bool mVoipOutActive;
655 Mutex mVoipLock;
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000656 int mVoipSession;
Arne Coucheron0c85f772013-04-23 12:18:53 +0200657#endif
Daniel Hillenbrandd81f36f2013-04-06 18:56:57 +0000658};
659
660// ----------------------------------------------------------------------------
661
662}; // namespace android
663
664#endif // ANDROID_AUDIO_HARDWARE_MSM72XX_H