blob: 4ef878b5515b19d9e343e0ab005e78769794fdc4 [file] [log] [blame]
Iliyan Malchev4765c432012-06-11 14:36:16 -07001/* AudioHardwareALSA.h
2 **
3 ** Copyright 2008-2010, Wind River Systems
4 ** Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
5 **
6 ** Licensed under the Apache License, Version 2.0 (the "License");
7 ** you may not use this file except in compliance with the License.
8 ** You may obtain a copy of the License at
9 **
10 ** http://www.apache.org/licenses/LICENSE-2.0
11 **
12 ** Unless required by applicable law or agreed to in writing, software
13 ** distributed under the License is distributed on an "AS IS" BASIS,
14 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 ** See the License for the specific language governing permissions and
16 ** limitations under the License.
17 */
18
19#ifndef ANDROID_AUDIO_HARDWARE_ALSA_H
20#define ANDROID_AUDIO_HARDWARE_ALSA_H
21
Ajay Dudani92919432012-06-28 14:23:11 -070022#define QCOM_CSDCLIENT_ENABLED 1
23
Iliyan Malchev4765c432012-06-11 14:36:16 -070024#include <utils/List.h>
25#include <hardware_legacy/AudioHardwareBase.h>
26
27#include <hardware_legacy/AudioHardwareInterface.h>
28#include <hardware_legacy/AudioSystemLegacy.h>
29#include <system/audio.h>
30#include <hardware/audio.h>
31#include <utils/threads.h>
SathishKumar Mani5ff7a022012-09-14 11:36:35 -070032#include <dlfcn.h>
33
Ajay Dudani9746c472012-06-18 16:01:16 -070034#ifdef QCOM_USBAUDIO_ENABLED
Iliyan Malchev4765c432012-06-11 14:36:16 -070035#include <AudioUsbALSA.h>
Ajay Dudani9746c472012-06-18 16:01:16 -070036#endif
Iliyan Malchev4765c432012-06-11 14:36:16 -070037
38extern "C" {
39 #include <sound/asound.h>
40 #include "alsa_audio.h"
41 #include "msm8960_use_cases.h"
42}
43
44#include <hardware/hardware.h>
45
46namespace android_audio_legacy
47{
48using android::List;
49using android::Mutex;
50class AudioHardwareALSA;
51
52/**
53 * The id of ALSA module
54 */
55#define ALSA_HARDWARE_MODULE_ID "alsa"
56#define ALSA_HARDWARE_NAME "alsa"
57
Glenn Kastena4e23672012-08-28 11:10:40 -070058#define DEFAULT_SAMPLING_RATE 48000
Iliyan Malchev4765c432012-06-11 14:36:16 -070059#define DEFAULT_CHANNEL_MODE 2
60#define VOICE_SAMPLING_RATE 8000
61#define VOICE_CHANNEL_MODE 1
SathishKumar Mani018d1c52012-09-11 14:58:18 -070062#define PLAYBACK_LATENCY 170000
Iliyan Malchev4765c432012-06-11 14:36:16 -070063#define RECORD_LATENCY 96000
64#define VOICE_LATENCY 85333
SathishKumar Mani018d1c52012-09-11 14:58:18 -070065#define DEFAULT_BUFFER_SIZE 4096
SathishKumar Manibf1c8742012-09-25 23:34:51 -070066//4032 = 336(kernel buffer size) * 2(bytes pcm_16) * 6(number of channels)
67#define DEFAULT_MULTI_CHANNEL_BUF_SIZE 4032
SathishKumar Mani018d1c52012-09-11 14:58:18 -070068#define DEFAULT_VOICE_BUFFER_SIZE 2048
SathishKumar Manie9c78542012-09-17 16:45:31 -070069#define PLAYBACK_LOW_LATENCY_BUFFER_SIZE 1024
SathishKumar Mani77780382012-09-21 20:58:33 -070070#define PLAYBACK_LOW_LATENCY 22000
71#define PLAYBACK_LOW_LATENCY_MEASURED 42000
SathishKumar Mani88613382012-08-13 18:40:18 -070072#define DEFAULT_IN_BUFFER_SIZE 320
SathishKumar Mani77780382012-09-21 20:58:33 -070073#define MIN_CAPTURE_BUFFER_SIZE_PER_CH 320
74#define MAX_CAPTURE_BUFFER_SIZE_PER_CH 2048
Iliyan Malchev4765c432012-06-11 14:36:16 -070075#define FM_BUFFER_SIZE 1024
76
77#define VOIP_SAMPLING_RATE_8K 8000
78#define VOIP_SAMPLING_RATE_16K 16000
79#define VOIP_DEFAULT_CHANNEL_MODE 1
80#define VOIP_BUFFER_SIZE_8K 320
81#define VOIP_BUFFER_SIZE_16K 640
82#define VOIP_BUFFER_MAX_SIZE VOIP_BUFFER_SIZE_16K
83#define VOIP_PLAYBACK_LATENCY 6400
84#define VOIP_RECORD_LATENCY 6400
85
86#define MODE_IS127 0x2
87#define MODE_4GV_NB 0x3
88#define MODE_4GV_WB 0x4
89#define MODE_AMR 0x5
90#define MODE_AMR_WB 0xD
91#define MODE_PCM 0xC
92
93#define DUALMIC_KEY "dualmic_enabled"
94#define FLUENCE_KEY "fluence"
95#define ANC_KEY "anc_enabled"
96#define TTY_MODE_KEY "tty_mode"
97#define BT_SAMPLERATE_KEY "bt_samplerate"
98#define BTHEADSET_VGS "bt_headset_vgs"
99#define WIDEVOICE_KEY "wide_voice_enable"
100#define VOIPRATE_KEY "voip_rate"
101#define FENS_KEY "fens_enable"
102#define ST_KEY "st_enable"
103#define INCALLMUSIC_KEY "incall_music_enabled"
104
105#define ANC_FLAG 0x00000001
106#define DMIC_FLAG 0x00000002
107#define QMIC_FLAG 0x00000004
Ajay Dudani9746c472012-06-18 16:01:16 -0700108#ifdef QCOM_SSR_ENABLED
Iliyan Malchev4765c432012-06-11 14:36:16 -0700109#define SSRQMIC_FLAG 0x00000008
110#endif
111
112#define TTY_OFF 0x00000010
113#define TTY_FULL 0x00000020
114#define TTY_VCO 0x00000040
115#define TTY_HCO 0x00000080
116#define TTY_CLEAR 0xFFFFFF0F
117
118#define LPA_SESSION_ID 1
119#define TUNNEL_SESSION_ID 2
Ajay Dudani9746c472012-06-18 16:01:16 -0700120#ifdef QCOM_USBAUDIO_ENABLED
Iliyan Malchev4765c432012-06-11 14:36:16 -0700121static int USBPLAYBACKBIT_MUSIC = (1 << 0);
122static int USBPLAYBACKBIT_VOICECALL = (1 << 1);
123static int USBPLAYBACKBIT_VOIPCALL = (1 << 2);
124static int USBPLAYBACKBIT_FM = (1 << 3);
125static int USBPLAYBACKBIT_LPA = (1 << 4);
126
127static int USBRECBIT_REC = (1 << 0);
128static int USBRECBIT_VOICECALL = (1 << 1);
129static int USBRECBIT_VOIPCALL = (1 << 2);
130static int USBRECBIT_FM = (1 << 3);
Ajay Dudani9746c472012-06-18 16:01:16 -0700131#endif
Iliyan Malchev4765c432012-06-11 14:36:16 -0700132
133#define DEVICE_SPEAKER_HEADSET "Speaker Headset"
134#define DEVICE_HEADSET "Headset"
135#define DEVICE_HEADPHONES "Headphones"
136
Ajay Dudani9746c472012-06-18 16:01:16 -0700137#ifdef QCOM_SSR_ENABLED
Iliyan Malchev4765c432012-06-11 14:36:16 -0700138#define COEFF_ARRAY_SIZE 4
139#define FILT_SIZE ((512+1)* 6) /* # ((FFT bins)/2+1)*numOutputs */
140#define SSR_FRAME_SIZE 512
141#define SSR_INPUT_FRAME_SIZE (SSR_FRAME_SIZE * 4)
142#define SSR_OUTPUT_FRAME_SIZE (SSR_FRAME_SIZE * 6)
143#endif
144
145#define MODE_CALL_KEY "CALL_KEY"
146
147struct alsa_device_t;
148static uint32_t FLUENCE_MODE_ENDFIRE = 0;
149static uint32_t FLUENCE_MODE_BROADSIDE = 1;
150
151enum {
152 INCALL_REC_MONO,
153 INCALL_REC_STEREO,
154};
155
Ajay Dudani9746c472012-06-18 16:01:16 -0700156enum audio_call_mode {
157 CS_INACTIVE = 0x0,
158 CS_ACTIVE = 0x1,
159 CS_HOLD = 0x2,
160 IMS_INACTIVE = 0x0,
161 IMS_ACTIVE = 0x10,
162 IMS_HOLD = 0x20
163};
164
165
Iliyan Malchev4765c432012-06-11 14:36:16 -0700166struct alsa_handle_t {
167 alsa_device_t * module;
168 uint32_t devices;
169 char useCase[MAX_STR_LEN];
170 struct pcm * handle;
171 snd_pcm_format_t format;
172 uint32_t channels;
Eric Laurent61f44982013-01-17 18:21:59 -0800173 audio_channel_mask_t channelMask;
Iliyan Malchev4765c432012-06-11 14:36:16 -0700174 uint32_t sampleRate;
175 unsigned int latency; // Delay in usec
176 unsigned int bufferSize; // Size of sample buffer
177 unsigned int periodSize;
SathishKumar Mani88613382012-08-13 18:40:18 -0700178 bool isDeepbufferOutput;
Iliyan Malchev4765c432012-06-11 14:36:16 -0700179 struct pcm * rxHandle;
180 snd_use_case_mgr_t *ucMgr;
181};
182
183typedef List < alsa_handle_t > ALSAHandleList;
184
185struct use_case_t {
186 char useCase[MAX_STR_LEN];
187};
188
189typedef List < use_case_t > ALSAUseCaseList;
190
191struct alsa_device_t {
192 hw_device_t common;
193
194 status_t (*init)(alsa_device_t *, ALSAHandleList &);
195 status_t (*open)(alsa_handle_t *);
196 status_t (*close)(alsa_handle_t *);
197 status_t (*standby)(alsa_handle_t *);
198 status_t (*route)(alsa_handle_t *, uint32_t, int);
199 status_t (*startVoiceCall)(alsa_handle_t *);
200 status_t (*startVoipCall)(alsa_handle_t *);
201 status_t (*startFm)(alsa_handle_t *);
202 void (*setVoiceVolume)(int);
203 void (*setVoipVolume)(int);
204 void (*setMicMute)(int);
205 void (*setVoipMicMute)(int);
206 void (*setVoipConfig)(int, int);
207 status_t (*setFmVolume)(int);
208 void (*setBtscoRate)(int);
209 status_t (*setLpaVolume)(int);
210 void (*enableWideVoice)(bool);
211 void (*enableFENS)(bool);
212 void (*setFlags)(uint32_t);
213 status_t (*setCompressedVolume)(int);
214 void (*enableSlowTalk)(bool);
215 void (*setVocRecMode)(uint8_t);
216 void (*setVoLTEMicMute)(int);
217 void (*setVoLTEVolume)(int);
ty.lee74060de2012-08-02 00:47:00 +0900218#ifdef SEPERATED_AUDIO_INPUT
219 void (*setInput)(int);
220#endif
SathishKumar Mani5ff7a022012-09-14 11:36:35 -0700221#ifdef QCOM_CSDCLIENT_ENABLED
222 void (*setCsdHandle)(void*);
223#endif
Iliyan Malchev4765c432012-06-11 14:36:16 -0700224};
225
226// ----------------------------------------------------------------------------
227
228class ALSAMixer
229{
230public:
231 ALSAMixer();
232 virtual ~ALSAMixer();
233
234 bool isValid() { return 1;}
235 status_t setMasterVolume(float volume);
236 status_t setMasterGain(float gain);
237
238 status_t setVolume(uint32_t device, float left, float right);
239 status_t setGain(uint32_t device, float gain);
240
241 status_t setCaptureMuteState(uint32_t device, bool state);
242 status_t getCaptureMuteState(uint32_t device, bool *state);
243 status_t setPlaybackMuteState(uint32_t device, bool state);
244 status_t getPlaybackMuteState(uint32_t device, bool *state);
245
246};
247
248class ALSAControl
249{
250public:
251 ALSAControl(const char *device = "/dev/snd/controlC0");
252 virtual ~ALSAControl();
253
254 status_t get(const char *name, unsigned int &value, int index = 0);
255 status_t set(const char *name, unsigned int value, int index = -1);
256 status_t set(const char *name, const char *);
257 status_t setext(const char *name, int count, char **setValues);
258
259private:
260 struct mixer* mHandle;
261};
262
263class ALSAStreamOps
264{
265public:
266 ALSAStreamOps(AudioHardwareALSA *parent, alsa_handle_t *handle);
267 virtual ~ALSAStreamOps();
268
269 status_t set(int *format, uint32_t *channels, uint32_t *rate, uint32_t device);
270
271 status_t setParameters(const String8& keyValuePairs);
272 String8 getParameters(const String8& keys);
273
274 uint32_t sampleRate() const;
275 size_t bufferSize() const;
276 int format() const;
277 uint32_t channels() const;
278
279 status_t open(int mode);
280 void close();
281
282protected:
283 friend class AudioHardwareALSA;
284
285 AudioHardwareALSA * mParent;
286 alsa_handle_t * mHandle;
287 uint32_t mDevices;
288};
289
290// ----------------------------------------------------------------------------
291
292class AudioStreamOutALSA : public AudioStreamOut, public ALSAStreamOps
293{
294public:
295 AudioStreamOutALSA(AudioHardwareALSA *parent, alsa_handle_t *handle);
296 virtual ~AudioStreamOutALSA();
297
298 virtual uint32_t sampleRate() const
299 {
300 return ALSAStreamOps::sampleRate();
301 }
302
303 virtual size_t bufferSize() const
304 {
305 return ALSAStreamOps::bufferSize();
306 }
307
308 virtual uint32_t channels() const;
309
310 virtual int format() const
311 {
312 return ALSAStreamOps::format();
313 }
314
315 virtual uint32_t latency() const;
316
317 virtual ssize_t write(const void *buffer, size_t bytes);
318 virtual status_t dump(int fd, const Vector<String16>& args);
319
320 status_t setVolume(float left, float right);
321
322 virtual status_t standby();
323
324 virtual status_t setParameters(const String8& keyValuePairs) {
325 return ALSAStreamOps::setParameters(keyValuePairs);
326 }
327
328 virtual String8 getParameters(const String8& keys) {
329 return ALSAStreamOps::getParameters(keys);
330 }
331
332 // return the number of audio frames written by the audio dsp to DAC since
333 // the output has exited standby
334 virtual status_t getRenderPosition(uint32_t *dspFrames);
335
336 status_t open(int mode);
337 status_t close();
338
339private:
340 uint32_t mFrameCount;
341
342protected:
343 AudioHardwareALSA * mParent;
344};
345
346class AudioStreamInALSA : public AudioStreamIn, public ALSAStreamOps
347{
348public:
349 AudioStreamInALSA(AudioHardwareALSA *parent,
350 alsa_handle_t *handle,
351 AudioSystem::audio_in_acoustics audio_acoustics);
352 virtual ~AudioStreamInALSA();
353
354 virtual uint32_t sampleRate() const
355 {
356 return ALSAStreamOps::sampleRate();
357 }
358
359 virtual size_t bufferSize() const
360 {
361 return ALSAStreamOps::bufferSize();
362 }
363
364 virtual uint32_t channels() const
365 {
366 return ALSAStreamOps::channels();
367 }
368
369 virtual int format() const
370 {
371 return ALSAStreamOps::format();
372 }
373
374 virtual ssize_t read(void* buffer, ssize_t bytes);
375 virtual status_t dump(int fd, const Vector<String16>& args);
376
377 virtual status_t setGain(float gain);
378
379 virtual status_t standby();
380
381 virtual status_t setParameters(const String8& keyValuePairs)
382 {
383 return ALSAStreamOps::setParameters(keyValuePairs);
384 }
385
386 virtual String8 getParameters(const String8& keys)
387 {
388 return ALSAStreamOps::getParameters(keys);
389 }
390
391 // Return the amount of input frames lost in the audio driver since the last call of this function.
392 // Audio driver is expected to reset the value to 0 and restart counting upon returning the current value by this function call.
393 // Such loss typically occurs when the user space process is blocked longer than the capacity of audio driver buffers.
394 // Unit: the number of input audio frames
395 virtual unsigned int getInputFramesLost() const;
396
397 virtual status_t addAudioEffect(effect_handle_t effect)
398 {
399 return BAD_VALUE;
400 }
401
402 virtual status_t removeAudioEffect(effect_handle_t effect)
403 {
404 return BAD_VALUE;
405 }
406 status_t setAcousticParams(void* params);
407
408 status_t open(int mode);
409 status_t close();
Ajay Dudani9746c472012-06-18 16:01:16 -0700410#ifdef QCOM_SSR_ENABLED
Iliyan Malchev4765c432012-06-11 14:36:16 -0700411 // Helper function to initialize the Surround Sound library.
412 status_t initSurroundSoundLibrary(unsigned long buffersize);
413#endif
414
415private:
416 void resetFramesLost();
417
SathishKumar Mani5ff7a022012-09-14 11:36:35 -0700418#ifdef QCOM_CSDCLIENT_ENABLED
419 int start_csd_record(int);
420 int stop_csd_record(void);
421#endif
422
Iliyan Malchev4765c432012-06-11 14:36:16 -0700423 unsigned int mFramesLost;
424 AudioSystem::audio_in_acoustics mAcoustics;
425
Ajay Dudani9746c472012-06-18 16:01:16 -0700426#ifdef QCOM_SSR_ENABLED
Iliyan Malchev4765c432012-06-11 14:36:16 -0700427 // Function to read coefficients from files.
428 status_t readCoeffsFromFile();
429
430 FILE *mFp_4ch;
431 FILE *mFp_6ch;
432 int16_t **mRealCoeffs;
433 int16_t **mImagCoeffs;
434 void *mSurroundObj;
435
436 int16_t *mSurroundInputBuffer;
437 int16_t *mSurroundOutputBuffer;
438 int mSurroundInputBufferIdx;
439 int mSurroundOutputBufferIdx;
440#endif
441
442protected:
443 AudioHardwareALSA * mParent;
444};
445
446class AudioHardwareALSA : public AudioHardwareBase
447{
448public:
449 AudioHardwareALSA();
450 virtual ~AudioHardwareALSA();
451
452 /**
453 * check to see if the audio hardware interface has been initialized.
454 * return status based on values defined in include/utils/Errors.h
455 */
456 virtual status_t initCheck();
457
458 /** set the audio volume of a voice call. Range is between 0.0 and 1.0 */
459 virtual status_t setVoiceVolume(float volume);
460
461 /**
462 * set the audio volume for all audio activities other than voice call.
463 * Range between 0.0 and 1.0. If any value other than NO_ERROR is returned,
464 * the software mixer will emulate this capability.
465 */
466 virtual status_t setMasterVolume(float volume);
Ajay Dudani9746c472012-06-18 16:01:16 -0700467#ifdef QCOM_FM_ENABLED
Iliyan Malchev4765c432012-06-11 14:36:16 -0700468 virtual status_t setFmVolume(float volume);
469#endif
470 /**
471 * setMode is called when the audio mode changes. NORMAL mode is for
472 * standard audio playback, RINGTONE when a ringtone is playing, and IN_CALL
473 * when a call is in progress.
474 */
475 virtual status_t setMode(int mode);
476
477 // mic mute
478 virtual status_t setMicMute(bool state);
479 virtual status_t getMicMute(bool* state);
480
481 // set/get global audio parameters
482 virtual status_t setParameters(const String8& keyValuePairs);
483 virtual String8 getParameters(const String8& keys);
484
485 // Returns audio input buffer size according to parameters passed or 0 if one of the
486 // parameters is not supported
487 virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channels);
488
Ajay Dudani9746c472012-06-18 16:01:16 -0700489#ifdef QCOM_TUNNEL_LPA_ENABLED
Iliyan Malchev4765c432012-06-11 14:36:16 -0700490 /** This method creates and opens the audio hardware output
491 * session for LPA */
492 virtual AudioStreamOut* openOutputSession(
493 uint32_t devices,
494 int *format,
495 status_t *status,
496 int sessionId,
497 uint32_t samplingRate=0,
498 uint32_t channels=0);
499 virtual void closeOutputSession(AudioStreamOut* out);
Ajay Dudani9746c472012-06-18 16:01:16 -0700500#endif
Iliyan Malchev4765c432012-06-11 14:36:16 -0700501
502 /** This method creates and opens the audio hardware output stream */
503 virtual AudioStreamOut* openOutputStream(
504 uint32_t devices,
505 int *format=0,
506 uint32_t *channels=0,
507 uint32_t *sampleRate=0,
508 status_t *status=0);
509 virtual void closeOutputStream(AudioStreamOut* out);
510
511 /** This method creates and opens the audio hardware input stream */
512 virtual AudioStreamIn* openInputStream(
513 uint32_t devices,
514 int *format,
515 uint32_t *channels,
516 uint32_t *sampleRate,
517 status_t *status,
518 AudioSystem::audio_in_acoustics acoustics);
519 virtual void closeInputStream(AudioStreamIn* in);
520
521 /**This method dumps the state of the audio hardware */
522 //virtual status_t dumpState(int fd, const Vector<String16>& args);
523
524 static AudioHardwareInterface* create();
525
526 int mode()
527 {
528 return mMode;
529 }
530
531protected:
532 virtual status_t dump(int fd, const Vector<String16>& args);
533 virtual uint32_t getVoipMode(int format);
534 void doRouting(int device);
Ajay Dudani9746c472012-06-18 16:01:16 -0700535#ifdef QCOM_FM_ENABLED
Iliyan Malchev4765c432012-06-11 14:36:16 -0700536 void handleFm(int device);
537#endif
Ajay Dudani9746c472012-06-18 16:01:16 -0700538#ifdef QCOM_USBAUDIO_ENABLED
Iliyan Malchev4765c432012-06-11 14:36:16 -0700539 void closeUSBPlayback();
540 void closeUSBRecording();
541 void closeUsbRecordingIfNothingActive();
542 void closeUsbPlaybackIfNothingActive();
543 void startUsbPlaybackIfNotStarted();
544 void startUsbRecordingIfNotStarted();
Ajay Dudani9746c472012-06-18 16:01:16 -0700545#endif
Iliyan Malchev4765c432012-06-11 14:36:16 -0700546
547 void disableVoiceCall(char* verb, char* modifier, int mode, int device);
548 void enableVoiceCall(char* verb, char* modifier, int mode, int device);
549 bool routeVoiceCall(int device, int newMode);
550 bool routeVoLTECall(int device, int newMode);
551 friend class AudioStreamOutALSA;
552 friend class AudioStreamInALSA;
553 friend class ALSAStreamOps;
554
555 alsa_device_t * mALSADevice;
556
557 ALSAHandleList mDeviceList;
558
Ajay Dudani9746c472012-06-18 16:01:16 -0700559#ifdef QCOM_USBAUDIO_ENABLED
Iliyan Malchev4765c432012-06-11 14:36:16 -0700560 AudioUsbALSA *mAudioUsbALSA;
Ajay Dudani9746c472012-06-18 16:01:16 -0700561#endif
Iliyan Malchev4765c432012-06-11 14:36:16 -0700562
563 Mutex mLock;
564
565 snd_use_case_mgr_t *mUcMgr;
566
567 uint32_t mCurDevice;
568 /* The flag holds all the audio related device settings from
569 * Settings and Qualcomm Settings applications */
570 uint32_t mDevSettingsFlag;
571 uint32_t mVoipStreamCount;
Iliyan Malchev4765c432012-06-11 14:36:16 -0700572 uint32_t mVoipBitRate;
573 uint32_t mIncallMode;
574
575 bool mMicMute;
576 int mCSCallActive;
577 int mVolteCallActive;
578 int mCallState;
579 int mIsFmActive;
580 bool mBluetoothVGS;
581 bool mFusion3Platform;
Ajay Dudani9746c472012-06-18 16:01:16 -0700582#ifdef QCOM_USBAUDIO_ENABLED
Iliyan Malchev4765c432012-06-11 14:36:16 -0700583 int musbPlaybackState;
584 int musbRecordingState;
Ajay Dudani9746c472012-06-18 16:01:16 -0700585#endif
SathishKumar Mani5ff7a022012-09-14 11:36:35 -0700586 void *mAcdbHandle;
587 void *mCsdHandle;
Iliyan Malchev4765c432012-06-11 14:36:16 -0700588};
589
590// ----------------------------------------------------------------------------
591
592}; // namespace android_audio_legacy
593#endif // ANDROID_AUDIO_HARDWARE_ALSA_H