• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2014 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #define LOG_TAG "AudioHAL:audio_hal_thunks"
18 #include <utils/Log.h>
19 
20 #include <errno.h>
21 #include <stdlib.h>
22 
23 #include <hardware/hardware.h>
24 #include <hardware/audio.h>
25 
26 #include "AudioHardwareInput.h"
27 #include "AudioHardwareOutput.h"
28 #include "AudioStreamIn.h"
29 #include "AudioStreamOut.h"
30 
31 namespace android {
32 
33 extern AudioHardwareInput gAudioHardwareInput;
34 extern AudioHardwareOutput gAudioHardwareOutput;
35 
36 struct atv_audio_device {
37     struct audio_hw_device device;
38     AudioHardwareOutput* output;
39     AudioHardwareInput* input;
40 };
41 
42 struct atv_stream_out {
43     struct audio_stream_out stream;
44     AudioHardwareOutput* hw;
45     AudioStreamOut* impl;
46 };
47 
48 struct atv_stream_in {
49     struct audio_stream_in stream;
50     AudioStreamIn* impl;
51 };
52 
53 /*******************************************************************************
54  *
55  * Audio output stream stubs.
56  *
57  ******************************************************************************/
58 
out_set_volume(struct audio_stream_out * stream,float left,float right)59 static int out_set_volume(struct audio_stream_out *stream,
60                           float left,
61                           float right)
62 {
63     (void) stream;
64     (void) left;
65     (void) right;
66     return 0;
67 }
68 
out_add_audio_effect(const struct audio_stream * stream,effect_handle_t effect)69 static int out_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
70 {
71     (void) stream;
72     (void) effect;
73     return 0;
74 }
75 
out_remove_audio_effect(const struct audio_stream * stream,effect_handle_t effect)76 static int out_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
77 {
78     (void) stream;
79     (void) effect;
80     return 0;
81 }
82 
83 /*******************************************************************************
84  *
85  * Audio output stream implementation
86  *
87  ******************************************************************************/
88 
out_get_sample_rate(const struct audio_stream * stream)89 static uint32_t out_get_sample_rate(const struct audio_stream *stream)
90 {
91     const struct atv_stream_out* tstream =
92         reinterpret_cast<const struct atv_stream_out*>(stream);
93 
94     return tstream->impl->sampleRate();
95 }
96 
out_set_sample_rate(struct audio_stream * stream,uint32_t rate)97 static int out_set_sample_rate(struct audio_stream *stream, uint32_t rate)
98 {
99     const struct atv_stream_out* tstream =
100         reinterpret_cast<const struct atv_stream_out*>(stream);
101 
102     if (rate != tstream->impl->sampleRate())
103         return -EINVAL;
104 
105     return 0;
106 }
107 
out_get_buffer_size(const struct audio_stream * stream)108 static size_t out_get_buffer_size(const struct audio_stream *stream)
109 {
110     const struct atv_stream_out* tstream =
111         reinterpret_cast<const struct atv_stream_out*>(stream);
112 
113     return tstream->impl->bufferSize();
114 }
115 
out_get_channels(const struct audio_stream * stream)116 static audio_channel_mask_t out_get_channels(const struct audio_stream *stream)
117 {
118     const struct atv_stream_out* tstream =
119         reinterpret_cast<const struct atv_stream_out*>(stream);
120 
121     return tstream->impl->chanMask();
122 }
123 
out_get_format(const struct audio_stream * stream)124 static audio_format_t out_get_format(const struct audio_stream *stream)
125 {
126     const struct atv_stream_out* tstream =
127         reinterpret_cast<const struct atv_stream_out*>(stream);
128 
129     return tstream->impl->format();
130 }
131 
out_set_format(struct audio_stream * stream,audio_format_t format)132 static int out_set_format(struct audio_stream *stream, audio_format_t format)
133 {
134     const struct atv_stream_out* tstream =
135         reinterpret_cast<const struct atv_stream_out*>(stream);
136 
137     if (format != tstream->impl->format())
138         return -EINVAL;
139 
140     return 0;
141 }
142 
out_get_latency(const struct audio_stream_out * stream)143 static uint32_t out_get_latency(const struct audio_stream_out *stream)
144 {
145     const struct atv_stream_out* tstream =
146         reinterpret_cast<const struct atv_stream_out*>(stream);
147 
148     return tstream->impl->latency();
149 }
150 
out_standby(struct audio_stream * stream)151 static int out_standby(struct audio_stream *stream)
152 {
153     struct atv_stream_out* tstream =
154         reinterpret_cast<struct atv_stream_out*>(stream);
155 
156     return tstream->impl->standby();
157 }
158 
out_dump(const struct audio_stream * stream,int fd)159 static int out_dump(const struct audio_stream *stream, int fd)
160 {
161     const struct atv_stream_out* tstream =
162         reinterpret_cast<const struct atv_stream_out*>(stream);
163 
164     return tstream->impl->dump(fd);
165 }
166 
out_set_parameters(struct audio_stream * stream,const char * kvpairs)167 static int out_set_parameters(struct audio_stream *stream, const char *kvpairs)
168 {
169     struct atv_stream_out* tstream =
170         reinterpret_cast<struct atv_stream_out*>(stream);
171 
172     return tstream->impl->setParameters(stream, kvpairs);
173 }
174 
out_get_parameters(const struct audio_stream * stream,const char * keys)175 static char* out_get_parameters(const struct audio_stream *stream, const char *keys)
176 {
177     const struct atv_stream_out* tstream =
178         reinterpret_cast<const struct atv_stream_out*>(stream);
179 
180     return tstream->impl->getParameters(keys);
181 }
182 
out_write(struct audio_stream_out * stream,const void * buffer,size_t bytes)183 static ssize_t out_write(struct audio_stream_out *stream, const void* buffer,
184                          size_t bytes)
185 {
186     struct atv_stream_out* tstream =
187         reinterpret_cast<struct atv_stream_out*>(stream);
188 
189     return tstream->impl->write(buffer, bytes);
190 }
191 
out_get_render_position(const struct audio_stream_out * stream,uint32_t * dsp_frames)192 static int out_get_render_position(const struct audio_stream_out *stream,
193                                    uint32_t *dsp_frames)
194 {
195     const struct atv_stream_out* tstream =
196         reinterpret_cast<const struct atv_stream_out*>(stream);
197 
198     return tstream->impl->getRenderPosition(dsp_frames);
199 }
200 
out_get_presentation_position(const struct audio_stream_out * stream,uint64_t * frames,struct timespec * timestamp)201 static int out_get_presentation_position(const struct audio_stream_out *stream,
202                                uint64_t *frames, struct timespec *timestamp)
203 {
204     const struct atv_stream_out* tstream =
205         reinterpret_cast<const struct atv_stream_out*>(stream);
206 
207     return tstream->impl->getPresentationPosition(frames, timestamp);
208 }
209 
out_get_next_write_timestamp(const struct audio_stream_out * stream,int64_t * timestamp)210 static int out_get_next_write_timestamp(const struct audio_stream_out *stream,
211                                         int64_t *timestamp)
212 {
213     const struct atv_stream_out* tstream =
214         reinterpret_cast<const struct atv_stream_out*>(stream);
215 
216     return tstream->impl->getNextWriteTimestamp(timestamp);
217 }
218 
219 /*******************************************************************************
220  *
221  * Audio input stream implementation
222  *
223  ******************************************************************************/
224 
in_get_sample_rate(const struct audio_stream * stream)225 static uint32_t in_get_sample_rate(const struct audio_stream *stream)
226 {
227     const struct atv_stream_in* tstream =
228         reinterpret_cast<const struct atv_stream_in*>(stream);
229 
230     return tstream->impl->getSampleRate();
231 }
232 
in_set_sample_rate(struct audio_stream * stream,uint32_t rate)233 static int in_set_sample_rate(struct audio_stream *stream, uint32_t rate)
234 {
235     const struct atv_stream_in* tstream =
236         reinterpret_cast<const struct atv_stream_in*>(stream);
237 
238     return tstream->impl->setSampleRate(rate);
239 }
240 
in_get_buffer_size(const struct audio_stream * stream)241 static size_t in_get_buffer_size(const struct audio_stream *stream)
242 {
243     const struct atv_stream_in* tstream =
244         reinterpret_cast<const struct atv_stream_in*>(stream);
245 
246     return tstream->impl->getBufferSize();
247 }
248 
in_get_channels(const struct audio_stream * stream)249 static uint32_t in_get_channels(const struct audio_stream *stream)
250 {
251     const struct atv_stream_in* tstream =
252         reinterpret_cast<const struct atv_stream_in*>(stream);
253 
254     return tstream->impl->getChannelMask();
255 }
256 
in_get_format(const struct audio_stream * stream)257 static audio_format_t in_get_format(const struct audio_stream *stream)
258 {
259     const struct atv_stream_in* tstream =
260         reinterpret_cast<const struct atv_stream_in*>(stream);
261 
262     return tstream->impl->getFormat();
263 }
264 
in_set_format(struct audio_stream * stream,audio_format_t format)265 static int in_set_format(struct audio_stream *stream, audio_format_t format)
266 {
267     const struct atv_stream_in* tstream =
268         reinterpret_cast<const struct atv_stream_in*>(stream);
269 
270     return tstream->impl->setFormat(format);
271 }
272 
in_standby(struct audio_stream * stream)273 static int in_standby(struct audio_stream *stream)
274 {
275     const struct atv_stream_in* tstream =
276         reinterpret_cast<const struct atv_stream_in*>(stream);
277 
278     return tstream->impl->standby();
279 }
280 
in_dump(const struct audio_stream * stream,int fd)281 static int in_dump(const struct audio_stream *stream, int fd)
282 {
283     const struct atv_stream_in* tstream =
284         reinterpret_cast<const struct atv_stream_in*>(stream);
285 
286     return tstream->impl->dump(fd);
287 }
288 
in_set_parameters(struct audio_stream * stream,const char * kvpairs)289 static int in_set_parameters(struct audio_stream *stream, const char *kvpairs)
290 {
291     const struct atv_stream_in* tstream =
292         reinterpret_cast<const struct atv_stream_in*>(stream);
293 
294     return tstream->impl->setParameters(stream, kvpairs);
295 }
296 
in_get_parameters(const struct audio_stream * stream,const char * keys)297 static char* in_get_parameters(const struct audio_stream *stream,
298                                const char *keys)
299 {
300     const struct atv_stream_in* tstream =
301         reinterpret_cast<const struct atv_stream_in*>(stream);
302 
303     return tstream->impl->getParameters(keys);
304 }
305 
in_set_gain(struct audio_stream_in * stream,float gain)306 static int in_set_gain(struct audio_stream_in *stream, float gain)
307 {
308     const struct atv_stream_in* tstream =
309         reinterpret_cast<const struct atv_stream_in*>(stream);
310 
311     return tstream->impl->setGain(gain);
312 }
313 
in_read(struct audio_stream_in * stream,void * buffer,size_t bytes)314 static ssize_t in_read(struct audio_stream_in *stream, void* buffer,
315                        size_t bytes)
316 {
317     const struct atv_stream_in* tstream =
318         reinterpret_cast<const struct atv_stream_in*>(stream);
319 
320     return tstream->impl->read(buffer, bytes);
321 }
322 
in_get_input_frames_lost(struct audio_stream_in * stream)323 static uint32_t in_get_input_frames_lost(struct audio_stream_in *stream)
324 {
325     const struct atv_stream_in* tstream =
326         reinterpret_cast<const struct atv_stream_in*>(stream);
327 
328     return tstream->impl->getInputFramesLost();
329 }
330 
in_add_audio_effect(const struct audio_stream * stream,effect_handle_t effect)331 static int in_add_audio_effect(const struct audio_stream *stream,
332                                effect_handle_t effect)
333 {
334     const struct atv_stream_in* tstream =
335         reinterpret_cast<const struct atv_stream_in*>(stream);
336 
337     return tstream->impl->addAudioEffect(effect);
338 }
339 
in_remove_audio_effect(const struct audio_stream * stream,effect_handle_t effect)340 static int in_remove_audio_effect(const struct audio_stream *stream,
341                                   effect_handle_t effect)
342 {
343     const struct atv_stream_in* tstream =
344         reinterpret_cast<const struct atv_stream_in*>(stream);
345 
346     return tstream->impl->removeAudioEffect(effect);
347 }
348 
349 /*******************************************************************************
350  *
351  * Audio device stubs
352  *
353  ******************************************************************************/
354 
adev_set_parameters(struct audio_hw_device * dev,const char * kvpairs)355 static int adev_set_parameters(struct audio_hw_device *dev, const char *kvpairs)
356 {
357     const struct atv_audio_device* adev =
358         reinterpret_cast<const struct atv_audio_device*>(dev);
359 
360     return adev->output->setParameters(kvpairs);
361 
362 }
363 
adev_get_parameters(const struct audio_hw_device * dev,const char * keys)364 static char * adev_get_parameters(const struct audio_hw_device *dev,
365                                   const char *keys)
366 {
367     const struct atv_audio_device* adev =
368         reinterpret_cast<const struct atv_audio_device*>(dev);
369 
370     return adev->output->getParameters(keys);
371 }
372 
adev_set_voice_volume(struct audio_hw_device * dev,float volume)373 static int adev_set_voice_volume(struct audio_hw_device *dev, float volume)
374 {
375     (void) dev;
376     (void) volume;
377     return 0;
378 }
379 
adev_set_mode(struct audio_hw_device * dev,audio_mode_t mode)380 static int adev_set_mode(struct audio_hw_device *dev, audio_mode_t mode)
381 {
382     (void) dev;
383     (void) mode;
384     return 0;
385 }
386 
adev_set_mic_mute(struct audio_hw_device * dev,bool state)387 static int adev_set_mic_mute(struct audio_hw_device *dev, bool state)
388 {
389     const struct atv_audio_device* adev =
390         reinterpret_cast<struct atv_audio_device*>(dev);
391 
392     return adev->input->setMicMute(state);
393 }
394 
adev_get_mic_mute(const struct audio_hw_device * dev,bool * state)395 static int adev_get_mic_mute(const struct audio_hw_device *dev, bool *state)
396 {
397     const struct atv_audio_device* adev =
398         reinterpret_cast<const struct atv_audio_device*>(dev);
399 
400     return adev->input->getMicMute(state);
401 }
402 
adev_get_input_buffer_size(const struct audio_hw_device * dev,const audio_config * config)403 static size_t adev_get_input_buffer_size(const struct audio_hw_device *dev,
404                                          const audio_config *config)
405 {
406     const struct atv_audio_device* adev =
407         reinterpret_cast<const struct atv_audio_device*>(dev);
408 
409     return adev->input->getInputBufferSize(config);
410 }
411 
adev_open_input_stream(struct audio_hw_device * dev,audio_io_handle_t handle,audio_devices_t devices,struct audio_config * config,struct audio_stream_in ** stream_in,audio_input_flags_t flags,const char * address __unused,audio_source_t source __unused)412 static int adev_open_input_stream(struct audio_hw_device *dev,
413                                   audio_io_handle_t handle,
414                                   audio_devices_t devices,
415                                   struct audio_config *config,
416                                   struct audio_stream_in **stream_in,
417                                   audio_input_flags_t flags,
418                                   const char *address __unused,
419                                   audio_source_t source __unused)
420 {
421     (void) handle;
422     (void) flags;
423     int ret = 0;
424     struct atv_audio_device* adev =
425         reinterpret_cast<struct atv_audio_device*>(dev);
426     struct atv_stream_in *in = NULL;
427 
428     *stream_in = NULL;
429 
430     in = reinterpret_cast<struct atv_stream_in*>(
431             calloc(1, sizeof(struct atv_stream_in)));
432     if (!in)  {
433         ret = -ENOMEM;
434         goto bailout;
435     }
436 
437     in->stream.common.get_sample_rate = in_get_sample_rate;
438     in->stream.common.set_sample_rate = in_set_sample_rate;
439     in->stream.common.get_buffer_size = in_get_buffer_size;
440     in->stream.common.get_channels = in_get_channels;
441     in->stream.common.get_format = in_get_format;
442     in->stream.common.set_format = in_set_format;
443     in->stream.common.standby = in_standby;
444     in->stream.common.dump = in_dump;
445     in->stream.common.set_parameters = in_set_parameters;
446     in->stream.common.get_parameters = in_get_parameters;
447     in->stream.common.add_audio_effect = in_add_audio_effect;
448     in->stream.common.remove_audio_effect = in_remove_audio_effect;
449     in->stream.set_gain = in_set_gain;
450     in->stream.read = in_read;
451     in->stream.get_input_frames_lost = in_get_input_frames_lost;
452 
453     in->impl = adev->input->openInputStream(devices,
454                                             &config->format,
455                                             &config->channel_mask,
456                                             &config->sample_rate,
457                                             reinterpret_cast<status_t*>(&ret));
458     if (NULL == in->impl) {
459         ret = -ENOMEM;
460         goto bailout;
461     }
462 
463     if (0 == ret)
464         *stream_in = &in->stream;
465 
466 bailout:
467     if ((0 != ret) && (NULL != in)) {
468         delete in->impl;
469         free(in);
470     }
471 
472     return ret;
473 }
474 
adev_close_input_stream(struct audio_hw_device * dev,struct audio_stream_in * stream)475 static void adev_close_input_stream(struct audio_hw_device *dev,
476                                     struct audio_stream_in *stream)
477 {
478     struct atv_audio_device* adev =
479         reinterpret_cast<struct atv_audio_device*>(dev);
480     struct atv_stream_in* tstream =
481         reinterpret_cast<struct atv_stream_in*>(stream);
482 
483     adev->input->closeInputStream(tstream->impl);
484     free(stream);
485 }
486 
adev_open_output_stream(struct audio_hw_device * dev,audio_io_handle_t handle,audio_devices_t devices,audio_output_flags_t flags,struct audio_config * config,struct audio_stream_out ** stream_out,const char * address __unused)487 static int adev_open_output_stream(struct audio_hw_device *dev,
488                                    audio_io_handle_t handle,
489                                    audio_devices_t devices,
490                                    audio_output_flags_t flags,
491                                    struct audio_config *config,
492                                    struct audio_stream_out **stream_out,
493                                    const char *address __unused)
494 {
495     (void) handle;
496     int ret = 0;
497     struct atv_audio_device* adev =
498         reinterpret_cast<struct atv_audio_device*>(dev);
499     struct atv_stream_out *out = NULL;
500 
501     *stream_out = NULL;
502 
503     out = reinterpret_cast<struct atv_stream_out*>(
504             calloc(1, sizeof(struct atv_stream_out)));
505     if (!out)  {
506         ret = -ENOMEM;
507         goto bailout;
508     }
509 
510     out->stream.common.get_sample_rate = out_get_sample_rate;
511     out->stream.common.set_sample_rate = out_set_sample_rate;
512     out->stream.common.get_buffer_size = out_get_buffer_size;
513     out->stream.common.get_channels = out_get_channels;
514     out->stream.common.get_format = out_get_format;
515     out->stream.common.set_format = out_set_format;
516     out->stream.common.standby = out_standby;
517     out->stream.common.dump = out_dump;
518     out->stream.common.set_parameters = out_set_parameters;
519     out->stream.common.get_parameters = out_get_parameters;
520     out->stream.common.add_audio_effect = out_add_audio_effect;
521     out->stream.common.remove_audio_effect = out_remove_audio_effect;
522     out->stream.get_latency = out_get_latency;
523     out->stream.set_volume = out_set_volume;
524     out->stream.write = out_write;
525     out->stream.get_render_position = out_get_render_position;
526     out->stream.get_next_write_timestamp = out_get_next_write_timestamp;
527     out->stream.get_presentation_position = out_get_presentation_position;
528 
529     out->impl = adev->output->openOutputStream(
530             devices,
531             &config->format,
532             &config->channel_mask,
533             &config->sample_rate,
534             flags,
535             reinterpret_cast<status_t*>(&ret));
536 
537     if (NULL == out->impl) {
538         ret = -ENOMEM;
539         goto bailout;
540     }
541 
542     if (0 == ret) {
543         out->hw = adev->output;
544         *stream_out = &out->stream;
545     }
546 
547 bailout:
548     if ((0 != ret) && (NULL != out)) {
549         delete out->impl;
550         free(out);
551     }
552 
553     return ret;
554 }
555 
adev_close_output_stream(struct audio_hw_device * dev,struct audio_stream_out * stream)556 static void adev_close_output_stream(struct audio_hw_device *dev,
557                                      struct audio_stream_out *stream)
558 {
559     struct atv_audio_device* adev =
560         reinterpret_cast<struct atv_audio_device*>(dev);
561     struct atv_stream_out* tstream =
562         reinterpret_cast<struct atv_stream_out*>(stream);
563 
564     adev->output->closeOutputStream(tstream->impl);
565     free(stream);
566 }
567 
adev_init_check(const struct audio_hw_device * dev)568 static int adev_init_check(const struct audio_hw_device *dev)
569 {
570     const struct atv_audio_device* adev =
571         reinterpret_cast<const struct atv_audio_device*>(dev);
572 
573     return adev->output->initCheck();
574 }
575 
adev_set_master_volume(struct audio_hw_device * dev,float volume)576 static int adev_set_master_volume(struct audio_hw_device *dev, float volume)
577 {
578     struct atv_audio_device* adev =
579         reinterpret_cast<struct atv_audio_device*>(dev);
580 
581     return adev->output->setMasterVolume(volume);
582 }
583 
adev_get_master_volume(struct audio_hw_device * dev,float * volume)584 static int adev_get_master_volume(struct audio_hw_device *dev,
585                                   float *volume)
586 {
587     struct atv_audio_device* adev =
588         reinterpret_cast<struct atv_audio_device*>(dev);
589 
590     return adev->output->getMasterVolume(volume);
591 }
592 
adev_set_master_mute(struct audio_hw_device * dev,bool muted)593 static int adev_set_master_mute(struct audio_hw_device *dev, bool muted)
594 {
595     struct atv_audio_device* adev =
596         reinterpret_cast<struct atv_audio_device*>(dev);
597 
598     return adev->output->setMasterMute(muted);
599 }
600 
adev_get_master_mute(struct audio_hw_device * dev,bool * muted)601 static int adev_get_master_mute(struct audio_hw_device *dev,
602                                 bool *muted)
603 {
604     struct atv_audio_device* adev =
605         reinterpret_cast<struct atv_audio_device*>(dev);
606 
607     return adev->output->getMasterMute(muted);
608 }
609 
adev_dump(const audio_hw_device * dev,int fd)610 static int adev_dump(const audio_hw_device* dev, int fd)
611 {
612     const struct atv_audio_device* adev =
613         reinterpret_cast<const struct atv_audio_device*>(dev);
614 
615     int ret = adev->output->dump(fd);
616     if (ret == 0) {
617         ret = adev->input->dump(fd);
618     }
619     return ret;
620 }
621 
adev_close(hw_device_t * device)622 static int adev_close(hw_device_t *device)
623 {
624     struct atv_audio_device* adev =
625         reinterpret_cast<struct atv_audio_device*>(device);
626 
627     free(device);
628 
629     return 0;
630 }
631 
atv_audiodev_open_cpp(const hw_module_t * module,const char * name,hw_device_t ** device)632 static int atv_audiodev_open_cpp(
633         const hw_module_t* module,
634         const char* name,
635         hw_device_t** device)
636 {
637     struct atv_audio_device* adev = NULL;
638     int ret = 0;
639 
640     if (NULL == device) {
641         ret = -EINVAL;
642         goto bailout;
643     }
644 
645     *device = NULL;
646 
647     if (strcmp(name, AUDIO_HARDWARE_INTERFACE) != 0) {
648         ret = -EINVAL;
649         goto bailout;
650     }
651 
652     adev = (struct atv_audio_device*)calloc(1,
653             sizeof(struct atv_audio_device));
654     if (NULL == adev) {
655         ret = -ENOMEM;
656         goto bailout;
657     }
658 
659     adev->device.common.tag = HARDWARE_DEVICE_TAG;
660     adev->device.common.version = AUDIO_DEVICE_API_VERSION_2_0;
661     adev->device.common.module = (struct hw_module_t *) module;
662     adev->device.common.close = adev_close;
663 
664     adev->device.init_check = adev_init_check;
665     adev->device.set_voice_volume = adev_set_voice_volume;
666     adev->device.set_master_volume = adev_set_master_volume;
667     adev->device.get_master_volume = adev_get_master_volume;
668     adev->device.set_master_mute = adev_set_master_mute;
669     adev->device.get_master_mute = adev_get_master_mute;
670     adev->device.set_mode = adev_set_mode;
671     adev->device.set_mic_mute = adev_set_mic_mute;
672     adev->device.get_mic_mute = adev_get_mic_mute;
673     adev->device.set_parameters = adev_set_parameters;
674     adev->device.get_parameters = adev_get_parameters;
675     adev->device.get_input_buffer_size = adev_get_input_buffer_size;
676     adev->device.open_output_stream = adev_open_output_stream;
677     adev->device.close_output_stream = adev_close_output_stream;
678     adev->device.open_input_stream = adev_open_input_stream;
679     adev->device.close_input_stream = adev_close_input_stream;
680     adev->device.dump = adev_dump;
681 
682     adev->output = &gAudioHardwareOutput;
683     adev->input = &gAudioHardwareInput;
684     *device = &adev->device.common;
685 
686 bailout:
687     if ((0 != ret) && (NULL != adev)) {
688         free(adev);
689     }
690 
691     return 0;
692 }
693 
694 }  // namespace android
695 
atv_audiodev_open(const hw_module_t * module,const char * name,hw_device_t ** device)696 extern "C" int atv_audiodev_open(const hw_module_t* module,
697                              const char* name,
698                              hw_device_t** device) {
699     return android::atv_audiodev_open_cpp(module, name, device);
700 }
701