blob: 58fd7d377cd4e75092d53fef078dffb6962da4b7 [file] [log] [blame]
Iliyan Malchev4765c432012-06-11 14:36:16 -07001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 * Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
Iliyan Malchev4113f342012-06-11 14:39:47 -070018#define LOG_TAG "audio.primary.msm8960"
Iliyan Malchev4765c432012-06-11 14:36:16 -070019//#define LOG_NDEBUG 0
20
21#include <stdint.h>
22
23#include <hardware/hardware.h>
24#include <system/audio.h>
25#include <hardware/audio.h>
26
27#include <hardware_legacy/AudioHardwareInterface.h>
28#include <hardware_legacy/AudioSystemLegacy.h>
29
30namespace android_audio_legacy {
31
32extern "C" {
33
34struct qcom_audio_module {
35 struct audio_module module;
36};
37
38struct qcom_audio_device {
39 struct audio_hw_device device;
40
41 struct AudioHardwareInterface *hwif;
42};
43
44struct qcom_stream_out {
45 struct audio_stream_out stream;
46
47 AudioStreamOut *qcom_out;
48};
49
50struct qcom_stream_in {
51 struct audio_stream_in stream;
52
53 AudioStreamIn *qcom_in;
54};
55
56/** audio_stream_out implementation **/
57static uint32_t out_get_sample_rate(const struct audio_stream *stream)
58{
59 const struct qcom_stream_out *out =
60 reinterpret_cast<const struct qcom_stream_out *>(stream);
61 return out->qcom_out->sampleRate();
62}
63
64static int out_set_sample_rate(struct audio_stream *stream, uint32_t rate)
65{
66 struct qcom_stream_out *out =
67 reinterpret_cast<struct qcom_stream_out *>(stream);
68
Iliyan Malchev4113f342012-06-11 14:39:47 -070069 ALOGE("(%s:%d) %s: Implement me!", __FILE__, __LINE__, __func__);
Iliyan Malchev4765c432012-06-11 14:36:16 -070070 /* TODO: implement this */
71 return 0;
72}
73
74static size_t out_get_buffer_size(const struct audio_stream *stream)
75{
76 const struct qcom_stream_out *out =
77 reinterpret_cast<const struct qcom_stream_out *>(stream);
78 return out->qcom_out->bufferSize();
79}
80
81static audio_channel_mask_t out_get_channels(const struct audio_stream *stream)
82{
83 const struct qcom_stream_out *out =
84 reinterpret_cast<const struct qcom_stream_out *>(stream);
85 return out->qcom_out->channels();
86}
87
88static audio_format_t out_get_format(const struct audio_stream *stream)
89{
90 const struct qcom_stream_out *out =
91 reinterpret_cast<const struct qcom_stream_out *>(stream);
Iliyan Malchev4113f342012-06-11 14:39:47 -070092 return (audio_format_t)out->qcom_out->format();
Iliyan Malchev4765c432012-06-11 14:36:16 -070093}
94
95static int out_set_format(struct audio_stream *stream, audio_format_t format)
96{
97 struct qcom_stream_out *out =
98 reinterpret_cast<struct qcom_stream_out *>(stream);
Iliyan Malchev4113f342012-06-11 14:39:47 -070099 ALOGE("(%s:%d) %s: Implement me!", __FILE__, __LINE__, __func__);
Iliyan Malchev4765c432012-06-11 14:36:16 -0700100 /* TODO: implement me */
101 return 0;
102}
103
104static int out_standby(struct audio_stream *stream)
105{
106 struct qcom_stream_out *out =
107 reinterpret_cast<struct qcom_stream_out *>(stream);
108 return out->qcom_out->standby();
109}
110
111static int out_dump(const struct audio_stream *stream, int fd)
112{
113 const struct qcom_stream_out *out =
114 reinterpret_cast<const struct qcom_stream_out *>(stream);
115 Vector<String16> args;
116 return out->qcom_out->dump(fd, args);
117}
118
119static int out_set_parameters(struct audio_stream *stream, const char *kvpairs)
120{
121 struct qcom_stream_out *out =
122 reinterpret_cast<struct qcom_stream_out *>(stream);
123 return out->qcom_out->setParameters(String8(kvpairs));
124}
125
126static char * out_get_parameters(const struct audio_stream *stream, const char *keys)
127{
128 const struct qcom_stream_out *out =
129 reinterpret_cast<const struct qcom_stream_out *>(stream);
130 String8 s8;
131 s8 = out->qcom_out->getParameters(String8(keys));
132 return strdup(s8.string());
133}
134
135static uint32_t out_get_latency(const struct audio_stream_out *stream)
136{
137 const struct qcom_stream_out *out =
138 reinterpret_cast<const struct qcom_stream_out *>(stream);
139 return out->qcom_out->latency();
140}
141
142static int out_set_volume(struct audio_stream_out *stream, float left,
143 float right)
144{
145 struct qcom_stream_out *out =
146 reinterpret_cast<struct qcom_stream_out *>(stream);
147 return out->qcom_out->setVolume(left, right);
148}
149
150static ssize_t out_write(struct audio_stream_out *stream, const void* buffer,
151 size_t bytes)
152{
153 struct qcom_stream_out *out =
154 reinterpret_cast<struct qcom_stream_out *>(stream);
155 return out->qcom_out->write(buffer, bytes);
156}
157
158static int out_get_render_position(const struct audio_stream_out *stream,
159 uint32_t *dsp_frames)
160{
161 const struct qcom_stream_out *out =
162 reinterpret_cast<const struct qcom_stream_out *>(stream);
163 return out->qcom_out->getRenderPosition(dsp_frames);
164}
165
166static int out_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
167{
168 return 0;
169}
170
171static int out_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
172{
173 return 0;
174}
175
176static int out_get_next_write_timestamp(const struct audio_stream_out *stream,
177 int64_t *timestamp)
178{
179 return -EINVAL;
180}
181
182/** audio_stream_in implementation **/
183static uint32_t in_get_sample_rate(const struct audio_stream *stream)
184{
185 const struct qcom_stream_in *in =
186 reinterpret_cast<const struct qcom_stream_in *>(stream);
187 return in->qcom_in->sampleRate();
188}
189
190static int in_set_sample_rate(struct audio_stream *stream, uint32_t rate)
191{
192 struct qcom_stream_in *in =
193 reinterpret_cast<struct qcom_stream_in *>(stream);
194
Iliyan Malchev4113f342012-06-11 14:39:47 -0700195 ALOGE("(%s:%d) %s: Implement me!", __FILE__, __LINE__, __func__);
Iliyan Malchev4765c432012-06-11 14:36:16 -0700196 /* TODO: implement this */
197 return 0;
198}
199
200static size_t in_get_buffer_size(const struct audio_stream *stream)
201{
202 const struct qcom_stream_in *in =
203 reinterpret_cast<const struct qcom_stream_in *>(stream);
204 return in->qcom_in->bufferSize();
205}
206
207static audio_channel_mask_t in_get_channels(const struct audio_stream *stream)
208{
209 const struct qcom_stream_in *in =
210 reinterpret_cast<const struct qcom_stream_in *>(stream);
211 return in->qcom_in->channels();
212}
213
214static audio_format_t in_get_format(const struct audio_stream *stream)
215{
216 const struct qcom_stream_in *in =
217 reinterpret_cast<const struct qcom_stream_in *>(stream);
Iliyan Malchev4113f342012-06-11 14:39:47 -0700218 return (audio_format_t)in->qcom_in->format();
Iliyan Malchev4765c432012-06-11 14:36:16 -0700219}
220
221static int in_set_format(struct audio_stream *stream, audio_format_t format)
222{
223 struct qcom_stream_in *in =
224 reinterpret_cast<struct qcom_stream_in *>(stream);
Iliyan Malchev4113f342012-06-11 14:39:47 -0700225 ALOGE("(%s:%d) %s: Implement me!", __FILE__, __LINE__, __func__);
Iliyan Malchev4765c432012-06-11 14:36:16 -0700226 /* TODO: implement me */
227 return 0;
228}
229
230static int in_standby(struct audio_stream *stream)
231{
232 struct qcom_stream_in *in = reinterpret_cast<struct qcom_stream_in *>(stream);
233 return in->qcom_in->standby();
234}
235
236static int in_dump(const struct audio_stream *stream, int fd)
237{
238 const struct qcom_stream_in *in =
239 reinterpret_cast<const struct qcom_stream_in *>(stream);
240 Vector<String16> args;
241 return in->qcom_in->dump(fd, args);
242}
243
244static int in_set_parameters(struct audio_stream *stream, const char *kvpairs)
245{
246 struct qcom_stream_in *in =
247 reinterpret_cast<struct qcom_stream_in *>(stream);
248 return in->qcom_in->setParameters(String8(kvpairs));
249}
250
251static char * in_get_parameters(const struct audio_stream *stream,
252 const char *keys)
253{
254 const struct qcom_stream_in *in =
255 reinterpret_cast<const struct qcom_stream_in *>(stream);
256 String8 s8;
257 s8 = in->qcom_in->getParameters(String8(keys));
258 return strdup(s8.string());
259}
260
261static int in_set_gain(struct audio_stream_in *stream, float gain)
262{
263 struct qcom_stream_in *in =
264 reinterpret_cast<struct qcom_stream_in *>(stream);
265 return in->qcom_in->setGain(gain);
266}
267
268static ssize_t in_read(struct audio_stream_in *stream, void* buffer,
269 size_t bytes)
270{
271 struct qcom_stream_in *in =
272 reinterpret_cast<struct qcom_stream_in *>(stream);
273 return in->qcom_in->read(buffer, bytes);
274}
275
276static uint32_t in_get_input_frames_lost(struct audio_stream_in *stream)
277{
278 struct qcom_stream_in *in =
279 reinterpret_cast<struct qcom_stream_in *>(stream);
280 return in->qcom_in->getInputFramesLost();
281}
282
283static int in_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
284{
285 const struct qcom_stream_in *in =
286 reinterpret_cast<const struct qcom_stream_in *>(stream);
287 return in->qcom_in->addAudioEffect(effect);
288}
289
290static int in_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
291{
292 const struct qcom_stream_in *in =
293 reinterpret_cast<const struct qcom_stream_in *>(stream);
294 return in->qcom_in->removeAudioEffect(effect);
295}
296
297/** audio_hw_device implementation **/
298static inline struct qcom_audio_device * to_ladev(struct audio_hw_device *dev)
299{
300 return reinterpret_cast<struct qcom_audio_device *>(dev);
301}
302
303static inline const struct qcom_audio_device * to_cladev(const struct audio_hw_device *dev)
304{
305 return reinterpret_cast<const struct qcom_audio_device *>(dev);
306}
307
308static uint32_t adev_get_supported_devices(const struct audio_hw_device *dev)
309{
310 /* XXX: The old AudioHardwareInterface interface is not smart enough to
311 * tell us this, so we'll lie and basically tell AF that we support the
312 * below input/output devices and cross our fingers. To do things properly,
313 * audio hardware interfaces that need advanced features (like this) should
314 * convert to the new HAL interface and not use this wrapper. */
315 return (/* OUT */
316 AUDIO_DEVICE_OUT_EARPIECE |
317 AUDIO_DEVICE_OUT_SPEAKER |
318 AUDIO_DEVICE_OUT_WIRED_HEADSET |
319 AUDIO_DEVICE_OUT_WIRED_HEADPHONE |
320 AUDIO_DEVICE_OUT_AUX_DIGITAL |
321 AUDIO_DEVICE_OUT_ALL_SCO |
Iliyan Malchev4113f342012-06-11 14:39:47 -0700322// AUDIO_DEVICE_OUT_ANC_HEADSET |
Iliyan Malchev4765c432012-06-11 14:36:16 -0700323 AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET |
324 AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET |
Iliyan Malchev4113f342012-06-11 14:39:47 -0700325// AUDIO_DEVICE_OUT_ANC_HEADPHONE |
326// AUDIO_DEVICE_OUT_FM |
327// AUDIO_DEVICE_OUT_FM_TX |
328// AUDIO_DEVICE_OUT_DIRECTOUTPUT |
329// AUDIO_DEVICE_OUT_PROXY |
Iliyan Malchev4765c432012-06-11 14:36:16 -0700330 AUDIO_DEVICE_OUT_DEFAULT |
331 /* IN */
332 AUDIO_DEVICE_IN_VOICE_CALL |
333 AUDIO_DEVICE_IN_COMMUNICATION |
334 AUDIO_DEVICE_IN_AMBIENT |
335 AUDIO_DEVICE_IN_BUILTIN_MIC |
336 AUDIO_DEVICE_IN_WIRED_HEADSET |
337 AUDIO_DEVICE_IN_AUX_DIGITAL |
338 AUDIO_DEVICE_IN_BACK_MIC |
339 AUDIO_DEVICE_IN_ALL_SCO |
Iliyan Malchev4113f342012-06-11 14:39:47 -0700340// AUDIO_DEVICE_IN_ANC_HEADSET |
341// AUDIO_DEVICE_IN_FM_RX |
342// AUDIO_DEVICE_IN_FM_RX_A2DP |
Iliyan Malchev4765c432012-06-11 14:36:16 -0700343 AUDIO_DEVICE_IN_DEFAULT);
344}
345
346static int adev_init_check(const struct audio_hw_device *dev)
347{
348 const struct qcom_audio_device *qadev = to_cladev(dev);
349
350 return qadev->hwif->initCheck();
351}
352
353static int adev_set_voice_volume(struct audio_hw_device *dev, float volume)
354{
355 struct qcom_audio_device *qadev = to_ladev(dev);
356 return qadev->hwif->setVoiceVolume(volume);
357}
358
359static int adev_set_master_volume(struct audio_hw_device *dev, float volume)
360{
361 struct qcom_audio_device *qadev = to_ladev(dev);
362 return qadev->hwif->setMasterVolume(volume);
363}
364
365static int adev_get_master_volume(struct audio_hw_device *dev, float *volume) {
366
Iliyan Malchev4113f342012-06-11 14:39:47 -0700367 struct qcom_audio_device *qadev = to_ladev(dev);
368 return qadev->hwif->getMasterVolume(volume);
Iliyan Malchev4765c432012-06-11 14:36:16 -0700369}
370#ifdef QUALCOMM_FEATURES_ENABLED
371static int adev_set_fm_volume(struct audio_hw_device *dev, float volume)
372{
373 struct qcom_audio_device *qadev = to_ladev(dev);
374 return qadev->hwif->setFmVolume(volume);
375}
376#endif
377
378static int adev_set_mode(struct audio_hw_device *dev, audio_mode_t mode)
379{
380 struct qcom_audio_device *qadev = to_ladev(dev);
381 return qadev->hwif->setMode(mode);
382}
383
384static int adev_set_mic_mute(struct audio_hw_device *dev, bool state)
385{
386 struct qcom_audio_device *qadev = to_ladev(dev);
387 return qadev->hwif->setMicMute(state);
388}
389
390static int adev_get_mic_mute(const struct audio_hw_device *dev, bool *state)
391{
392 const struct qcom_audio_device *qadev = to_cladev(dev);
393 return qadev->hwif->getMicMute(state);
394}
395
396static int adev_set_parameters(struct audio_hw_device *dev, const char *kvpairs)
397{
398 struct qcom_audio_device *qadev = to_ladev(dev);
399 return qadev->hwif->setParameters(String8(kvpairs));
400}
401
402static char * adev_get_parameters(const struct audio_hw_device *dev,
403 const char *keys)
404{
405 const struct qcom_audio_device *qadev = to_cladev(dev);
406 String8 s8;
407
408 s8 = qadev->hwif->getParameters(String8(keys));
409 return strdup(s8.string());
410}
411
412static size_t adev_get_input_buffer_size(const struct audio_hw_device *dev,
413 const struct audio_config *config)
414{
415 const struct qcom_audio_device *qadev = to_cladev(dev);
Iliyan Malchev4113f342012-06-11 14:39:47 -0700416 return qadev->hwif->getInputBufferSize(config->sample_rate, config->format, config->channel_mask);
Iliyan Malchev4765c432012-06-11 14:36:16 -0700417}
418
419#ifdef QUALCOMM_FEATURES_ENABLED
420static int adev_open_output_session(struct audio_hw_device *dev,
421 uint32_t devices,
422 int *format,
423 int sessionId,
424 uint32_t samplingRate,
425 uint32_t channels,
426 struct audio_stream_out **stream_out)
427{
428 struct qcom_audio_device *qadev = to_ladev(dev);
429 status_t status;
430 struct qcom_stream_out *out;
431 int ret;
432
433 out = (struct qcom_stream_out *)calloc(1, sizeof(*out));
434 if (!out)
435 return -ENOMEM;
436
437 out->qcom_out = qadev->hwif->openOutputSession(devices, format,&status,sessionId,samplingRate,channels);
438 if (!out->qcom_out) {
439 ret = status;
440 goto err_open;
441 }
442
443 out->stream.common.standby = out_standby;
444 out->stream.common.set_parameters = out_set_parameters;
445 out->stream.set_volume = out_set_volume;
446
447 *stream_out = &out->stream;
448 return 0;
449
450err_open:
451 free(out);
452 *stream_out = NULL;
453 return ret;
454}
455#endif
456
457static int adev_open_output_stream(struct audio_hw_device *dev,
458 audio_io_handle_t handle,
459 audio_devices_t devices,
460 audio_output_flags_t flags,
461 struct audio_config *config,
462 struct audio_stream_out **stream_out)
463{
464 struct qcom_audio_device *qadev = to_ladev(dev);
465 status_t status;
466 struct qcom_stream_out *out;
467 int ret;
468
469 out = (struct qcom_stream_out *)calloc(1, sizeof(*out));
470 if (!out)
471 return -ENOMEM;
472
Iliyan Malchev4113f342012-06-11 14:39:47 -0700473 out->qcom_out = qadev->hwif->openOutputStream(devices,
474 (int *)&config->format,
475 &config->channel_mask,
476 &config->sample_rate,
477 &status);
Iliyan Malchev4765c432012-06-11 14:36:16 -0700478 if (!out->qcom_out) {
479 ret = status;
480 goto err_open;
481 }
482
483 out->stream.common.get_sample_rate = out_get_sample_rate;
484 out->stream.common.set_sample_rate = out_set_sample_rate;
485 out->stream.common.get_buffer_size = out_get_buffer_size;
486 out->stream.common.get_channels = out_get_channels;
487 out->stream.common.get_format = out_get_format;
488 out->stream.common.set_format = out_set_format;
489 out->stream.common.standby = out_standby;
490 out->stream.common.dump = out_dump;
491 out->stream.common.set_parameters = out_set_parameters;
492 out->stream.common.get_parameters = out_get_parameters;
493 out->stream.common.add_audio_effect = out_add_audio_effect;
494 out->stream.common.remove_audio_effect = out_remove_audio_effect;
495 out->stream.get_latency = out_get_latency;
496 out->stream.set_volume = out_set_volume;
497 out->stream.write = out_write;
498 out->stream.get_render_position = out_get_render_position;
499 out->stream.get_next_write_timestamp = out_get_next_write_timestamp;
500
501 *stream_out = &out->stream;
502 return 0;
503
504err_open:
505 free(out);
506 *stream_out = NULL;
507 return ret;
508}
509
510static void adev_close_output_stream(struct audio_hw_device *dev,
511 struct audio_stream_out* stream)
512{
513 struct qcom_audio_device *qadev = to_ladev(dev);
514 struct qcom_stream_out *out = reinterpret_cast<struct qcom_stream_out *>(stream);
515
516 qadev->hwif->closeOutputStream(out->qcom_out);
517 free(out);
518}
519
520/** This method creates and opens the audio hardware input stream */
521static int adev_open_input_stream(struct audio_hw_device *dev,
522 audio_io_handle_t handle,
523 audio_devices_t devices,
524 audio_config *config,
525 audio_stream_in **stream_in)
526{
527 struct qcom_audio_device *qadev = to_ladev(dev);
528 status_t status;
529 struct qcom_stream_in *in;
530 int ret;
531
532 in = (struct qcom_stream_in *)calloc(1, sizeof(*in));
533 if (!in)
534 return -ENOMEM;
535
Iliyan Malchev4113f342012-06-11 14:39:47 -0700536 in->qcom_in = qadev->hwif->openInputStream(devices, (int *)&config->format,
537 &config->channel_mask,
538 &config->sample_rate,
539 &status,
540 (AudioSystem::audio_in_acoustics)0);
Iliyan Malchev4765c432012-06-11 14:36:16 -0700541 if (!in->qcom_in) {
542 ret = status;
543 goto err_open;
544 }
545
546 in->stream.common.get_sample_rate = in_get_sample_rate;
547 in->stream.common.set_sample_rate = in_set_sample_rate;
548 in->stream.common.get_buffer_size = in_get_buffer_size;
549 in->stream.common.get_channels = in_get_channels;
550 in->stream.common.get_format = in_get_format;
551 in->stream.common.set_format = in_set_format;
552 in->stream.common.standby = in_standby;
553 in->stream.common.dump = in_dump;
554 in->stream.common.set_parameters = in_set_parameters;
555 in->stream.common.get_parameters = in_get_parameters;
556 in->stream.common.add_audio_effect = in_add_audio_effect;
557 in->stream.common.remove_audio_effect = in_remove_audio_effect;
558 in->stream.set_gain = in_set_gain;
559 in->stream.read = in_read;
560 in->stream.get_input_frames_lost = in_get_input_frames_lost;
561
562 *stream_in = &in->stream;
563 return 0;
564
565err_open:
566 free(in);
567 *stream_in = NULL;
568 return ret;
569}
570
571static void adev_close_input_stream(struct audio_hw_device *dev,
572 struct audio_stream_in *stream)
573{
574 struct qcom_audio_device *qadev = to_ladev(dev);
575 struct qcom_stream_in *in =
576 reinterpret_cast<struct qcom_stream_in *>(stream);
577
578 qadev->hwif->closeInputStream(in->qcom_in);
579 free(in);
580}
581
582static int adev_dump(const struct audio_hw_device *dev, int fd)
583{
584 const struct qcom_audio_device *qadev = to_cladev(dev);
585 Vector<String16> args;
586
587 return qadev->hwif->dumpState(fd, args);
588}
589
590static int qcom_adev_close(hw_device_t* device)
591{
592 struct audio_hw_device *hwdev =
593 reinterpret_cast<struct audio_hw_device *>(device);
594 struct qcom_audio_device *qadev = to_ladev(hwdev);
595
596 if (!qadev)
597 return 0;
598
599 if (qadev->hwif)
600 delete qadev->hwif;
601
602 free(qadev);
603 return 0;
604}
605
606static int qcom_adev_open(const hw_module_t* module, const char* name,
607 hw_device_t** device)
608{
609 struct qcom_audio_device *qadev;
610 int ret;
611
612 if (strcmp(name, AUDIO_HARDWARE_INTERFACE) != 0)
613 return -EINVAL;
614
615 qadev = (struct qcom_audio_device *)calloc(1, sizeof(*qadev));
616 if (!qadev)
617 return -ENOMEM;
618
619 qadev->device.common.tag = HARDWARE_DEVICE_TAG;
620 qadev->device.common.version = AUDIO_DEVICE_API_VERSION_1_0;
621 qadev->device.common.module = const_cast<hw_module_t*>(module);
622 qadev->device.common.close = qcom_adev_close;
623
624 qadev->device.get_supported_devices = adev_get_supported_devices;
625 qadev->device.init_check = adev_init_check;
626 qadev->device.set_voice_volume = adev_set_voice_volume;
627 qadev->device.set_master_volume = adev_set_master_volume;
628 qadev->device.get_master_volume = adev_get_master_volume;
629#ifdef QUALCOMM_FEATURES_ENABLED
630 qadev->device.set_fm_volume = adev_set_fm_volume;
631#endif
632 qadev->device.set_mode = adev_set_mode;
633 qadev->device.set_mic_mute = adev_set_mic_mute;
634 qadev->device.get_mic_mute = adev_get_mic_mute;
635 qadev->device.set_parameters = adev_set_parameters;
636 qadev->device.get_parameters = adev_get_parameters;
637 qadev->device.get_input_buffer_size = adev_get_input_buffer_size;
638 qadev->device.open_output_stream = adev_open_output_stream;
639#ifdef QUALCOMM_FEATURES_ENABLED
640 qadev->device.open_output_session = adev_open_output_session;
641#endif
642 qadev->device.close_output_stream = adev_close_output_stream;
643 qadev->device.open_input_stream = adev_open_input_stream;
644 qadev->device.close_input_stream = adev_close_input_stream;
645 qadev->device.dump = adev_dump;
646
647 qadev->hwif = createAudioHardware();
648 if (!qadev->hwif) {
649 ret = -EIO;
650 goto err_create_audio_hw;
651 }
652
653 *device = &qadev->device.common;
654
655 return 0;
656
657err_create_audio_hw:
658 free(qadev);
659 return ret;
660}
661
662static struct hw_module_methods_t qcom_audio_module_methods = {
663 open: qcom_adev_open
664};
665
666struct qcom_audio_module HAL_MODULE_INFO_SYM = {
667 module: {
668 common: {
669 tag: HARDWARE_MODULE_TAG,
670 version_major: 1,
671 version_minor: 0,
672 id: AUDIO_HARDWARE_MODULE_ID,
673 name: "QCOM Audio HW HAL",
674 author: "Code Aurora Forum",
675 methods: &qcom_audio_module_methods,
676 dso : NULL,
677 reserved : {0},
678 },
679 },
680};
681
682}; // extern "C"
683
684}; // namespace android_audio_legacy