• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2012 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 "audio_hw_primary"
18 /*#define LOG_NDEBUG 0*/
19 
20 #include <errno.h>
21 #include <pthread.h>
22 #include <stdint.h>
23 #include <stdlib.h>
24 #include <sys/time.h>
25 #include <fcntl.h>
26 
27 #include <cutils/log.h>
28 #include <cutils/properties.h>
29 #include <cutils/str_parms.h>
30 
31 #include <hardware/audio.h>
32 #include <hardware/hardware.h>
33 
34 #include <linux/videodev2.h>
35 #include <videodev2_exynos_media.h>
36 
37 #include <system/audio.h>
38 
39 #include <tinyalsa/asoundlib.h>
40 
41 #include <audio_utils/resampler.h>
42 #include <audio_route/audio_route.h>
43 
44 #include <BubbleLevel.h>
45 
46 #include <eS305VoiceProcessing.h>
47 
48 #define PCM_CARD 0
49 #define PCM_CARD_SPDIF 1
50 #define PCM_TOTAL 2
51 
52 #define PCM_DEVICE 0
53 #define PCM_DEVICE_DEEP 1
54 #define PCM_DEVICE_VOICE 2
55 #define PCM_DEVICE_SCO 3
56 
57 #define MIXER_CARD 0
58 
59 /* duration in ms of volume ramp applied when starting capture to remove plop */
60 #define CAPTURE_START_RAMP_MS 100
61 
62 /* default sampling for HDMI multichannel output */
63 #define HDMI_MULTI_DEFAULT_SAMPLING_RATE  44100
64 /* maximum number of channel mask configurations supported. Currently the primary
65  * output only supports 1 (stereo) and the multi channel HDMI output 2 (5.1 and 7.1) */
66 #define MAX_SUPPORTED_CHANNEL_MASKS 2
67 
68 #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
69 
70 struct pcm_config pcm_config = {
71     .channels = 2,
72     .rate = 44100,
73     .period_size = 256,
74     .period_count = 2,
75     .format = PCM_FORMAT_S16_LE,
76 };
77 
78 struct pcm_config pcm_config_in = {
79     .channels = 2,
80     .rate = 44100,
81     .period_size = 1024,
82     .period_count = 2,
83     .format = PCM_FORMAT_S16_LE,
84 };
85 
86 struct pcm_config pcm_config_sco = {
87     .channels = 1,
88     .rate = 8000,
89     .period_size = 128,
90     .period_count = 2,
91     .format = PCM_FORMAT_S16_LE,
92 };
93 
94 struct pcm_config pcm_config_deep = {
95     .channels = 2,
96     .rate = 44100,
97     /* FIXME This is an arbitrary number, may change.
98      * Dynamic configuration based on screen on/off is not implemented;
99      * let's see what power consumption is first to see if necessary.
100      */
101     .period_size = 8192,
102     .period_count = 2,
103     .format = PCM_FORMAT_S16_LE,
104 };
105 
106 struct pcm_config pcm_config_hdmi_multi = {
107     .channels = 6, /* changed when the stream is opened */
108     .rate = HDMI_MULTI_DEFAULT_SAMPLING_RATE,
109     .period_size = 1024,
110     .period_count = 4,
111     .format = PCM_FORMAT_S16_LE,
112 };
113 
114 enum output_type {
115     OUTPUT_DEEP_BUF,      // deep PCM buffers output stream
116     OUTPUT_LOW_LATENCY,   // low latency output stream
117     OUTPUT_HDMI,          // HDMI multi channel
118     OUTPUT_TOTAL
119 };
120 
121 struct audio_device {
122     struct audio_hw_device hw_device;
123 
124     pthread_mutex_t lock; /* see note below on mutex acquisition order */
125     audio_devices_t out_device; /* "or" of stream_out.device for all active output streams */
126     audio_devices_t in_device;
127     bool mic_mute;
128     struct audio_route *ar;
129     audio_source_t input_source;
130     int cur_route_id;     /* current route ID: combination of input source
131                            * and output device IDs */
132     struct pcm *pcm_voice_out;
133     struct pcm *pcm_sco_out;
134     struct pcm *pcm_voice_in;
135     struct pcm *pcm_sco_in;
136     int es305_preset;
137     int es305_new_mode;
138     int es305_mode;
139     int hdmi_drv_fd;
140     struct bubble_level *bubble_level;
141     audio_channel_mask_t in_channel_mask;
142     unsigned int sco_on_count;
143 
144     struct stream_out *outputs[OUTPUT_TOTAL];
145 };
146 
147 struct stream_out {
148     struct audio_stream_out stream;
149 
150     pthread_mutex_t lock; /* see note below on mutex acquisition order */
151     struct pcm *pcm[PCM_TOTAL];
152     struct pcm_config config;
153     unsigned int pcm_device;
154     bool standby; /* true if all PCMs are inactive */
155     audio_devices_t device;
156     /* FIXME: when HDMI multichannel output is active, other outputs must be disabled as
157      * HDMI and WM1811 share the same I2S. This means that notifications and other sounds are
158      * silent when watching a 5.1 movie. */
159     bool disabled;
160     audio_channel_mask_t channel_mask;
161     /* Array of supported channel mask configurations. +1 so that the last entry is always 0 */
162     audio_channel_mask_t supported_channel_masks[MAX_SUPPORTED_CHANNEL_MASKS + 1];
163     bool muted;
164     uint64_t written; /* total frames written, not cleared when entering standby */
165 
166     struct audio_device *dev;
167 };
168 
169 struct stream_in {
170     struct audio_stream_in stream;
171 
172     pthread_mutex_t lock; /* see note below on mutex acquisition order */
173     struct pcm *pcm;
174     bool standby;
175 
176     unsigned int requested_rate;
177     struct resampler_itfe *resampler;
178     struct resampler_buffer_provider buf_provider;
179     int16_t *buffer;
180     size_t frames_in;
181     int read_status;
182     audio_source_t input_source;
183     audio_io_handle_t io_handle;
184     audio_devices_t device;
185     uint16_t ramp_vol;
186     uint16_t ramp_step;
187     size_t  ramp_frames;
188     audio_channel_mask_t channel_mask;
189 
190     struct audio_device *dev;
191 };
192 
193 #define STRING_TO_ENUM(string) { #string, string }
194 
195 struct string_to_enum {
196     const char *name;
197     uint32_t value;
198 };
199 
200 const struct string_to_enum out_channels_name_to_enum_table[] = {
201     STRING_TO_ENUM(AUDIO_CHANNEL_OUT_STEREO),
202     STRING_TO_ENUM(AUDIO_CHANNEL_OUT_5POINT1),
203     STRING_TO_ENUM(AUDIO_CHANNEL_OUT_7POINT1),
204 };
205 
206 enum {
207     OUT_DEVICE_SPEAKER,
208     OUT_DEVICE_HEADSET,
209     OUT_DEVICE_HEADPHONES,
210     OUT_DEVICE_BT_SCO,
211     OUT_DEVICE_SPEAKER_AND_HEADSET,
212     OUT_DEVICE_TAB_SIZE,           /* number of rows in route_configs[][] */
213     OUT_DEVICE_NONE,
214     OUT_DEVICE_CNT
215 };
216 
217 enum {
218     IN_SOURCE_MIC,
219     IN_SOURCE_CAMCORDER,
220     IN_SOURCE_VOICE_RECOGNITION,
221     IN_SOURCE_VOICE_COMMUNICATION,
222     IN_SOURCE_TAB_SIZE,            /* number of lines in route_configs[][] */
223     IN_SOURCE_NONE,
224     IN_SOURCE_CNT
225 };
226 
227 enum {
228     ES305_MODE_DEFAULT,
229     ES305_MODE_LEVEL,
230     ES305_NUM_MODES,
231 };
232 
get_output_device_id(audio_devices_t device)233 int get_output_device_id(audio_devices_t device)
234 {
235     if (device == AUDIO_DEVICE_NONE)
236         return OUT_DEVICE_NONE;
237 
238     if (popcount(device) == 2) {
239         if ((device == (AUDIO_DEVICE_OUT_SPEAKER |
240                        AUDIO_DEVICE_OUT_WIRED_HEADSET)) ||
241                 (device == (AUDIO_DEVICE_OUT_SPEAKER |
242                         AUDIO_DEVICE_OUT_WIRED_HEADPHONE)))
243             return OUT_DEVICE_SPEAKER_AND_HEADSET;
244         else
245             return OUT_DEVICE_NONE;
246     }
247 
248     if (popcount(device) != 1)
249         return OUT_DEVICE_NONE;
250 
251     switch (device) {
252     case AUDIO_DEVICE_OUT_SPEAKER:
253         return OUT_DEVICE_SPEAKER;
254     case AUDIO_DEVICE_OUT_WIRED_HEADSET:
255         return OUT_DEVICE_HEADSET;
256     case AUDIO_DEVICE_OUT_WIRED_HEADPHONE:
257         return OUT_DEVICE_HEADPHONES;
258     case AUDIO_DEVICE_OUT_BLUETOOTH_SCO:
259     case AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET:
260     case AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT:
261         return OUT_DEVICE_BT_SCO;
262     default:
263         return OUT_DEVICE_NONE;
264     }
265 }
266 
get_input_source_id(audio_source_t source)267 int get_input_source_id(audio_source_t source)
268 {
269     switch (source) {
270     case AUDIO_SOURCE_DEFAULT:
271         return IN_SOURCE_NONE;
272     case AUDIO_SOURCE_MIC:
273         return IN_SOURCE_MIC;
274     case AUDIO_SOURCE_CAMCORDER:
275         return IN_SOURCE_CAMCORDER;
276     case AUDIO_SOURCE_VOICE_RECOGNITION:
277         return IN_SOURCE_VOICE_RECOGNITION;
278     case AUDIO_SOURCE_VOICE_COMMUNICATION:
279         return IN_SOURCE_VOICE_COMMUNICATION;
280     default:
281         return IN_SOURCE_NONE;
282     }
283 }
284 
285 struct route_config {
286     const char * const output_route;
287     const char * const input_route;
288     int es305_preset[ES305_NUM_MODES]; // es305 preset for this route.
289                                        // -1 means es305 bypass
290 };
291 
292 const struct route_config media_speaker = {
293     "media-speaker",
294     "media-main-mic",
295     { ES305_PRESET_OFF,
296       ES305_PRESET_OFF }
297 };
298 
299 const struct route_config media_headphones = {
300     "media-headphones",
301     "media-main-mic",
302     { ES305_PRESET_OFF,
303       ES305_PRESET_OFF }
304 };
305 
306 const struct route_config media_headset = {
307     "media-headphones",
308     "media-headset-mic",
309     { ES305_PRESET_OFF,
310       ES305_PRESET_OFF }
311 };
312 
313 const struct route_config camcorder_speaker = {
314     "media-speaker",
315     "media-second-mic",
316     { ES305_PRESET_CAMCORDER,
317       ES305_PRESET_CAMCORDER }
318 };
319 
320 const struct route_config camcorder_headphones = {
321     "media-headphones",
322     "media-second-mic",
323     { ES305_PRESET_CAMCORDER,
324       ES305_PRESET_CAMCORDER }
325 };
326 
327 const struct route_config voice_rec_speaker = {
328     "voice-rec-speaker",
329     "voice-rec-main-mic",
330     { ES305_PRESET_ASRA_HANDHELD,
331       ES305_PRESET_ASRA_DESKTOP }
332 };
333 
334 const struct route_config voice_rec_headphones = {
335     "voice-rec-headphones",
336     "voice-rec-main-mic",
337     { ES305_PRESET_ASRA_HANDHELD,
338       ES305_PRESET_ASRA_DESKTOP }
339 };
340 
341 const struct route_config voice_rec_headset = {
342     "voice-rec-headphones",
343     "voice-rec-headset-mic",
344     { ES305_PRESET_ASRA_HEADSET,
345       ES305_PRESET_ASRA_HEADSET }
346 };
347 
348 const struct route_config communication_speaker = {
349     "communication-speaker",
350     "communication-main-mic",
351     { ES305_PRESET_VOIP_HANDHELD,
352       ES305_PRESET_VOIP_DESKTOP }
353 };
354 
355 const struct route_config communication_headphones = {
356     "communication-headphones",
357     "communication-main-mic",
358     { ES305_PRESET_VOIP_HEADPHONES,
359       ES305_PRESET_VOIP_HP_DESKTOP}
360 };
361 
362 const struct route_config communication_headset = {
363     "communication-headphones",
364     "communication-headset-mic",
365     { ES305_PRESET_VOIP_HEADSET,
366       ES305_PRESET_VOIP_HEADSET }
367 };
368 
369 const struct route_config speaker_and_headphones = {
370     "speaker-and-headphones",
371     "main-mic",
372     { ES305_PRESET_CURRENT,
373       ES305_PRESET_CURRENT }
374 };
375 
376 const struct route_config bluetooth_sco = {
377     "bt-sco-headset",
378     "bt-sco-mic",
379     { ES305_PRESET_OFF,
380       ES305_PRESET_OFF }
381 };
382 
383 const struct route_config * const route_configs[IN_SOURCE_TAB_SIZE]
384                                                [OUT_DEVICE_TAB_SIZE] = {
385     {   /* IN_SOURCE_MIC */
386         &media_speaker,             /* OUT_DEVICE_SPEAKER */
387         &media_headset,             /* OUT_DEVICE_HEADSET */
388         &media_headphones,          /* OUT_DEVICE_HEADPHONES */
389         &bluetooth_sco,             /* OUT_DEVICE_BT_SCO */
390         &speaker_and_headphones     /* OUT_DEVICE_SPEAKER_AND_HEADSET */
391     },
392     {   /* IN_SOURCE_CAMCORDER */
393         &camcorder_speaker,         /* OUT_DEVICE_SPEAKER */
394         &camcorder_headphones,      /* OUT_DEVICE_HEADSET */
395         &camcorder_headphones,      /* OUT_DEVICE_HEADPHONES */
396         &bluetooth_sco,             /* OUT_DEVICE_BT_SCO */
397         &speaker_and_headphones     /* OUT_DEVICE_SPEAKER_AND_HEADSET */
398     },
399     {   /* IN_SOURCE_VOICE_RECOGNITION */
400         &voice_rec_speaker,         /* OUT_DEVICE_SPEAKER */
401         &voice_rec_headset,         /* OUT_DEVICE_HEADSET */
402         &voice_rec_headphones,      /* OUT_DEVICE_HEADPHONES */
403         &bluetooth_sco,             /* OUT_DEVICE_BT_SCO */
404         &speaker_and_headphones     /* OUT_DEVICE_SPEAKER_AND_HEADSET */
405     },
406     {   /* IN_SOURCE_VOICE_COMMUNICATION */
407         &communication_speaker,     /* OUT_DEVICE_SPEAKER */
408         &communication_headset,     /* OUT_DEVICE_HEADSET */
409         &communication_headphones,  /* OUT_DEVICE_HEADPHONES */
410         &bluetooth_sco,             /* OUT_DEVICE_BT_SCO */
411         &speaker_and_headphones     /* OUT_DEVICE_SPEAKER_AND_HEADSET */
412     }
413 };
414 
415 static int do_out_standby(struct stream_out *out);
416 
417 /**
418  * NOTE: when multiple mutexes have to be acquired, always respect the
419  * following order: hw device > in stream > out stream
420  */
421 
422 /* Helper functions */
423 
open_hdmi_driver(struct audio_device * adev)424 static int open_hdmi_driver(struct audio_device *adev)
425 {
426     if (adev->hdmi_drv_fd < 0) {
427         adev->hdmi_drv_fd = open("/dev/video16", O_RDWR);
428         if (adev->hdmi_drv_fd < 0)
429             ALOGE("%s cannot open video16 (%d)", __func__, adev->hdmi_drv_fd);
430     }
431     return adev->hdmi_drv_fd;
432 }
433 
434 /* must be called with hw device mutex locked */
enable_hdmi_audio(struct audio_device * adev,int enable)435 static int enable_hdmi_audio(struct audio_device *adev, int enable)
436 {
437     int ret;
438     struct v4l2_control ctrl;
439 
440     ret = open_hdmi_driver(adev);
441     if (ret < 0)
442         return ret;
443 
444     ctrl.id = V4L2_CID_TV_ENABLE_HDMI_AUDIO;
445     ctrl.value = !!enable;
446     ret = ioctl(adev->hdmi_drv_fd, VIDIOC_S_CTRL, &ctrl);
447 
448     if (ret < 0)
449         ALOGE("V4L2_CID_TV_ENABLE_HDMI_AUDIO ioctl error (%d)", errno);
450 
451     return ret;
452 }
453 
454 /* must be called with hw device mutex locked */
read_hdmi_channel_masks(struct audio_device * adev,struct stream_out * out)455 static int read_hdmi_channel_masks(struct audio_device *adev, struct stream_out *out) {
456     int ret;
457     struct v4l2_control ctrl;
458 
459     ret = open_hdmi_driver(adev);
460     if (ret < 0)
461         return ret;
462 
463     ctrl.id = V4L2_CID_TV_MAX_AUDIO_CHANNELS;
464     ret = ioctl(adev->hdmi_drv_fd, VIDIOC_G_CTRL, &ctrl);
465     if (ret < 0) {
466         ALOGE("V4L2_CID_TV_MAX_AUDIO_CHANNELS ioctl error (%d)", errno);
467         return ret;
468     }
469 
470     ALOGV("%s ioctl %d got %d max channels", __func__, ret, ctrl.value);
471 
472     if (ctrl.value != 6 && ctrl.value != 8)
473         return -ENOSYS;
474 
475     out->supported_channel_masks[0] = AUDIO_CHANNEL_OUT_5POINT1;
476     if (ctrl.value == 8)
477         out->supported_channel_masks[1] = AUDIO_CHANNEL_OUT_7POINT1;
478 
479     return ret;
480 }
481 
482 /* must be called with hw device mutex locked */
set_hdmi_channels(struct audio_device * adev,int channels)483 static int set_hdmi_channels(struct audio_device *adev, int channels) {
484     int ret;
485     struct v4l2_control ctrl;
486 
487     ret = open_hdmi_driver(adev);
488     if (ret < 0)
489         return ret;
490 
491     ctrl.id = V4L2_CID_TV_SET_NUM_CHANNELS;
492     ctrl.value = channels;
493     ret = ioctl(adev->hdmi_drv_fd, VIDIOC_S_CTRL, &ctrl);
494     if (ret < 0)
495         ALOGE("V4L2_CID_TV_SET_NUM_CHANNELS ioctl error (%d)", errno);
496 
497     return ret;
498 }
499 
select_devices(struct audio_device * adev)500 static void select_devices(struct audio_device *adev)
501 {
502     int output_device_id = get_output_device_id(adev->out_device);
503     int input_source_id = get_input_source_id(adev->input_source);
504     const char *output_route = NULL;
505     const char *input_route = NULL;
506     int new_route_id;
507     int new_es305_preset = -1;
508 
509     audio_route_reset(adev->ar);
510 
511     enable_hdmi_audio(adev, adev->out_device & AUDIO_DEVICE_OUT_AUX_DIGITAL);
512 
513     new_route_id = (1 << (input_source_id + OUT_DEVICE_CNT)) + (1 << output_device_id);
514     if ((new_route_id == adev->cur_route_id) && (adev->es305_mode == adev->es305_new_mode))
515         return;
516     adev->cur_route_id = new_route_id;
517     adev->es305_mode = adev->es305_new_mode;
518 
519     if (input_source_id != IN_SOURCE_NONE) {
520         if (output_device_id != OUT_DEVICE_NONE) {
521             input_route =
522                     route_configs[input_source_id][output_device_id]->input_route;
523             output_route =
524                     route_configs[input_source_id][output_device_id]->output_route;
525             new_es305_preset =
526                 route_configs[input_source_id][output_device_id]->es305_preset[adev->es305_mode];
527         } else {
528             switch (adev->in_device) {
529             case AUDIO_DEVICE_IN_WIRED_HEADSET & ~AUDIO_DEVICE_BIT_IN:
530                 output_device_id = OUT_DEVICE_HEADSET;
531                 break;
532             case AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET & ~AUDIO_DEVICE_BIT_IN:
533                 output_device_id = OUT_DEVICE_BT_SCO;
534                 break;
535             default:
536                 output_device_id = OUT_DEVICE_SPEAKER;
537                 break;
538             }
539             input_route =
540                     route_configs[input_source_id][output_device_id]->input_route;
541             new_es305_preset =
542                 route_configs[input_source_id][output_device_id]->es305_preset[adev->es305_mode];
543         }
544         // disable noise suppression when capturing front and back mic for voice recognition
545         if ((adev->input_source == AUDIO_SOURCE_VOICE_RECOGNITION) &&
546                 (adev->in_channel_mask == AUDIO_CHANNEL_IN_FRONT_BACK))
547             new_es305_preset = -1;
548     } else {
549         if (output_device_id != OUT_DEVICE_NONE) {
550             output_route =
551                     route_configs[IN_SOURCE_MIC][output_device_id]->output_route;
552         }
553     }
554 
555     ALOGV("select_devices() devices %#x input src %d output route %s input route %s",
556           adev->out_device, adev->input_source,
557           output_route ? output_route : "none",
558           input_route ? input_route : "none");
559 
560     if (output_route)
561         audio_route_apply_path(adev->ar, output_route);
562     if (input_route)
563         audio_route_apply_path(adev->ar, input_route);
564 
565     if ((new_es305_preset != ES305_PRESET_CURRENT) &&
566             (new_es305_preset != adev->es305_preset)) {
567         ALOGV("  select_devices() changing es305 preset from %d to %d",
568               adev->es305_preset, new_es305_preset);
569         if (eS305_UsePreset(new_es305_preset) == 0) {
570             adev->es305_preset = new_es305_preset;
571         }
572     }
573 
574     audio_route_update_mixer(adev->ar);
575 }
576 
bubblelevel_callback(bool is_level,void * user_data)577 void bubblelevel_callback(bool is_level, void *user_data)
578 {
579     struct audio_device *adev = (struct audio_device *)user_data;
580     int es305_mode;
581 
582     if (is_level)
583         es305_mode = ES305_MODE_LEVEL;
584     else
585         es305_mode = ES305_MODE_DEFAULT;
586 
587     pthread_mutex_lock(&adev->lock);
588     if (es305_mode != adev->es305_mode) {
589         adev->es305_new_mode = es305_mode;
590         select_devices(adev);
591         ALOGV("bubblelevel_callback is_level %d es305_mode %d", is_level, es305_mode);
592     }
593     pthread_mutex_unlock(&adev->lock);
594 }
595 
596 /* must be called with hw device mutex locked */
get_bubblelevel(struct audio_device * adev)597 bool get_bubblelevel(struct audio_device *adev)
598 {
599     if (!adev->bubble_level) {
600         adev->bubble_level = bubble_level_create();
601         if (adev->bubble_level)
602             adev->bubble_level->set_callback(adev->bubble_level, bubblelevel_callback, adev);
603     }
604     return (adev->bubble_level != NULL);
605 }
606 
force_non_hdmi_out_standby(struct audio_device * adev)607 static void force_non_hdmi_out_standby(struct audio_device *adev)
608 {
609     enum output_type type;
610     struct stream_out *out;
611 
612     for (type = 0; type < OUTPUT_TOTAL; ++type) {
613         out = adev->outputs[type];
614         if (type == OUTPUT_HDMI || !out)
615             continue;
616         pthread_mutex_lock(&out->lock);
617         do_out_standby(out);
618         pthread_mutex_unlock(&out->lock);
619     }
620 }
621 
622 /* must be called with the hw device mutex locked, OK to hold other mutexes */
start_bt_sco(struct audio_device * adev)623 static void start_bt_sco(struct audio_device *adev) {
624     if (adev->sco_on_count++ > 0)
625         return;
626 
627     adev->pcm_voice_out = pcm_open(PCM_CARD, PCM_DEVICE_VOICE, PCM_OUT | PCM_MONOTONIC,
628                               &pcm_config_sco);
629     if (adev->pcm_voice_out && !pcm_is_ready(adev->pcm_voice_out)) {
630         ALOGE("pcm_open(VOICE_OUT) failed: %s", pcm_get_error(adev->pcm_voice_out));
631         goto err_voice_out;
632     }
633     adev->pcm_sco_out = pcm_open(PCM_CARD, PCM_DEVICE_SCO, PCM_OUT | PCM_MONOTONIC,
634                             &pcm_config_sco);
635     if (adev->pcm_sco_out && !pcm_is_ready(adev->pcm_sco_out)) {
636         ALOGE("pcm_open(SCO_OUT) failed: %s", pcm_get_error(adev->pcm_sco_out));
637         goto err_sco_out;
638     }
639     adev->pcm_voice_in = pcm_open(PCM_CARD, PCM_DEVICE_VOICE, PCM_IN,
640                                  &pcm_config_sco);
641     if (adev->pcm_voice_in && !pcm_is_ready(adev->pcm_voice_in)) {
642         ALOGE("pcm_open(VOICE_IN) failed: %s", pcm_get_error(adev->pcm_voice_in));
643         goto err_voice_in;
644     }
645     adev->pcm_sco_in = pcm_open(PCM_CARD, PCM_DEVICE_SCO, PCM_IN,
646                                &pcm_config_sco);
647     if (adev->pcm_sco_in && !pcm_is_ready(adev->pcm_sco_in)) {
648         ALOGE("pcm_open(SCO_IN) failed: %s", pcm_get_error(adev->pcm_sco_in));
649         goto err_sco_in;
650     }
651 
652     pcm_start(adev->pcm_voice_out);
653     pcm_start(adev->pcm_sco_out);
654     pcm_start(adev->pcm_voice_in);
655     pcm_start(adev->pcm_sco_in);
656 
657     return;
658 
659 err_sco_in:
660     pcm_close(adev->pcm_sco_in);
661 err_voice_in:
662     pcm_close(adev->pcm_voice_in);
663 err_sco_out:
664     pcm_close(adev->pcm_sco_out);
665 err_voice_out:
666     pcm_close(adev->pcm_voice_out);
667 }
668 
669 /* must be called with the hw device mutex locked, OK to hold other mutexes */
stop_bt_sco(struct audio_device * adev)670 static void stop_bt_sco(struct audio_device *adev) {
671     if (adev->sco_on_count == 0 || --adev->sco_on_count > 0)
672         return;
673 
674     pcm_stop(adev->pcm_voice_out);
675     pcm_stop(adev->pcm_sco_out);
676     pcm_stop(adev->pcm_voice_in);
677     pcm_stop(adev->pcm_sco_in);
678 
679     pcm_close(adev->pcm_voice_out);
680     pcm_close(adev->pcm_sco_out);
681     pcm_close(adev->pcm_voice_in);
682     pcm_close(adev->pcm_sco_in);
683 }
684 
685 /* must be called with hw device and output stream mutexes locked */
start_output_stream(struct stream_out * out)686 static int start_output_stream(struct stream_out *out)
687 {
688     struct audio_device *adev = out->dev;
689     int type;
690 
691     if (out == adev->outputs[OUTPUT_HDMI]) {
692         force_non_hdmi_out_standby(adev);
693     } else if (adev->outputs[OUTPUT_HDMI] && !adev->outputs[OUTPUT_HDMI]->standby) {
694         out->disabled = true;
695         return 0;
696     }
697 
698     out->disabled = false;
699 
700     if (out->device & (AUDIO_DEVICE_OUT_SPEAKER |
701                        AUDIO_DEVICE_OUT_WIRED_HEADSET |
702                        AUDIO_DEVICE_OUT_WIRED_HEADPHONE |
703                        AUDIO_DEVICE_OUT_AUX_DIGITAL |
704                        AUDIO_DEVICE_OUT_ALL_SCO)) {
705 
706         out->pcm[PCM_CARD] = pcm_open(PCM_CARD, out->pcm_device,
707                                       PCM_OUT | PCM_MONOTONIC, &out->config);
708 
709         if (out->pcm[PCM_CARD] && !pcm_is_ready(out->pcm[PCM_CARD])) {
710             ALOGE("pcm_open(PCM_CARD) failed: %s",
711                   pcm_get_error(out->pcm[PCM_CARD]));
712             pcm_close(out->pcm[PCM_CARD]);
713             return -ENOMEM;
714         }
715     }
716 
717     if (out->device & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) {
718         out->pcm[PCM_CARD_SPDIF] = pcm_open(PCM_CARD_SPDIF, out->pcm_device,
719                                             PCM_OUT | PCM_MONOTONIC, &out->config);
720 
721         if (out->pcm[PCM_CARD_SPDIF] &&
722                 !pcm_is_ready(out->pcm[PCM_CARD_SPDIF])) {
723             ALOGE("pcm_open(PCM_CARD_SPDIF) failed: %s",
724                   pcm_get_error(out->pcm[PCM_CARD_SPDIF]));
725             pcm_close(out->pcm[PCM_CARD_SPDIF]);
726             return -ENOMEM;
727         }
728     }
729 
730     adev->out_device |= out->device;
731     select_devices(adev);
732 
733     if (out->device & AUDIO_DEVICE_OUT_ALL_SCO)
734         start_bt_sco(adev);
735 
736     if (out->device & AUDIO_DEVICE_OUT_AUX_DIGITAL)
737         set_hdmi_channels(adev, out->config.channels);
738 
739     /* anticipate level measurement in case we start capture later */
740     if (get_bubblelevel(adev))
741         adev->bubble_level->poll_once(adev->bubble_level);
742 
743     return 0;
744 }
745 
746 /* must be called with hw device and input stream mutexes locked */
start_input_stream(struct stream_in * in)747 static int start_input_stream(struct stream_in *in)
748 {
749     struct audio_device *adev = in->dev;
750 
751     in->pcm = pcm_open(PCM_CARD, PCM_DEVICE, PCM_IN, &pcm_config_in);
752 
753     if (in->pcm && !pcm_is_ready(in->pcm)) {
754         ALOGE("pcm_open() failed: %s", pcm_get_error(in->pcm));
755         pcm_close(in->pcm);
756         return -ENOMEM;
757     }
758 
759     /* if no supported sample rate is available, use the resampler */
760     if (in->resampler)
761         in->resampler->reset(in->resampler);
762 
763     in->frames_in = 0;
764     adev->input_source = in->input_source;
765     adev->in_device = in->device;
766     adev->in_channel_mask = in->channel_mask;
767 
768     eS305_SetActiveIoHandle(in->io_handle);
769     select_devices(adev);
770 
771     if (in->device & AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET)
772         start_bt_sco(adev);
773 
774     /* initialize volume ramp */
775     in->ramp_frames = (CAPTURE_START_RAMP_MS * in->requested_rate) / 1000;
776     in->ramp_step = (uint16_t)(USHRT_MAX / in->ramp_frames);
777     in->ramp_vol = 0;;
778 
779     if (get_bubblelevel(adev)) {
780         adev->bubble_level->set_poll_interval(adev->bubble_level, BL_POLL_INTERVAL_MIN_SEC);
781         adev->bubble_level->start_polling(adev->bubble_level);
782     }
783 
784     return 0;
785 }
786 
get_input_buffer_size(unsigned int sample_rate,audio_format_t format,unsigned int channel_count)787 static size_t get_input_buffer_size(unsigned int sample_rate,
788                                     audio_format_t format,
789                                     unsigned int channel_count)
790 {
791     size_t size;
792 
793     /*
794      * take resampling into account and return the closest majoring
795      * multiple of 16 frames, as audioflinger expects audio buffers to
796      * be a multiple of 16 frames
797      */
798     size = (pcm_config_in.period_size * sample_rate) / pcm_config_in.rate;
799     size = ((size + 15) / 16) * 16;
800 
801     return size * channel_count * audio_bytes_per_sample(format);
802 }
803 
get_next_buffer(struct resampler_buffer_provider * buffer_provider,struct resampler_buffer * buffer)804 static int get_next_buffer(struct resampler_buffer_provider *buffer_provider,
805                                    struct resampler_buffer* buffer)
806 {
807     struct stream_in *in;
808     size_t i;
809 
810     if (buffer_provider == NULL || buffer == NULL)
811         return -EINVAL;
812 
813     in = (struct stream_in *)((char *)buffer_provider -
814                                    offsetof(struct stream_in, buf_provider));
815 
816     if (in->pcm == NULL) {
817         buffer->raw = NULL;
818         buffer->frame_count = 0;
819         in->read_status = -ENODEV;
820         return -ENODEV;
821     }
822 
823     if (in->frames_in == 0) {
824         in->read_status = pcm_read(in->pcm,
825                                    (void*)in->buffer,
826                                    pcm_frames_to_bytes(in->pcm, pcm_config_in.period_size));
827         if (in->read_status != 0) {
828             ALOGE("get_next_buffer() pcm_read error %d", in->read_status);
829             buffer->raw = NULL;
830             buffer->frame_count = 0;
831             return in->read_status;
832         }
833 
834         in->frames_in = pcm_config_in.period_size;
835 
836         /* Do stereo to mono conversion in place by discarding right channel */
837         if (in->channel_mask == AUDIO_CHANNEL_IN_MONO)
838             for (i = 1; i < in->frames_in; i++)
839                 in->buffer[i] = in->buffer[i * 2];
840     }
841 
842     buffer->frame_count = (buffer->frame_count > in->frames_in) ?
843                                 in->frames_in : buffer->frame_count;
844     buffer->i16 = in->buffer +
845             (pcm_config_in.period_size - in->frames_in) * popcount(in->channel_mask);
846 
847     return in->read_status;
848 
849 }
850 
release_buffer(struct resampler_buffer_provider * buffer_provider,struct resampler_buffer * buffer)851 static void release_buffer(struct resampler_buffer_provider *buffer_provider,
852                                   struct resampler_buffer* buffer)
853 {
854     struct stream_in *in;
855 
856     if (buffer_provider == NULL || buffer == NULL)
857         return;
858 
859     in = (struct stream_in *)((char *)buffer_provider -
860                                    offsetof(struct stream_in, buf_provider));
861 
862     in->frames_in -= buffer->frame_count;
863 }
864 
865 /* read_frames() reads frames from kernel driver, down samples to capture rate
866  * if necessary and output the number of frames requested to the buffer specified */
read_frames(struct stream_in * in,void * buffer,ssize_t frames)867 static ssize_t read_frames(struct stream_in *in, void *buffer, ssize_t frames)
868 {
869     ssize_t frames_wr = 0;
870     size_t frame_size = audio_stream_frame_size(&in->stream.common);
871 
872     while (frames_wr < frames) {
873         size_t frames_rd = frames - frames_wr;
874         if (in->resampler != NULL) {
875             in->resampler->resample_from_provider(in->resampler,
876                     (int16_t *)((char *)buffer +
877                             frames_wr * frame_size),
878                     &frames_rd);
879         } else {
880             struct resampler_buffer buf = {
881                     { raw : NULL, },
882                     frame_count : frames_rd,
883             };
884             get_next_buffer(&in->buf_provider, &buf);
885             if (buf.raw != NULL) {
886                 memcpy((char *)buffer +
887                            frames_wr * frame_size,
888                         buf.raw,
889                         buf.frame_count * frame_size);
890                 frames_rd = buf.frame_count;
891             }
892             release_buffer(&in->buf_provider, &buf);
893         }
894         /* in->read_status is updated by getNextBuffer() also called by
895          * in->resampler->resample_from_provider() */
896         if (in->read_status != 0)
897             return in->read_status;
898 
899         frames_wr += frames_rd;
900     }
901     return frames_wr;
902 }
903 
904 /* API functions */
905 
out_get_sample_rate(const struct audio_stream * stream)906 static uint32_t out_get_sample_rate(const struct audio_stream *stream)
907 {
908     struct stream_out *out = (struct stream_out *)stream;
909 
910     return out->config.rate;
911 }
912 
out_set_sample_rate(struct audio_stream * stream,uint32_t rate)913 static int out_set_sample_rate(struct audio_stream *stream, uint32_t rate)
914 {
915     return -ENOSYS;
916 }
917 
out_get_buffer_size(const struct audio_stream * stream)918 static size_t out_get_buffer_size(const struct audio_stream *stream)
919 {
920     struct stream_out *out = (struct stream_out *)stream;
921 
922     return out->config.period_size *
923             audio_stream_frame_size((struct audio_stream *)stream);
924 }
925 
out_get_channels(const struct audio_stream * stream)926 static audio_channel_mask_t out_get_channels(const struct audio_stream *stream)
927 {
928     struct stream_out *out = (struct stream_out *)stream;
929 
930     return out->channel_mask;
931 }
932 
out_get_format(const struct audio_stream * stream)933 static audio_format_t out_get_format(const struct audio_stream *stream)
934 {
935     return AUDIO_FORMAT_PCM_16_BIT;
936 }
937 
out_set_format(struct audio_stream * stream,audio_format_t format)938 static int out_set_format(struct audio_stream *stream, audio_format_t format)
939 {
940     return -ENOSYS;
941 }
942 
943 /* Return the set of output devices associated with active streams
944  * other than out.  Assumes out is non-NULL and out->dev is locked.
945  */
output_devices(struct stream_out * out)946 static audio_devices_t output_devices(struct stream_out *out)
947 {
948     struct audio_device *dev = out->dev;
949     enum output_type type;
950     audio_devices_t devices = AUDIO_DEVICE_NONE;
951 
952     for (type = 0; type < OUTPUT_TOTAL; ++type) {
953         struct stream_out *other = dev->outputs[type];
954         if (other && (other != out) && !other->standby) {
955             /* safe to access other stream without a mutex,
956              * because we hold the dev lock,
957              * which prevents the other stream from being closed
958              */
959             devices |= other->device;
960         }
961     }
962 
963     return devices;
964 }
965 
do_out_standby(struct stream_out * out)966 static int do_out_standby(struct stream_out *out)
967 {
968     struct audio_device *adev = out->dev;
969     int i;
970 
971     if (!out->standby) {
972         for (i = 0; i < PCM_TOTAL; i++) {
973             if (out->pcm[i]) {
974                 pcm_close(out->pcm[i]);
975                 out->pcm[i] = NULL;
976             }
977         }
978         out->standby = true;
979 
980         if (out == adev->outputs[OUTPUT_HDMI]) {
981             /* force standby on low latency output stream so that it can reuse HDMI driver if
982              * necessary when restarted */
983             force_non_hdmi_out_standby(adev);
984         }
985 
986         if (out->device & AUDIO_DEVICE_OUT_ALL_SCO)
987             stop_bt_sco(adev);
988 
989         /* re-calculate the set of active devices from other streams */
990         adev->out_device = output_devices(out);
991 
992         /* Skip resetting the mixer if no output device is active */
993         if (adev->out_device)
994             select_devices(adev);
995     }
996 
997     return 0;
998 }
999 
out_standby(struct audio_stream * stream)1000 static int out_standby(struct audio_stream *stream)
1001 {
1002     struct stream_out *out = (struct stream_out *)stream;
1003     int ret;
1004 
1005     pthread_mutex_lock(&out->dev->lock);
1006     pthread_mutex_lock(&out->lock);
1007 
1008     ret = do_out_standby(out);
1009 
1010     pthread_mutex_unlock(&out->lock);
1011     pthread_mutex_unlock(&out->dev->lock);
1012 
1013     return ret;
1014 }
1015 
out_dump(const struct audio_stream * stream,int fd)1016 static int out_dump(const struct audio_stream *stream, int fd)
1017 {
1018     return 0;
1019 }
1020 
out_set_parameters(struct audio_stream * stream,const char * kvpairs)1021 static int out_set_parameters(struct audio_stream *stream, const char *kvpairs)
1022 {
1023     struct stream_out *out = (struct stream_out *)stream;
1024     struct audio_device *adev = out->dev;
1025     struct str_parms *parms;
1026     char value[32];
1027     int ret;
1028     unsigned int val;
1029 
1030     parms = str_parms_create_str(kvpairs);
1031 
1032     ret = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_ROUTING,
1033                             value, sizeof(value));
1034     pthread_mutex_lock(&adev->lock);
1035     pthread_mutex_lock(&out->lock);
1036     if (ret >= 0) {
1037         val = atoi(value);
1038         if ((out->device != val) && (val != 0)) {
1039             /* Force standby if moving to/from SPDIF or if the output
1040              * device changes when in SPDIF mode */
1041             if (((val & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) ^
1042                  (adev->out_device & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET)) ||
1043                 (adev->out_device & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET)) {
1044                 do_out_standby(out);
1045             }
1046 
1047             /* force output standby to start or stop SCO pcm stream if needed */
1048             if ((val & AUDIO_DEVICE_OUT_ALL_SCO) ^
1049                     (out->device & AUDIO_DEVICE_OUT_ALL_SCO)) {
1050                 do_out_standby(out);
1051             }
1052 
1053             if (!out->standby && (out == adev->outputs[OUTPUT_HDMI] ||
1054                     !adev->outputs[OUTPUT_HDMI] ||
1055                     adev->outputs[OUTPUT_HDMI]->standby)) {
1056                 adev->out_device = output_devices(out) | val;
1057                 select_devices(adev);
1058             }
1059             out->device = val;
1060         }
1061     }
1062     pthread_mutex_unlock(&out->lock);
1063     pthread_mutex_unlock(&adev->lock);
1064 
1065     str_parms_destroy(parms);
1066     return ret;
1067 }
1068 
out_get_parameters(const struct audio_stream * stream,const char * keys)1069 static char * out_get_parameters(const struct audio_stream *stream, const char *keys)
1070 {
1071     struct stream_out *out = (struct stream_out *)stream;
1072     struct str_parms *query = str_parms_create_str(keys);
1073     char *str;
1074     char value[256];
1075     struct str_parms *reply = str_parms_create();
1076     size_t i, j;
1077     int ret;
1078     bool first = true;
1079 
1080     ret = str_parms_get_str(query, AUDIO_PARAMETER_STREAM_SUP_CHANNELS, value, sizeof(value));
1081     if (ret >= 0) {
1082         value[0] = '\0';
1083         i = 0;
1084         /* the last entry in supported_channel_masks[] is always 0 */
1085         while (out->supported_channel_masks[i] != 0) {
1086             for (j = 0; j < ARRAY_SIZE(out_channels_name_to_enum_table); j++) {
1087                 if (out_channels_name_to_enum_table[j].value == out->supported_channel_masks[i]) {
1088                     if (!first) {
1089                         strcat(value, "|");
1090                     }
1091                     strcat(value, out_channels_name_to_enum_table[j].name);
1092                     first = false;
1093                     break;
1094                 }
1095             }
1096             i++;
1097         }
1098         str_parms_add_str(reply, AUDIO_PARAMETER_STREAM_SUP_CHANNELS, value);
1099         str = str_parms_to_str(reply);
1100     } else {
1101         str = strdup(keys);
1102     }
1103 
1104     str_parms_destroy(query);
1105     str_parms_destroy(reply);
1106     return str;
1107 }
1108 
out_get_latency(const struct audio_stream_out * stream)1109 static uint32_t out_get_latency(const struct audio_stream_out *stream)
1110 {
1111     struct stream_out *out = (struct stream_out *)stream;
1112 
1113     return (out->config.period_size * out->config.period_count * 1000) /
1114             out->config.rate;
1115 }
1116 
out_set_volume(struct audio_stream_out * stream,float left,float right)1117 static int out_set_volume(struct audio_stream_out *stream, float left,
1118                           float right)
1119 {
1120     struct stream_out *out = (struct stream_out *)stream;
1121     struct audio_device *adev = out->dev;
1122 
1123     if (out == adev->outputs[OUTPUT_HDMI]) {
1124         /* only take left channel into account: the API is for stereo anyway */
1125         out->muted = (left == 0.0f);
1126         return 0;
1127     }
1128     return -ENOSYS;
1129 }
1130 
out_write(struct audio_stream_out * stream,const void * buffer,size_t bytes)1131 static ssize_t out_write(struct audio_stream_out *stream, const void* buffer,
1132                          size_t bytes)
1133 {
1134     int ret = 0;
1135     struct stream_out *out = (struct stream_out *)stream;
1136     struct audio_device *adev = out->dev;
1137     int i;
1138 
1139     /*
1140      * acquiring hw device mutex systematically is useful if a low
1141      * priority thread is waiting on the output stream mutex - e.g.
1142      * executing out_set_parameters() while holding the hw device
1143      * mutex
1144      */
1145     pthread_mutex_lock(&adev->lock);
1146     pthread_mutex_lock(&out->lock);
1147     if (out->standby) {
1148         ret = start_output_stream(out);
1149         if (ret != 0) {
1150             pthread_mutex_unlock(&adev->lock);
1151             goto exit;
1152         }
1153         out->standby = false;
1154     }
1155     pthread_mutex_unlock(&adev->lock);
1156 
1157     if (out->disabled) {
1158         ret = -EPIPE;
1159         goto exit;
1160     }
1161 
1162     if (out->muted)
1163         memset((void *)buffer, 0, bytes);
1164 
1165     /* Write to all active PCMs */
1166     for (i = 0; i < PCM_TOTAL; i++)
1167         if (out->pcm[i]) {
1168             ret = pcm_write(out->pcm[i], (void *)buffer, bytes);
1169             if (ret != 0)
1170                 break;
1171         }
1172     if (ret == 0)
1173         out->written += bytes / (out->config.channels * sizeof(short));
1174 
1175 exit:
1176     pthread_mutex_unlock(&out->lock);
1177 
1178     if (ret != 0) {
1179         usleep(bytes * 1000000 / audio_stream_frame_size(&stream->common) /
1180                out_get_sample_rate(&stream->common));
1181     }
1182 
1183     return bytes;
1184 }
1185 
out_get_render_position(const struct audio_stream_out * stream,uint32_t * dsp_frames)1186 static int out_get_render_position(const struct audio_stream_out *stream,
1187                                    uint32_t *dsp_frames)
1188 {
1189     return -EINVAL;
1190 }
1191 
out_add_audio_effect(const struct audio_stream * stream,effect_handle_t effect)1192 static int out_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
1193 {
1194     return 0;
1195 }
1196 
out_remove_audio_effect(const struct audio_stream * stream,effect_handle_t effect)1197 static int out_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
1198 {
1199     return 0;
1200 }
1201 
out_get_next_write_timestamp(const struct audio_stream_out * stream,int64_t * timestamp)1202 static int out_get_next_write_timestamp(const struct audio_stream_out *stream,
1203                                         int64_t *timestamp)
1204 {
1205     return -EINVAL;
1206 }
1207 
out_get_presentation_position(const struct audio_stream_out * stream,uint64_t * frames,struct timespec * timestamp)1208 static int out_get_presentation_position(const struct audio_stream_out *stream,
1209                                    uint64_t *frames, struct timespec *timestamp)
1210 {
1211     struct stream_out *out = (struct stream_out *)stream;
1212     int ret = -1;
1213 
1214     pthread_mutex_lock(&out->lock);
1215 
1216     int i;
1217     // There is a question how to implement this correctly when there is more than one PCM stream.
1218     // We are just interested in the frames pending for playback in the kernel buffer here,
1219     // not the total played since start.  The current behavior should be safe because the
1220     // cases where both cards are active are marginal.
1221     for (i = 0; i < PCM_TOTAL; i++)
1222         if (out->pcm[i]) {
1223             size_t avail;
1224             if (pcm_get_htimestamp(out->pcm[i], &avail, timestamp) == 0) {
1225                 size_t kernel_buffer_size = out->config.period_size * out->config.period_count;
1226                 // FIXME This calculation is incorrect if there is buffering after app processor
1227                 int64_t signed_frames = out->written - kernel_buffer_size + avail;
1228                 // It would be unusual for this value to be negative, but check just in case ...
1229                 if (signed_frames >= 0) {
1230                     *frames = signed_frames;
1231                     ret = 0;
1232                 }
1233                 break;
1234             }
1235         }
1236 
1237     pthread_mutex_unlock(&out->lock);
1238 
1239     return ret;
1240 }
1241 
1242 /** audio_stream_in implementation **/
in_get_sample_rate(const struct audio_stream * stream)1243 static uint32_t in_get_sample_rate(const struct audio_stream *stream)
1244 {
1245     struct stream_in *in = (struct stream_in *)stream;
1246 
1247     return in->requested_rate;
1248 }
1249 
in_set_sample_rate(struct audio_stream * stream,uint32_t rate)1250 static int in_set_sample_rate(struct audio_stream *stream, uint32_t rate)
1251 {
1252     return 0;
1253 }
1254 
in_get_channels(const struct audio_stream * stream)1255 static audio_channel_mask_t in_get_channels(const struct audio_stream *stream)
1256 {
1257     struct stream_in *in = (struct stream_in *)stream;
1258 
1259     return in->channel_mask;
1260 }
1261 
1262 
in_get_buffer_size(const struct audio_stream * stream)1263 static size_t in_get_buffer_size(const struct audio_stream *stream)
1264 {
1265     struct stream_in *in = (struct stream_in *)stream;
1266 
1267     return get_input_buffer_size(in->requested_rate,
1268                                  AUDIO_FORMAT_PCM_16_BIT,
1269                                  popcount(in_get_channels(stream)));
1270 }
1271 
in_get_format(const struct audio_stream * stream)1272 static audio_format_t in_get_format(const struct audio_stream *stream)
1273 {
1274     return AUDIO_FORMAT_PCM_16_BIT;
1275 }
1276 
in_set_format(struct audio_stream * stream,audio_format_t format)1277 static int in_set_format(struct audio_stream *stream, audio_format_t format)
1278 {
1279     return -ENOSYS;
1280 }
1281 
do_in_standby(struct stream_in * in)1282 static int do_in_standby(struct stream_in *in)
1283 {
1284     struct audio_device *adev = in->dev;
1285 
1286     if (!in->standby) {
1287         pcm_close(in->pcm);
1288         in->pcm = NULL;
1289 
1290         if (in->device & AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET)
1291             stop_bt_sco(adev);
1292 
1293         in->dev->input_source = AUDIO_SOURCE_DEFAULT;
1294         in->dev->in_device = AUDIO_DEVICE_NONE;
1295         in->dev->in_channel_mask = 0;
1296         select_devices(adev);
1297         in->standby = true;
1298 
1299         if (get_bubblelevel(adev))
1300             in->dev->bubble_level->stop_polling(adev->bubble_level);
1301     }
1302 
1303     eS305_SetActiveIoHandle(ES305_IO_HANDLE_NONE);
1304     return 0;
1305 }
1306 
in_standby(struct audio_stream * stream)1307 static int in_standby(struct audio_stream *stream)
1308 {
1309     struct stream_in *in = (struct stream_in *)stream;
1310     int ret;
1311 
1312     pthread_mutex_lock(&in->dev->lock);
1313     pthread_mutex_lock(&in->lock);
1314 
1315     ret = do_in_standby(in);
1316 
1317     pthread_mutex_unlock(&in->lock);
1318     pthread_mutex_unlock(&in->dev->lock);
1319 
1320     return ret;
1321 }
1322 
in_dump(const struct audio_stream * stream,int fd)1323 static int in_dump(const struct audio_stream *stream, int fd)
1324 {
1325     return 0;
1326 }
1327 
in_set_parameters(struct audio_stream * stream,const char * kvpairs)1328 static int in_set_parameters(struct audio_stream *stream, const char *kvpairs)
1329 {
1330     struct stream_in *in = (struct stream_in *)stream;
1331     struct audio_device *adev = in->dev;
1332     struct str_parms *parms;
1333     char value[32];
1334     int ret;
1335     unsigned int val;
1336     bool apply_now = false;
1337 
1338     parms = str_parms_create_str(kvpairs);
1339 
1340     pthread_mutex_lock(&adev->lock);
1341     pthread_mutex_lock(&in->lock);
1342     ret = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_INPUT_SOURCE,
1343                             value, sizeof(value));
1344     if (ret >= 0) {
1345         val = atoi(value);
1346         /* no audio source uses val == 0 */
1347         if ((in->input_source != val) && (val != 0)) {
1348             in->input_source = val;
1349             apply_now = !in->standby;
1350         }
1351     }
1352 
1353     ret = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_ROUTING,
1354                             value, sizeof(value));
1355     if (ret >= 0) {
1356         /* strip AUDIO_DEVICE_BIT_IN to allow bitwise comparisons */
1357         val = atoi(value) & ~AUDIO_DEVICE_BIT_IN;
1358         /* no audio device uses val == 0 */
1359         if ((in->device != val) && (val != 0)) {
1360             /* force output standby to start or stop SCO pcm stream if needed */
1361             if ((val & AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET) ^
1362                     (in->device & AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET)) {
1363                 do_in_standby(in);
1364             }
1365             in->device = val;
1366             apply_now = !in->standby;
1367         }
1368     }
1369 
1370     if (apply_now) {
1371         adev->input_source = in->input_source;
1372         adev->in_device = in->device;
1373         select_devices(adev);
1374     }
1375 
1376     pthread_mutex_unlock(&in->lock);
1377     pthread_mutex_unlock(&adev->lock);
1378 
1379     str_parms_destroy(parms);
1380     return ret;
1381 }
1382 
in_get_parameters(const struct audio_stream * stream,const char * keys)1383 static char * in_get_parameters(const struct audio_stream *stream,
1384                                 const char *keys)
1385 {
1386     return strdup("");
1387 }
1388 
in_set_gain(struct audio_stream_in * stream,float gain)1389 static int in_set_gain(struct audio_stream_in *stream, float gain)
1390 {
1391     return 0;
1392 }
1393 
in_apply_ramp(struct stream_in * in,int16_t * buffer,size_t frames)1394 static void in_apply_ramp(struct stream_in *in, int16_t *buffer, size_t frames)
1395 {
1396     size_t i;
1397     uint16_t vol = in->ramp_vol;
1398     uint16_t step = in->ramp_step;
1399 
1400     frames = (frames < in->ramp_frames) ? frames : in->ramp_frames;
1401 
1402     if (in->channel_mask == AUDIO_CHANNEL_IN_MONO)
1403         for (i = 0; i < frames; i++)
1404         {
1405             buffer[i] = (int16_t)((buffer[i] * vol) >> 16);
1406             vol += step;
1407         }
1408     else
1409         for (i = 0; i < frames; i++)
1410         {
1411             buffer[2*i] = (int16_t)((buffer[2*i] * vol) >> 16);
1412             buffer[2*i + 1] = (int16_t)((buffer[2*i + 1] * vol) >> 16);
1413             vol += step;
1414         }
1415 
1416 
1417     in->ramp_vol = vol;
1418     in->ramp_frames -= frames;
1419 }
1420 
in_read(struct audio_stream_in * stream,void * buffer,size_t bytes)1421 static ssize_t in_read(struct audio_stream_in *stream, void* buffer,
1422                        size_t bytes)
1423 {
1424     int ret = 0;
1425     struct stream_in *in = (struct stream_in *)stream;
1426     struct audio_device *adev = in->dev;
1427     size_t frames_rq = bytes / audio_stream_frame_size(&stream->common);
1428 
1429     /*
1430      * acquiring hw device mutex systematically is useful if a low
1431      * priority thread is waiting on the input stream mutex - e.g.
1432      * executing in_set_parameters() while holding the hw device
1433      * mutex
1434      */
1435     pthread_mutex_lock(&adev->lock);
1436     pthread_mutex_lock(&in->lock);
1437     if (in->standby) {
1438         ret = start_input_stream(in);
1439         if (ret == 0)
1440             in->standby = 0;
1441     }
1442     pthread_mutex_unlock(&adev->lock);
1443 
1444     if (ret < 0)
1445         goto exit;
1446 
1447     /*if (in->num_preprocessors != 0)
1448         ret = process_frames(in, buffer, frames_rq);
1449       else */
1450     ret = read_frames(in, buffer, frames_rq);
1451 
1452     if (ret > 0)
1453         ret = 0;
1454 
1455     if (in->ramp_frames > 0)
1456         in_apply_ramp(in, buffer, frames_rq);
1457 
1458     /*
1459      * Instead of writing zeroes here, we could trust the hardware
1460      * to always provide zeroes when muted.
1461      */
1462     if (ret == 0 && adev->mic_mute)
1463         memset(buffer, 0, bytes);
1464 
1465 exit:
1466     if (ret < 0)
1467         usleep(bytes * 1000000 / audio_stream_frame_size(&stream->common) /
1468                in_get_sample_rate(&stream->common));
1469 
1470     pthread_mutex_unlock(&in->lock);
1471     return bytes;
1472 }
1473 
in_get_input_frames_lost(struct audio_stream_in * stream)1474 static uint32_t in_get_input_frames_lost(struct audio_stream_in *stream)
1475 {
1476     return 0;
1477 }
1478 
in_add_audio_effect(const struct audio_stream * stream,effect_handle_t effect)1479 static int in_add_audio_effect(const struct audio_stream *stream,
1480                                effect_handle_t effect)
1481 {
1482     struct stream_in *in = (struct stream_in *)stream;
1483     effect_descriptor_t descr;
1484     if ((*effect)->get_descriptor(effect, &descr) == 0) {
1485 
1486         pthread_mutex_lock(&in->dev->lock);
1487         pthread_mutex_lock(&in->lock);
1488 
1489         eS305_AddEffect(&descr, in->io_handle);
1490 
1491         pthread_mutex_unlock(&in->lock);
1492         pthread_mutex_unlock(&in->dev->lock);
1493     }
1494 
1495     return 0;
1496 }
1497 
in_remove_audio_effect(const struct audio_stream * stream,effect_handle_t effect)1498 static int in_remove_audio_effect(const struct audio_stream *stream,
1499                                   effect_handle_t effect)
1500 {
1501     struct stream_in *in = (struct stream_in *)stream;
1502     effect_descriptor_t descr;
1503     if ((*effect)->get_descriptor(effect, &descr) == 0) {
1504 
1505         pthread_mutex_lock(&in->dev->lock);
1506         pthread_mutex_lock(&in->lock);
1507 
1508         eS305_RemoveEffect(&descr, in->io_handle);
1509 
1510         pthread_mutex_unlock(&in->lock);
1511         pthread_mutex_unlock(&in->dev->lock);
1512     }
1513 
1514     return 0;
1515 }
1516 
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)1517 static int adev_open_output_stream(struct audio_hw_device *dev,
1518                                    audio_io_handle_t handle,
1519                                    audio_devices_t devices,
1520                                    audio_output_flags_t flags,
1521                                    struct audio_config *config,
1522                                    struct audio_stream_out **stream_out)
1523 {
1524     struct audio_device *adev = (struct audio_device *)dev;
1525     struct stream_out *out;
1526     int ret;
1527     enum output_type type;
1528 
1529     out = (struct stream_out *)calloc(1, sizeof(struct stream_out));
1530     if (!out)
1531         return -ENOMEM;
1532 
1533     out->supported_channel_masks[0] = AUDIO_CHANNEL_OUT_STEREO;
1534     out->channel_mask = AUDIO_CHANNEL_OUT_STEREO;
1535     if (devices == AUDIO_DEVICE_NONE)
1536         devices = AUDIO_DEVICE_OUT_SPEAKER;
1537     out->device = devices;
1538 
1539     if (flags & AUDIO_OUTPUT_FLAG_DIRECT &&
1540                    devices == AUDIO_DEVICE_OUT_AUX_DIGITAL) {
1541         pthread_mutex_lock(&adev->lock);
1542         ret = read_hdmi_channel_masks(adev, out);
1543         pthread_mutex_unlock(&adev->lock);
1544         if (ret != 0)
1545             goto err_open;
1546         if (config->sample_rate == 0)
1547             config->sample_rate = HDMI_MULTI_DEFAULT_SAMPLING_RATE;
1548         if (config->channel_mask == 0)
1549             config->channel_mask = AUDIO_CHANNEL_OUT_5POINT1;
1550         out->channel_mask = config->channel_mask;
1551         out->config = pcm_config_hdmi_multi;
1552         out->config.rate = config->sample_rate;
1553         out->config.channels = popcount(config->channel_mask);
1554         out->pcm_device = PCM_DEVICE;
1555         type = OUTPUT_HDMI;
1556     } else if (flags & AUDIO_OUTPUT_FLAG_DEEP_BUFFER) {
1557         out->config = pcm_config_deep;
1558         out->pcm_device = PCM_DEVICE_DEEP;
1559         type = OUTPUT_DEEP_BUF;
1560     } else {
1561         out->config = pcm_config;
1562         out->pcm_device = PCM_DEVICE;
1563         type = OUTPUT_LOW_LATENCY;
1564     }
1565 
1566     out->stream.common.get_sample_rate = out_get_sample_rate;
1567     out->stream.common.set_sample_rate = out_set_sample_rate;
1568     out->stream.common.get_buffer_size = out_get_buffer_size;
1569     out->stream.common.get_channels = out_get_channels;
1570     out->stream.common.get_format = out_get_format;
1571     out->stream.common.set_format = out_set_format;
1572     out->stream.common.standby = out_standby;
1573     out->stream.common.dump = out_dump;
1574     out->stream.common.set_parameters = out_set_parameters;
1575     out->stream.common.get_parameters = out_get_parameters;
1576     out->stream.common.add_audio_effect = out_add_audio_effect;
1577     out->stream.common.remove_audio_effect = out_remove_audio_effect;
1578     out->stream.get_latency = out_get_latency;
1579     out->stream.set_volume = out_set_volume;
1580     out->stream.write = out_write;
1581     out->stream.get_render_position = out_get_render_position;
1582     out->stream.get_next_write_timestamp = out_get_next_write_timestamp;
1583     out->stream.get_presentation_position = out_get_presentation_position;
1584 
1585     out->dev = adev;
1586 
1587     config->format = out_get_format(&out->stream.common);
1588     config->channel_mask = out_get_channels(&out->stream.common);
1589     config->sample_rate = out_get_sample_rate(&out->stream.common);
1590 
1591     out->standby = true;
1592     /* out->muted = false; by calloc() */
1593     /* out->written = 0; by calloc() */
1594 
1595     pthread_mutex_lock(&adev->lock);
1596     if (adev->outputs[type]) {
1597         pthread_mutex_unlock(&adev->lock);
1598         ret = -EBUSY;
1599         goto err_open;
1600     }
1601     adev->outputs[type] = out;
1602     pthread_mutex_unlock(&adev->lock);
1603 
1604     *stream_out = &out->stream;
1605 
1606     return 0;
1607 
1608 err_open:
1609     free(out);
1610     *stream_out = NULL;
1611     return ret;
1612 }
1613 
adev_close_output_stream(struct audio_hw_device * dev,struct audio_stream_out * stream)1614 static void adev_close_output_stream(struct audio_hw_device *dev,
1615                                      struct audio_stream_out *stream)
1616 {
1617     struct audio_device *adev;
1618     enum output_type type;
1619 
1620     out_standby(&stream->common);
1621     adev = (struct audio_device *)dev;
1622     pthread_mutex_lock(&adev->lock);
1623     for (type = 0; type < OUTPUT_TOTAL; ++type) {
1624         if (adev->outputs[type] == (struct stream_out *) stream) {
1625             adev->outputs[type] = NULL;
1626             break;
1627         }
1628     }
1629     pthread_mutex_unlock(&adev->lock);
1630     free(stream);
1631 }
1632 
adev_set_parameters(struct audio_hw_device * dev,const char * kvpairs)1633 static int adev_set_parameters(struct audio_hw_device *dev, const char *kvpairs)
1634 {
1635     return 0;
1636 }
1637 
adev_get_parameters(const struct audio_hw_device * dev,const char * keys)1638 static char * adev_get_parameters(const struct audio_hw_device *dev,
1639                                   const char *keys)
1640 {
1641     struct audio_device *adev = (struct audio_device *)dev;
1642     struct str_parms *parms = str_parms_create_str(keys);
1643     char value[32];
1644     int ret = str_parms_get_str(parms, "ec_supported", value, sizeof(value));
1645     char *str;
1646 
1647     str_parms_destroy(parms);
1648     if (ret >= 0) {
1649         parms = str_parms_create_str("ec_supported=yes");
1650         str = str_parms_to_str(parms);
1651         str_parms_destroy(parms);
1652         return str;
1653     }
1654     return strdup("");
1655 }
1656 
adev_init_check(const struct audio_hw_device * dev)1657 static int adev_init_check(const struct audio_hw_device *dev)
1658 {
1659     return 0;
1660 }
1661 
adev_set_voice_volume(struct audio_hw_device * dev,float volume)1662 static int adev_set_voice_volume(struct audio_hw_device *dev, float volume)
1663 {
1664     return -ENOSYS;
1665 }
1666 
adev_set_master_volume(struct audio_hw_device * dev,float volume)1667 static int adev_set_master_volume(struct audio_hw_device *dev, float volume)
1668 {
1669     return -ENOSYS;
1670 }
1671 
adev_set_mode(struct audio_hw_device * dev,audio_mode_t mode)1672 static int adev_set_mode(struct audio_hw_device *dev, audio_mode_t mode)
1673 {
1674     return 0;
1675 }
1676 
adev_set_mic_mute(struct audio_hw_device * dev,bool state)1677 static int adev_set_mic_mute(struct audio_hw_device *dev, bool state)
1678 {
1679     struct audio_device *adev = (struct audio_device *)dev;
1680 
1681     adev->mic_mute = state;
1682 
1683     return 0;
1684 }
1685 
adev_get_mic_mute(const struct audio_hw_device * dev,bool * state)1686 static int adev_get_mic_mute(const struct audio_hw_device *dev, bool *state)
1687 {
1688     struct audio_device *adev = (struct audio_device *)dev;
1689 
1690     *state = adev->mic_mute;
1691 
1692     return 0;
1693 }
1694 
adev_get_input_buffer_size(const struct audio_hw_device * dev,const struct audio_config * config)1695 static size_t adev_get_input_buffer_size(const struct audio_hw_device *dev,
1696                                          const struct audio_config *config)
1697 {
1698 
1699     return get_input_buffer_size(config->sample_rate, config->format,
1700                                  popcount(config->channel_mask));
1701 }
1702 
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)1703 static int adev_open_input_stream(struct audio_hw_device *dev,
1704                                   audio_io_handle_t handle,
1705                                   audio_devices_t devices,
1706                                   struct audio_config *config,
1707                                   struct audio_stream_in **stream_in)
1708 {
1709     struct audio_device *adev = (struct audio_device *)dev;
1710     struct stream_in *in;
1711     int ret;
1712 
1713     *stream_in = NULL;
1714 
1715     /* Respond with a request for mono if a different format is given. */
1716     if (config->channel_mask != AUDIO_CHANNEL_IN_MONO &&
1717             config->channel_mask != AUDIO_CHANNEL_IN_FRONT_BACK) {
1718         config->channel_mask = AUDIO_CHANNEL_IN_MONO;
1719         return -EINVAL;
1720     }
1721 
1722     in = (struct stream_in *)calloc(1, sizeof(struct stream_in));
1723     if (!in)
1724         return -ENOMEM;
1725 
1726     in->stream.common.get_sample_rate = in_get_sample_rate;
1727     in->stream.common.set_sample_rate = in_set_sample_rate;
1728     in->stream.common.get_buffer_size = in_get_buffer_size;
1729     in->stream.common.get_channels = in_get_channels;
1730     in->stream.common.get_format = in_get_format;
1731     in->stream.common.set_format = in_set_format;
1732     in->stream.common.standby = in_standby;
1733     in->stream.common.dump = in_dump;
1734     in->stream.common.set_parameters = in_set_parameters;
1735     in->stream.common.get_parameters = in_get_parameters;
1736     in->stream.common.add_audio_effect = in_add_audio_effect;
1737     in->stream.common.remove_audio_effect = in_remove_audio_effect;
1738     in->stream.set_gain = in_set_gain;
1739     in->stream.read = in_read;
1740     in->stream.get_input_frames_lost = in_get_input_frames_lost;
1741 
1742     in->dev = adev;
1743     in->standby = true;
1744     in->requested_rate = config->sample_rate;
1745     in->input_source = AUDIO_SOURCE_DEFAULT;
1746     /* strip AUDIO_DEVICE_BIT_IN to allow bitwise comparisons */
1747     in->device = devices & ~AUDIO_DEVICE_BIT_IN;
1748     in->io_handle = handle;
1749     in->channel_mask = config->channel_mask;
1750 
1751     in->buffer = malloc(pcm_config_in.period_size * pcm_config_in.channels
1752                                                * audio_stream_frame_size(&in->stream.common));
1753 
1754     if (!in->buffer) {
1755         ret = -ENOMEM;
1756         goto err_malloc;
1757     }
1758 
1759     if (in->requested_rate != pcm_config_in.rate) {
1760         in->buf_provider.get_next_buffer = get_next_buffer;
1761         in->buf_provider.release_buffer = release_buffer;
1762 
1763         ret = create_resampler(pcm_config_in.rate,
1764                                in->requested_rate,
1765                                popcount(in->channel_mask),
1766                                RESAMPLER_QUALITY_DEFAULT,
1767                                &in->buf_provider,
1768                                &in->resampler);
1769         if (ret != 0) {
1770             ret = -EINVAL;
1771             goto err_resampler;
1772         }
1773     }
1774 
1775     *stream_in = &in->stream;
1776     return 0;
1777 
1778 err_resampler:
1779     free(in->buffer);
1780 err_malloc:
1781     free(in);
1782     return ret;
1783 }
1784 
adev_close_input_stream(struct audio_hw_device * dev,struct audio_stream_in * stream)1785 static void adev_close_input_stream(struct audio_hw_device *dev,
1786                                    struct audio_stream_in *stream)
1787 {
1788     struct stream_in *in = (struct stream_in *)stream;
1789 
1790     in_standby(&stream->common);
1791     if (in->resampler) {
1792         release_resampler(in->resampler);
1793         in->resampler = NULL;
1794     }
1795     free(in->buffer);
1796     free(stream);
1797 }
1798 
adev_dump(const audio_hw_device_t * device,int fd)1799 static int adev_dump(const audio_hw_device_t *device, int fd)
1800 {
1801     return 0;
1802 }
1803 
adev_close(hw_device_t * device)1804 static int adev_close(hw_device_t *device)
1805 {
1806     struct audio_device *adev = (struct audio_device *)device;
1807 
1808     audio_route_free(adev->ar);
1809 
1810     eS305_Release();
1811 
1812     if (adev->hdmi_drv_fd >= 0)
1813         close(adev->hdmi_drv_fd);
1814 
1815     if (adev->bubble_level)
1816         bubble_level_release(adev->bubble_level);
1817 
1818     free(device);
1819     return 0;
1820 }
1821 
adev_open(const hw_module_t * module,const char * name,hw_device_t ** device)1822 static int adev_open(const hw_module_t* module, const char* name,
1823                      hw_device_t** device)
1824 {
1825     struct audio_device *adev;
1826     int ret;
1827 
1828     if (strcmp(name, AUDIO_HARDWARE_INTERFACE) != 0)
1829         return -EINVAL;
1830 
1831     adev = calloc(1, sizeof(struct audio_device));
1832     if (!adev)
1833         return -ENOMEM;
1834 
1835     adev->hw_device.common.tag = HARDWARE_DEVICE_TAG;
1836     adev->hw_device.common.version = AUDIO_DEVICE_API_VERSION_2_0;
1837     adev->hw_device.common.module = (struct hw_module_t *) module;
1838     adev->hw_device.common.close = adev_close;
1839 
1840     adev->hw_device.init_check = adev_init_check;
1841     adev->hw_device.set_voice_volume = adev_set_voice_volume;
1842     adev->hw_device.set_master_volume = adev_set_master_volume;
1843     adev->hw_device.set_mode = adev_set_mode;
1844     adev->hw_device.set_mic_mute = adev_set_mic_mute;
1845     adev->hw_device.get_mic_mute = adev_get_mic_mute;
1846     adev->hw_device.set_parameters = adev_set_parameters;
1847     adev->hw_device.get_parameters = adev_get_parameters;
1848     adev->hw_device.get_input_buffer_size = adev_get_input_buffer_size;
1849     adev->hw_device.open_output_stream = adev_open_output_stream;
1850     adev->hw_device.close_output_stream = adev_close_output_stream;
1851     adev->hw_device.open_input_stream = adev_open_input_stream;
1852     adev->hw_device.close_input_stream = adev_close_input_stream;
1853     adev->hw_device.dump = adev_dump;
1854 
1855     adev->ar = audio_route_init(MIXER_CARD, NULL);
1856     adev->input_source = AUDIO_SOURCE_DEFAULT;
1857     /* adev->cur_route_id initial value is 0 and such that first device
1858      * selection is always applied by select_devices() */
1859 
1860     adev->es305_preset = ES305_PRESET_INIT;
1861     adev->es305_new_mode = ES305_MODE_LEVEL;
1862     adev->es305_mode = ES305_MODE_LEVEL;
1863     adev->hdmi_drv_fd = -1;
1864 
1865     *device = &adev->hw_device.common;
1866 
1867     return 0;
1868 }
1869 
1870 static struct hw_module_methods_t hal_module_methods = {
1871     .open = adev_open,
1872 };
1873 
1874 struct audio_module HAL_MODULE_INFO_SYM = {
1875     .common = {
1876         .tag = HARDWARE_MODULE_TAG,
1877         .module_api_version = AUDIO_MODULE_API_VERSION_0_1,
1878         .hal_api_version = HARDWARE_HAL_API_VERSION,
1879         .id = AUDIO_HARDWARE_MODULE_ID,
1880         .name = "Manta audio HW HAL",
1881         .author = "The Android Open Source Project",
1882         .methods = &hal_module_methods,
1883     },
1884 };
1885