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 "modules.audio.audio_hal"
18 /*#define LOG_NDEBUG 0*/
19
20 #include <errno.h>
21 #include <inttypes.h>
22 #include <pthread.h>
23 #include <stdint.h>
24 #include <stdlib.h>
25 #include <sys/time.h>
26
27 #include <log/log.h>
28 #include <cutils/str_parms.h>
29 #include <cutils/properties.h>
30
31 #include <hardware/audio.h>
32 #include <hardware/audio_alsaops.h>
33 #include <hardware/hardware.h>
34
35 #include <system/audio.h>
36
37 #include <tinyalsa/asoundlib.h>
38
39 #include <audio_utils/channels.h>
40
41 #include <dirent.h>
42 #include <sys/ioctl.h>
43 #include <fcntl.h>
44 #include <sound/asound.h>
45
46
47 #define PCM_DEV_STR "pcm"
48 #if TARGET_AUDIO_PRIMARY
49 #define AUDIO_STR "ALC662 rev1 Analog"
50 #else
51 #define AUDIO_STR "USB Audio"
52 #endif
53 #define MAX_PATH_LEN 30
54
55 #define NBR_RETRIES 5
56 #define RETRY_WAIT_USEC 20000
57
58 /* FOR TESTING:
59 * Set k_force_channels to force the number of channels to present to AudioFlinger.
60 * 0 disables (this is default: present the device channels to AudioFlinger).
61 * 2 forces to legacy stereo mode.
62 *
63 * Others values can be tried (up to 8).
64 * TODO: AudioFlinger cannot support more than 8 active output channels
65 * at this time, so limiting logic needs to be put here or communicated from above.
66 */
67 static const unsigned k_force_channels = 0;
68
69 #include "alsa_device_profile.h"
70 #include "alsa_device_proxy.h"
71 #include "alsa_logging.h"
72
73 #define DEFAULT_INPUT_BUFFER_SIZE_MS 20
74
75 struct audio_device {
76 struct audio_hw_device hw_device;
77
78 pthread_mutex_t lock; /* see note below on mutex acquisition order */
79
80 /* output */
81 alsa_device_profile out_profile;
82
83 /* input */
84 alsa_device_profile in_profile;
85
86 bool mic_muted;
87
88 bool standby;
89 #if TARGET_AUDIO_PRIMARY
90 unsigned int master_volume;
91 #endif
92 };
93
94 struct stream_out {
95 struct audio_stream_out stream;
96
97 pthread_mutex_t lock; /* see note below on mutex acquisition order */
98 pthread_mutex_t pre_lock; /* acquire before lock to avoid DOS by playback thread */
99 bool standby;
100
101 struct audio_device *dev; /* hardware information - only using this for the lock */
102
103 alsa_device_profile * profile; /* Points to the alsa_device_profile in the audio_device */
104 alsa_device_proxy proxy; /* state of the stream */
105
106 unsigned hal_channel_count; /* channel count exposed to AudioFlinger.
107 * This may differ from the device channel count when
108 * the device is not compatible with AudioFlinger
109 * capabilities, e.g. exposes too many channels or
110 * too few channels. */
111 audio_channel_mask_t hal_channel_mask; /* channel mask exposed to AudioFlinger. */
112
113 void * conversion_buffer; /* any conversions are put into here
114 * they could come from here too if
115 * there was a previous conversion */
116 size_t conversion_buffer_size; /* in bytes */
117 };
118
119 struct stream_in {
120 struct audio_stream_in stream;
121
122 pthread_mutex_t lock; /* see note below on mutex acquisition order */
123 pthread_mutex_t pre_lock; /* acquire before lock to avoid DOS by capture thread */
124 bool standby;
125
126 struct audio_device *dev; /* hardware information - only using this for the lock */
127
128 alsa_device_profile * profile; /* Points to the alsa_device_profile in the audio_device */
129 alsa_device_proxy proxy; /* state of the stream */
130
131 unsigned hal_channel_count; /* channel count exposed to AudioFlinger.
132 * This may differ from the device channel count when
133 * the device is not compatible with AudioFlinger
134 * capabilities, e.g. exposes too many channels or
135 * too few channels. */
136 audio_channel_mask_t hal_channel_mask; /* channel mask exposed to AudioFlinger. */
137
138 /* We may need to read more data from the device in order to data reduce to 16bit, 4chan */
139 void * conversion_buffer; /* any conversions are put into here
140 * they could come from here too if
141 * there was a previous conversion */
142 size_t conversion_buffer_size; /* in bytes */
143 };
144
145 /*
146 * NOTE: when multiple mutexes have to be acquired, always take the
147 * stream_in or stream_out mutex first, followed by the audio_device mutex.
148 * stream pre_lock is always acquired before stream lock to prevent starvation of control thread by
149 * higher priority playback or capture thread.
150 */
151
152
153 static int in_stream_card_number = -1, out_stream_card_number = -1;
154
155
156 /*
157 * Examines a pcm-device file to see if its a USB Audio device and
158 * returns its card-number. If no match, returns -1.
159 */
first_valid_sound_card(char * pcm_name,bool is_out_stream)160 static int first_valid_sound_card(char *pcm_name, bool is_out_stream)
161 {
162 int fd;
163 char pcm_dev_path[MAX_PATH_LEN];
164 struct snd_pcm_info info;
165 char type;
166 int pcm_name_length;
167
168 ALOGV("%s enter",__func__);
169
170 pcm_name_length = strlen(pcm_name);
171 if (pcm_name_length < 2) {
172 return -1;
173 }
174 type = is_out_stream ? 'p' : 'c';
175 /* If pcm out then filename must end with 0p/0c */
176 if ((pcm_name[pcm_name_length -2] != '0') && (pcm_name[pcm_name_length - 1] != type)) {
177 ALOGV("%s exit",__func__);
178 return -1;
179 }
180
181 snprintf(pcm_dev_path, sizeof(pcm_dev_path), "/dev/snd/%s", pcm_name);
182 fd = open(pcm_dev_path, O_RDONLY);
183
184 if (fd != -1) {
185 if (!(ioctl(fd, SNDRV_PCM_IOCTL_INFO, &info))) {
186 if (strstr(info.id, AUDIO_STR)) {
187 close(fd);
188 ALOGV("%s exit",__func__);
189 return info.card;
190 }
191 } else {
192 ALOGE("ioctl failed for file: %s", pcm_dev_path);
193 }
194
195 close(fd);
196 }
197
198 ALOGV("%s exit",__func__);
199 return -1;
200 }
201
202 /*
203 * Returns the number of the first valid USB Audio card
204 * If none is found, returns -1.
205 */
get_first_sound_card(bool is_out_stream)206 static int get_first_sound_card(bool is_out_stream)
207 {
208 DIR *dir;
209 struct dirent *de = NULL;
210 int card_nr;
211
212 ALOGV("%s enter",__func__);
213
214 dir = opendir("/dev/snd");
215 if (dir == NULL) {
216 ALOGE("Could not open directory /dev/snd");
217 ALOGV("%s exit",__func__);
218 return -1;
219 }
220
221 while ((de = readdir(dir))) {
222 if (strncmp(de->d_name, PCM_DEV_STR, sizeof(PCM_DEV_STR) - 1) == 0) {
223 if ((card_nr = first_valid_sound_card(de->d_name, is_out_stream)) != -1) {
224 closedir(dir);
225 ALOGV("%s exit",__func__);
226 return card_nr;
227 }
228 }
229 }
230
231 closedir(dir);
232 ALOGW("No usb-card found in /dev/snd");
233 ALOGV("%s exit",__func__);
234 return -1;
235 }
236
parse_card_device_params(bool is_out_stream,int * card,int * device)237 static bool parse_card_device_params(bool is_out_stream, int *card, int *device)
238 {
239 int try_time;
240 int found_card = -1;
241
242 if (is_out_stream) {
243 if (out_stream_card_number != -1) {
244 *card = out_stream_card_number;
245 *device = 0;
246 return true;
247 }
248 } else {
249 if (in_stream_card_number != -1) {
250 *card = in_stream_card_number;
251 *device = 0;
252 return true;
253 }
254 }
255
256 for (try_time = 0; try_time < NBR_RETRIES; try_time++) {
257 found_card = get_first_sound_card(is_out_stream);
258 if (found_card == -1)
259 usleep(RETRY_WAIT_USEC);
260 else
261 break;
262 }
263
264 if (found_card == -1) {
265 *card = -1;
266 *device = -1;
267 return false;
268 }
269
270 if (is_out_stream) {
271 out_stream_card_number = found_card;
272 } else {
273 in_stream_card_number = found_card;
274 }
275
276 *card = found_card;
277 *device = 0;
278
279 return true;
280 }
281
device_get_parameters(alsa_device_profile * profile,const char * keys)282 static char * device_get_parameters(alsa_device_profile * profile, const char * keys)
283 {
284 if (profile->card < 0 || profile->device < 0) {
285 return strdup("");
286 }
287
288 struct str_parms *query = str_parms_create_str(keys);
289 struct str_parms *result = str_parms_create();
290
291 /* These keys are from hardware/libhardware/include/audio.h */
292 /* supported sample rates */
293 if (str_parms_has_key(query, AUDIO_PARAMETER_STREAM_SUP_SAMPLING_RATES)) {
294 char* rates_list = profile_get_sample_rate_strs(profile);
295 str_parms_add_str(result, AUDIO_PARAMETER_STREAM_SUP_SAMPLING_RATES,
296 rates_list);
297 free(rates_list);
298 }
299
300 /* supported channel counts */
301 if (str_parms_has_key(query, AUDIO_PARAMETER_STREAM_SUP_CHANNELS)) {
302 char* channels_list = profile_get_channel_count_strs(profile);
303 str_parms_add_str(result, AUDIO_PARAMETER_STREAM_SUP_CHANNELS,
304 channels_list);
305 free(channels_list);
306 }
307
308 /* supported sample formats */
309 if (str_parms_has_key(query, AUDIO_PARAMETER_STREAM_SUP_FORMATS)) {
310 char * format_params = profile_get_format_strs(profile);
311 str_parms_add_str(result, AUDIO_PARAMETER_STREAM_SUP_FORMATS,
312 format_params);
313 free(format_params);
314 }
315 str_parms_destroy(query);
316
317 char* result_str = str_parms_to_str(result);
318 str_parms_destroy(result);
319
320 ALOGV("device_get_parameters = %s", result_str);
321
322 return result_str;
323 }
324
lock_input_stream(struct stream_in * in)325 void lock_input_stream(struct stream_in *in)
326 {
327 pthread_mutex_lock(&in->pre_lock);
328 pthread_mutex_lock(&in->lock);
329 pthread_mutex_unlock(&in->pre_lock);
330 }
331
lock_output_stream(struct stream_out * out)332 void lock_output_stream(struct stream_out *out)
333 {
334 pthread_mutex_lock(&out->pre_lock);
335 pthread_mutex_lock(&out->lock);
336 pthread_mutex_unlock(&out->pre_lock);
337 }
338
339 /*
340 * HAl Functions
341 */
342 /**
343 * NOTE: when multiple mutexes have to be acquired, always respect the
344 * following order: hw device > out stream
345 */
346
347 /*
348 * OUT functions
349 */
out_get_sample_rate(const struct audio_stream * stream)350 static uint32_t out_get_sample_rate(const struct audio_stream *stream)
351 {
352 uint32_t rate = proxy_get_sample_rate(&((struct stream_out*)stream)->proxy);
353 ALOGV("out_get_sample_rate() = %d", rate);
354 return rate;
355 }
356
out_set_sample_rate(struct audio_stream * stream,uint32_t rate)357 static int out_set_sample_rate(struct audio_stream *stream, uint32_t rate)
358 {
359 return 0;
360 }
361
out_get_buffer_size(const struct audio_stream * stream)362 static size_t out_get_buffer_size(const struct audio_stream *stream)
363 {
364 const struct stream_out* out = (const struct stream_out*)stream;
365 size_t buffer_size =
366 proxy_get_period_size(&out->proxy) * audio_stream_out_frame_size(&(out->stream));
367 return buffer_size;
368 }
369
out_get_channels(const struct audio_stream * stream)370 static uint32_t out_get_channels(const struct audio_stream *stream)
371 {
372 const struct stream_out *out = (const struct stream_out*)stream;
373 return out->hal_channel_mask;
374 }
375
out_get_format(const struct audio_stream * stream)376 static audio_format_t out_get_format(const struct audio_stream *stream)
377 {
378 /* Note: The HAL doesn't do any FORMAT conversion at this time. It
379 * Relies on the framework to provide data in the specified format.
380 * This could change in the future.
381 */
382 alsa_device_proxy * proxy = &((struct stream_out*)stream)->proxy;
383 audio_format_t format = audio_format_from_pcm_format(proxy_get_format(proxy));
384 return format;
385 }
386
out_set_format(struct audio_stream * stream,audio_format_t format)387 static int out_set_format(struct audio_stream *stream, audio_format_t format)
388 {
389 return 0;
390 }
391
out_standby(struct audio_stream * stream)392 static int out_standby(struct audio_stream *stream)
393 {
394 struct stream_out *out = (struct stream_out *)stream;
395 lock_output_stream(out);
396 if (!out->standby) {
397 pthread_mutex_lock(&out->dev->lock);
398 proxy_close(&out->proxy);
399 pthread_mutex_unlock(&out->dev->lock);
400 out->standby = true;
401 }
402 pthread_mutex_unlock(&out->lock);
403
404 return 0;
405 }
406
out_dump(const struct audio_stream * stream,int fd)407 static int out_dump(const struct audio_stream *stream, int fd)
408 {
409 return 0;
410 }
411
out_set_parameters(struct audio_stream * stream,const char * kvpairs)412 static int out_set_parameters(struct audio_stream *stream, const char *kvpairs)
413 {
414 ALOGV("out_set_parameters() keys:%s", kvpairs);
415
416 struct stream_out *out = (struct stream_out *)stream;
417
418 int routing = 0;
419 int ret_value = 0;
420 int card = -1;
421 int device = -1;
422
423 if (!parse_card_device_params(true, &card, &device)) {
424 // nothing to do
425 return ret_value;
426 }
427
428 lock_output_stream(out);
429 /* Lock the device because that is where the profile lives */
430 pthread_mutex_lock(&out->dev->lock);
431
432 if (!profile_is_cached_for(out->profile, card, device)) {
433 /* cannot read pcm device info if playback is active */
434 if (!out->standby)
435 ret_value = -ENOSYS;
436 else {
437 int saved_card = out->profile->card;
438 int saved_device = out->profile->device;
439 out->profile->card = card;
440 out->profile->device = device;
441 ret_value = profile_read_device_info(out->profile) ? 0 : -EINVAL;
442 if (ret_value != 0) {
443 out->profile->card = saved_card;
444 out->profile->device = saved_device;
445 }
446 }
447 }
448
449 pthread_mutex_unlock(&out->dev->lock);
450 pthread_mutex_unlock(&out->lock);
451
452 return ret_value;
453 }
454
out_get_parameters(const struct audio_stream * stream,const char * keys)455 static char * out_get_parameters(const struct audio_stream *stream, const char *keys)
456 {
457 struct stream_out *out = (struct stream_out *)stream;
458 lock_output_stream(out);
459 pthread_mutex_lock(&out->dev->lock);
460
461 char * params_str = device_get_parameters(out->profile, keys);
462
463 pthread_mutex_unlock(&out->lock);
464 pthread_mutex_unlock(&out->dev->lock);
465
466 return params_str;
467 }
468
out_get_latency(const struct audio_stream_out * stream)469 static uint32_t out_get_latency(const struct audio_stream_out *stream)
470 {
471 alsa_device_proxy * proxy = &((struct stream_out*)stream)->proxy;
472 return proxy_get_latency(proxy);
473 }
474
out_set_volume(struct audio_stream_out * stream,float left,float right)475 static int out_set_volume(struct audio_stream_out *stream, float left, float right)
476 {
477 return -ENOSYS;
478 }
479
480 /* must be called with hw device and output stream mutexes locked */
start_output_stream(struct stream_out * out)481 static int start_output_stream(struct stream_out *out)
482 {
483 ALOGV("start_output_stream(card:%d device:%d)", out->profile->card, out->profile->device);
484
485 return proxy_open(&out->proxy);
486 }
487
out_write(struct audio_stream_out * stream,const void * buffer,size_t bytes)488 static ssize_t out_write(struct audio_stream_out *stream, const void* buffer, size_t bytes)
489 {
490 int ret;
491 struct stream_out *out = (struct stream_out *)stream;
492
493 lock_output_stream(out);
494 if (out->standby) {
495 pthread_mutex_lock(&out->dev->lock);
496 ret = start_output_stream(out);
497 pthread_mutex_unlock(&out->dev->lock);
498 if (ret != 0) {
499 goto err;
500 }
501 out->standby = false;
502 }
503
504 alsa_device_proxy* proxy = &out->proxy;
505 const void * write_buff = buffer;
506 int num_write_buff_bytes = bytes;
507 const int num_device_channels = proxy_get_channel_count(proxy); /* what we told alsa */
508 const int num_req_channels = out->hal_channel_count; /* what we told AudioFlinger */
509 if (num_device_channels != num_req_channels) {
510 /* allocate buffer */
511 const size_t required_conversion_buffer_size =
512 bytes * num_device_channels / num_req_channels;
513 if (required_conversion_buffer_size > out->conversion_buffer_size) {
514 out->conversion_buffer_size = required_conversion_buffer_size;
515 out->conversion_buffer = realloc(out->conversion_buffer,
516 out->conversion_buffer_size);
517 }
518 /* convert data */
519 const audio_format_t audio_format = out_get_format(&(out->stream.common));
520 const unsigned sample_size_in_bytes = audio_bytes_per_sample(audio_format);
521 num_write_buff_bytes =
522 adjust_channels(write_buff, num_req_channels,
523 out->conversion_buffer, num_device_channels,
524 sample_size_in_bytes, num_write_buff_bytes);
525 write_buff = out->conversion_buffer;
526 }
527
528 if (write_buff != NULL && num_write_buff_bytes != 0) {
529 proxy_write(&out->proxy, write_buff, num_write_buff_bytes);
530 }
531
532 pthread_mutex_unlock(&out->lock);
533
534 return bytes;
535
536 err:
537 pthread_mutex_unlock(&out->lock);
538 if (ret != 0) {
539 usleep(bytes * 1000000 / audio_stream_out_frame_size(stream) /
540 out_get_sample_rate(&stream->common));
541 }
542
543 return bytes;
544 }
545
out_get_render_position(const struct audio_stream_out * stream,uint32_t * dsp_frames)546 static int out_get_render_position(const struct audio_stream_out *stream, uint32_t *dsp_frames)
547 {
548 return -EINVAL;
549 }
550
out_get_presentation_position(const struct audio_stream_out * stream,uint64_t * frames,struct timespec * timestamp)551 static int out_get_presentation_position(const struct audio_stream_out *stream,
552 uint64_t *frames, struct timespec *timestamp)
553 {
554 struct stream_out *out = (struct stream_out *)stream; // discard const qualifier
555 lock_output_stream(out);
556
557 const alsa_device_proxy *proxy = &out->proxy;
558 const int ret = proxy_get_presentation_position(proxy, frames, timestamp);
559
560 pthread_mutex_unlock(&out->lock);
561 ALOGV("out_get_presentation_position() status:%d frames:%llu",
562 ret, (unsigned long long)*frames);
563 return ret;
564 }
565
out_add_audio_effect(const struct audio_stream * stream,effect_handle_t effect)566 static int out_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
567 {
568 return 0;
569 }
570
out_remove_audio_effect(const struct audio_stream * stream,effect_handle_t effect)571 static int out_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
572 {
573 return 0;
574 }
575
out_get_next_write_timestamp(const struct audio_stream_out * stream,int64_t * timestamp)576 static int out_get_next_write_timestamp(const struct audio_stream_out *stream, int64_t *timestamp)
577 {
578 return -EINVAL;
579 }
580
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)581 static int adev_open_output_stream(struct audio_hw_device *dev,
582 audio_io_handle_t handle,
583 audio_devices_t devices,
584 audio_output_flags_t flags,
585 struct audio_config *config,
586 struct audio_stream_out **stream_out,
587 const char *address /*__unused*/)
588 {
589 ALOGV("adev_open_output_stream() handle:0x%X, device:0x%X, flags:0x%X, addr:%s",
590 handle, devices, flags, address);
591
592 struct audio_device *adev = (struct audio_device *)dev;
593
594 struct stream_out *out;
595 out = (struct stream_out *)calloc(1, sizeof(struct stream_out));
596 if (!out)
597 return -ENOMEM;
598
599 /* setup function pointers */
600 out->stream.common.get_sample_rate = out_get_sample_rate;
601 out->stream.common.set_sample_rate = out_set_sample_rate;
602 out->stream.common.get_buffer_size = out_get_buffer_size;
603 out->stream.common.get_channels = out_get_channels;
604 out->stream.common.get_format = out_get_format;
605 out->stream.common.set_format = out_set_format;
606 out->stream.common.standby = out_standby;
607 out->stream.common.dump = out_dump;
608 out->stream.common.set_parameters = out_set_parameters;
609 out->stream.common.get_parameters = out_get_parameters;
610 out->stream.common.add_audio_effect = out_add_audio_effect;
611 out->stream.common.remove_audio_effect = out_remove_audio_effect;
612 out->stream.get_latency = out_get_latency;
613 out->stream.set_volume = out_set_volume;
614 out->stream.write = out_write;
615 out->stream.get_render_position = out_get_render_position;
616 out->stream.get_presentation_position = out_get_presentation_position;
617 out->stream.get_next_write_timestamp = out_get_next_write_timestamp;
618
619 pthread_mutex_init(&out->lock, (const pthread_mutexattr_t *) NULL);
620 pthread_mutex_init(&out->pre_lock, (const pthread_mutexattr_t *) NULL);
621
622 out->dev = adev;
623 pthread_mutex_lock(&adev->lock);
624 out->profile = &adev->out_profile;
625
626 // build this to hand to the alsa_device_proxy
627 struct pcm_config proxy_config;
628 memset(&proxy_config, 0, sizeof(proxy_config));
629
630 /* Pull out the card/device pair */
631 parse_card_device_params(true, &(out->profile->card), &(out->profile->device));
632
633 profile_read_device_info(out->profile);
634
635 pthread_mutex_unlock(&adev->lock);
636
637 int ret = 0;
638
639 /* Rate */
640 if (config->sample_rate == 0) {
641 proxy_config.rate = config->sample_rate = profile_get_default_sample_rate(out->profile);
642 } else if (profile_is_sample_rate_valid(out->profile, config->sample_rate)) {
643 proxy_config.rate = config->sample_rate;
644 } else {
645 ALOGE("%s: The requested sample rate (%d) is not valid", __func__, config->sample_rate);
646 proxy_config.rate = config->sample_rate = profile_get_default_sample_rate(out->profile);
647 ret = -EINVAL;
648 }
649
650 /* Format */
651 if (config->format == AUDIO_FORMAT_DEFAULT) {
652 proxy_config.format = profile_get_default_format(out->profile);
653 config->format = audio_format_from_pcm_format(proxy_config.format);
654 } else {
655 enum pcm_format fmt = pcm_format_from_audio_format(config->format);
656 if (profile_is_format_valid(out->profile, fmt)) {
657 proxy_config.format = fmt;
658 } else {
659 ALOGE("%s: The requested format (0x%x) is not valid", __func__, config->format);
660 proxy_config.format = profile_get_default_format(out->profile);
661 config->format = audio_format_from_pcm_format(proxy_config.format);
662 ret = -EINVAL;
663 }
664 }
665
666 /* Channels */
667 unsigned proposed_channel_count = 0;
668 if (k_force_channels) {
669 proposed_channel_count = k_force_channels;
670 } else if (config->channel_mask == AUDIO_CHANNEL_NONE) {
671 proposed_channel_count = profile_get_default_channel_count(out->profile);
672 }
673 if (proposed_channel_count != 0) {
674 if (proposed_channel_count <= FCC_2) {
675 // use channel position mask for mono and stereo
676 config->channel_mask = audio_channel_out_mask_from_count(proposed_channel_count);
677 } else {
678 // use channel index mask for multichannel
679 config->channel_mask =
680 audio_channel_mask_for_index_assignment_from_count(proposed_channel_count);
681 }
682 out->hal_channel_count = proposed_channel_count;
683 } else {
684 out->hal_channel_count = audio_channel_count_from_out_mask(config->channel_mask);
685 }
686 /* we can expose any channel mask, and emulate internally based on channel count. */
687 out->hal_channel_mask = config->channel_mask;
688
689 /* no validity checks are needed as proxy_prepare() forces channel_count to be valid.
690 * and we emulate any channel count discrepancies in out_write(). */
691 proxy_config.channels = proposed_channel_count;
692
693 proxy_prepare(&out->proxy, out->profile, &proxy_config);
694
695 /* TODO The retry mechanism isn't implemented in AudioPolicyManager/AudioFlinger. */
696 ret = 0;
697
698 out->conversion_buffer = NULL;
699 out->conversion_buffer_size = 0;
700
701 out->standby = true;
702
703 *stream_out = &out->stream;
704
705 return ret;
706
707 err_open:
708 free(out);
709 *stream_out = NULL;
710 return -ENOSYS;
711 }
712
adev_close_output_stream(struct audio_hw_device * dev,struct audio_stream_out * stream)713 static void adev_close_output_stream(struct audio_hw_device *dev,
714 struct audio_stream_out *stream)
715 {
716 struct stream_out *out = (struct stream_out *)stream;
717 ALOGV("adev_close_output_stream(c:%d d:%d)", out->profile->card, out->profile->device);
718 /* Close the pcm device */
719 out_standby(&stream->common);
720
721 free(out->conversion_buffer);
722
723 out->conversion_buffer = NULL;
724 out->conversion_buffer_size = 0;
725
726 free(stream);
727 }
728
adev_get_input_buffer_size(const struct audio_hw_device * dev,const struct audio_config * config)729 static size_t adev_get_input_buffer_size(const struct audio_hw_device *dev,
730 const struct audio_config *config)
731 {
732 /* TODO This needs to be calculated based on format/channels/rate */
733 return 320;
734 }
735
736 /*
737 * IN functions
738 */
in_get_sample_rate(const struct audio_stream * stream)739 static uint32_t in_get_sample_rate(const struct audio_stream *stream)
740 {
741 uint32_t rate = proxy_get_sample_rate(&((const struct stream_in *)stream)->proxy);
742 ALOGV("in_get_sample_rate() = %d", rate);
743 return rate;
744 }
745
in_set_sample_rate(struct audio_stream * stream,uint32_t rate)746 static int in_set_sample_rate(struct audio_stream *stream, uint32_t rate)
747 {
748 ALOGV("in_set_sample_rate(%d) - NOPE", rate);
749 return -ENOSYS;
750 }
751
in_get_buffer_size(const struct audio_stream * stream)752 static size_t in_get_buffer_size(const struct audio_stream *stream)
753 {
754 const struct stream_in * in = ((const struct stream_in*)stream);
755 return proxy_get_period_size(&in->proxy) * audio_stream_in_frame_size(&(in->stream));
756 }
757
in_get_channels(const struct audio_stream * stream)758 static uint32_t in_get_channels(const struct audio_stream *stream)
759 {
760 const struct stream_in *in = (const struct stream_in*)stream;
761 return in->hal_channel_mask;
762 }
763
in_get_format(const struct audio_stream * stream)764 static audio_format_t in_get_format(const struct audio_stream *stream)
765 {
766 alsa_device_proxy *proxy = &((struct stream_in*)stream)->proxy;
767 audio_format_t format = audio_format_from_pcm_format(proxy_get_format(proxy));
768 return format;
769 }
770
in_set_format(struct audio_stream * stream,audio_format_t format)771 static int in_set_format(struct audio_stream *stream, audio_format_t format)
772 {
773 ALOGV("in_set_format(%d) - NOPE", format);
774
775 return -ENOSYS;
776 }
777
in_standby(struct audio_stream * stream)778 static int in_standby(struct audio_stream *stream)
779 {
780 struct stream_in *in = (struct stream_in *)stream;
781
782 lock_input_stream(in);
783 if (!in->standby) {
784 pthread_mutex_lock(&in->dev->lock);
785 proxy_close(&in->proxy);
786 pthread_mutex_unlock(&in->dev->lock);
787 in->standby = true;
788 }
789
790 pthread_mutex_unlock(&in->lock);
791
792 return 0;
793 }
794
in_dump(const struct audio_stream * stream,int fd)795 static int in_dump(const struct audio_stream *stream, int fd)
796 {
797 return 0;
798 }
799
in_set_parameters(struct audio_stream * stream,const char * kvpairs)800 static int in_set_parameters(struct audio_stream *stream, const char *kvpairs)
801 {
802 ALOGV("in_set_parameters() keys:%s", kvpairs);
803
804 struct stream_in *in = (struct stream_in *)stream;
805
806 char value[32];
807 int param_val;
808 int routing = 0;
809 int ret_value = 0;
810 int card = -1;
811 int device = -1;
812
813 if (!parse_card_device_params(false, &card, &device)) {
814 // nothing to do
815 return ret_value;
816 }
817
818 lock_input_stream(in);
819 pthread_mutex_lock(&in->dev->lock);
820
821 if (card >= 0 && device >= 0 && !profile_is_cached_for(in->profile, card, device)) {
822 /* cannot read pcm device info if playback is active */
823 if (!in->standby)
824 ret_value = -ENOSYS;
825 else {
826 int saved_card = in->profile->card;
827 int saved_device = in->profile->device;
828 in->profile->card = card;
829 in->profile->device = device;
830 ret_value = profile_read_device_info(in->profile) ? 0 : -EINVAL;
831 if (ret_value != 0) {
832 in->profile->card = saved_card;
833 in->profile->device = saved_device;
834 }
835 }
836 }
837
838 pthread_mutex_unlock(&in->dev->lock);
839 pthread_mutex_unlock(&in->lock);
840
841 return ret_value;
842 }
843
in_get_parameters(const struct audio_stream * stream,const char * keys)844 static char * in_get_parameters(const struct audio_stream *stream, const char *keys)
845 {
846 struct stream_in *in = (struct stream_in *)stream;
847
848 lock_input_stream(in);
849 pthread_mutex_lock(&in->dev->lock);
850
851 char * params_str = device_get_parameters(in->profile, keys);
852
853 pthread_mutex_unlock(&in->dev->lock);
854 pthread_mutex_unlock(&in->lock);
855
856 return params_str;
857 }
858
in_add_audio_effect(const struct audio_stream * stream,effect_handle_t effect)859 static int in_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
860 {
861 return 0;
862 }
863
in_remove_audio_effect(const struct audio_stream * stream,effect_handle_t effect)864 static int in_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
865 {
866 return 0;
867 }
868
in_set_gain(struct audio_stream_in * stream,float gain)869 static int in_set_gain(struct audio_stream_in *stream, float gain)
870 {
871 return 0;
872 }
873
874 /* must be called with hw device and output stream mutexes locked */
start_input_stream(struct stream_in * in)875 static int start_input_stream(struct stream_in *in)
876 {
877 ALOGV("ustart_input_stream(card:%d device:%d)", in->profile->card, in->profile->device);
878
879 return proxy_open(&in->proxy);
880 }
881
882 /* TODO mutex stuff here (see out_write) */
in_read(struct audio_stream_in * stream,void * buffer,size_t bytes)883 static ssize_t in_read(struct audio_stream_in *stream, void* buffer, size_t bytes)
884 {
885 size_t num_read_buff_bytes = 0;
886 void * read_buff = buffer;
887 void * out_buff = buffer;
888 int ret = 0;
889
890 struct stream_in * in = (struct stream_in *)stream;
891
892 lock_input_stream(in);
893 if (in->standby) {
894 pthread_mutex_lock(&in->dev->lock);
895 ret = start_input_stream(in);
896 pthread_mutex_unlock(&in->dev->lock);
897 if (ret != 0) {
898 goto err;
899 }
900 in->standby = false;
901 }
902
903 alsa_device_profile * profile = in->profile;
904
905 /*
906 * OK, we need to figure out how much data to read to be able to output the requested
907 * number of bytes in the HAL format (16-bit, stereo).
908 */
909 num_read_buff_bytes = bytes;
910 int num_device_channels = proxy_get_channel_count(&in->proxy); /* what we told Alsa */
911 int num_req_channels = in->hal_channel_count; /* what we told AudioFlinger */
912
913 if (num_device_channels != num_req_channels) {
914 num_read_buff_bytes = (num_device_channels * num_read_buff_bytes) / num_req_channels;
915 }
916
917 /* Setup/Realloc the conversion buffer (if necessary). */
918 if (num_read_buff_bytes != bytes) {
919 if (num_read_buff_bytes > in->conversion_buffer_size) {
920 /*TODO Remove this when AudioPolicyManger/AudioFlinger support arbitrary formats
921 (and do these conversions themselves) */
922 in->conversion_buffer_size = num_read_buff_bytes;
923 in->conversion_buffer = realloc(in->conversion_buffer, in->conversion_buffer_size);
924 }
925 read_buff = in->conversion_buffer;
926 }
927
928 ret = proxy_read(&in->proxy, read_buff, num_read_buff_bytes);
929 if (ret == 0) {
930 if (num_device_channels != num_req_channels) {
931 // ALOGV("chans dev:%d req:%d", num_device_channels, num_req_channels);
932
933 out_buff = buffer;
934 /* Num Channels conversion */
935 if (num_device_channels != num_req_channels) {
936 audio_format_t audio_format = in_get_format(&(in->stream.common));
937 unsigned sample_size_in_bytes = audio_bytes_per_sample(audio_format);
938
939 num_read_buff_bytes =
940 adjust_channels(read_buff, num_device_channels,
941 out_buff, num_req_channels,
942 sample_size_in_bytes, num_read_buff_bytes);
943 }
944 }
945
946 /* no need to acquire in->dev->lock to read mic_muted here as we don't change its state */
947 if (num_read_buff_bytes > 0 && in->dev->mic_muted)
948 memset(buffer, 0, num_read_buff_bytes);
949 } else {
950 num_read_buff_bytes = 0; // reset the value after USB headset is unplugged
951 }
952
953 err:
954 pthread_mutex_unlock(&in->lock);
955
956 return num_read_buff_bytes;
957 }
958
in_get_input_frames_lost(struct audio_stream_in * stream)959 static uint32_t in_get_input_frames_lost(struct audio_stream_in *stream)
960 {
961 return 0;
962 }
963
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 __unused,const char * address,audio_source_t source __unused)964 static int adev_open_input_stream(struct audio_hw_device *dev,
965 audio_io_handle_t handle,
966 audio_devices_t devices,
967 struct audio_config *config,
968 struct audio_stream_in **stream_in,
969 audio_input_flags_t flags __unused,
970 const char *address /*__unused*/,
971 audio_source_t source __unused)
972 {
973 ALOGV("in adev_open_input_stream() rate:%" PRIu32 ", chanMask:0x%" PRIX32 ", fmt:%" PRIu8,
974 config->sample_rate, config->channel_mask, config->format);
975
976 struct stream_in *in = (struct stream_in *)calloc(1, sizeof(struct stream_in));
977 int ret = 0;
978
979 if (in == NULL)
980 return -ENOMEM;
981
982 /* setup function pointers */
983 in->stream.common.get_sample_rate = in_get_sample_rate;
984 in->stream.common.set_sample_rate = in_set_sample_rate;
985 in->stream.common.get_buffer_size = in_get_buffer_size;
986 in->stream.common.get_channels = in_get_channels;
987 in->stream.common.get_format = in_get_format;
988 in->stream.common.set_format = in_set_format;
989 in->stream.common.standby = in_standby;
990 in->stream.common.dump = in_dump;
991 in->stream.common.set_parameters = in_set_parameters;
992 in->stream.common.get_parameters = in_get_parameters;
993 in->stream.common.add_audio_effect = in_add_audio_effect;
994 in->stream.common.remove_audio_effect = in_remove_audio_effect;
995
996 in->stream.set_gain = in_set_gain;
997 in->stream.read = in_read;
998 in->stream.get_input_frames_lost = in_get_input_frames_lost;
999
1000 pthread_mutex_init(&in->lock, (const pthread_mutexattr_t *) NULL);
1001 pthread_mutex_init(&in->pre_lock, (const pthread_mutexattr_t *) NULL);
1002
1003 in->dev = (struct audio_device *)dev;
1004 pthread_mutex_lock(&in->dev->lock);
1005
1006 in->profile = &in->dev->in_profile;
1007
1008 struct pcm_config proxy_config;
1009 memset(&proxy_config, 0, sizeof(proxy_config));
1010
1011 /* Pull out the card/device pair */
1012 parse_card_device_params(false, &(in->profile->card), &(in->profile->device));
1013
1014 profile_read_device_info(in->profile);
1015 pthread_mutex_unlock(&in->dev->lock);
1016
1017 /* Rate */
1018 if (config->sample_rate == 0) {
1019 proxy_config.rate = config->sample_rate = profile_get_default_sample_rate(in->profile);
1020 } else if (profile_is_sample_rate_valid(in->profile, config->sample_rate)) {
1021 proxy_config.rate = config->sample_rate;
1022 } else {
1023 ALOGE("%s: The requested sample rate (%d) is not valid", __func__, config->sample_rate);
1024 proxy_config.rate = config->sample_rate = profile_get_default_sample_rate(in->profile);
1025 ret = -EINVAL;
1026 }
1027
1028 /* Format */
1029 if (config->format == AUDIO_FORMAT_DEFAULT) {
1030 proxy_config.format = profile_get_default_format(in->profile);
1031 config->format = audio_format_from_pcm_format(proxy_config.format);
1032 } else {
1033 enum pcm_format fmt = pcm_format_from_audio_format(config->format);
1034 if (profile_is_format_valid(in->profile, fmt)) {
1035 proxy_config.format = fmt;
1036 } else {
1037 ALOGE("%s: The requested format (0x%x) is not valid", __func__, config->format);
1038 proxy_config.format = profile_get_default_format(in->profile);
1039 config->format = audio_format_from_pcm_format(proxy_config.format);
1040 ret = -EINVAL;
1041 }
1042 }
1043
1044 /* Channels */
1045 unsigned proposed_channel_count = 0;
1046 if (k_force_channels) {
1047 proposed_channel_count = k_force_channels;
1048 } else if (config->channel_mask == AUDIO_CHANNEL_NONE) {
1049 proposed_channel_count = profile_get_default_channel_count(in->profile);
1050 }
1051 if (proposed_channel_count != 0) {
1052 config->channel_mask = audio_channel_in_mask_from_count(proposed_channel_count);
1053 if (config->channel_mask == AUDIO_CHANNEL_INVALID)
1054 config->channel_mask =
1055 audio_channel_mask_for_index_assignment_from_count(proposed_channel_count);
1056 in->hal_channel_count = proposed_channel_count;
1057 } else {
1058 in->hal_channel_count = audio_channel_count_from_in_mask(config->channel_mask);
1059 }
1060 /* we can expose any channel mask, and emulate internally based on channel count. */
1061 in->hal_channel_mask = config->channel_mask;
1062
1063 proxy_config.channels = profile_get_default_channel_count(in->profile);
1064 proxy_prepare(&in->proxy, in->profile, &proxy_config);
1065
1066 in->standby = true;
1067
1068 in->conversion_buffer = NULL;
1069 in->conversion_buffer_size = 0;
1070
1071 *stream_in = &in->stream;
1072
1073 return ret;
1074 }
1075
adev_close_input_stream(struct audio_hw_device * dev,struct audio_stream_in * stream)1076 static void adev_close_input_stream(struct audio_hw_device *dev, struct audio_stream_in *stream)
1077 {
1078 struct stream_in *in = (struct stream_in *)stream;
1079
1080 /* Close the pcm device */
1081 in_standby(&stream->common);
1082
1083 free(in->conversion_buffer);
1084
1085 free(stream);
1086 }
1087
1088 /*
1089 * ADEV Functions
1090 */
adev_set_parameters(struct audio_hw_device * dev,const char * kvpairs)1091 static int adev_set_parameters(struct audio_hw_device *dev, const char *kvpairs)
1092 {
1093 return 0;
1094 }
1095
adev_get_parameters(const struct audio_hw_device * dev,const char * keys)1096 static char * adev_get_parameters(const struct audio_hw_device *dev, const char *keys)
1097 {
1098 return strdup("");
1099 }
1100
adev_init_check(const struct audio_hw_device * dev)1101 static int adev_init_check(const struct audio_hw_device *dev)
1102 {
1103 return 0;
1104 }
1105
adev_set_voice_volume(struct audio_hw_device * dev,float volume)1106 static int adev_set_voice_volume(struct audio_hw_device *dev, float volume)
1107 {
1108 return -ENOSYS;
1109 }
1110
adev_set_master_volume(struct audio_hw_device * dev,float volume)1111 static int adev_set_master_volume(struct audio_hw_device *dev, float volume)
1112 {
1113 #if TARGET_AUDIO_PRIMARY
1114 struct mixer *mixer;
1115 struct mixer_ctl *ctl;
1116 struct audio_device * adev = (struct audio_device *)dev;
1117
1118 if ((0 > volume) || (1 < volume) || (NULL == adev))
1119 return -EINVAL;
1120
1121 pthread_mutex_lock(&adev->lock);
1122 adev->master_volume = (int)(volume*100);
1123
1124 if (!(mixer = mixer_open(1))) {
1125 pthread_mutex_unlock(&adev->lock);
1126 return -ENOSYS;
1127 }
1128
1129 ctl = mixer_get_ctl(mixer,29);
1130 mixer_ctl_set_value(ctl,0,adev->master_volume);
1131 mixer_close(mixer);
1132 pthread_mutex_unlock(&adev->lock);
1133 return 0;
1134 #else
1135 return -ENOSYS;
1136 #endif
1137 }
1138
adev_set_mode(struct audio_hw_device * dev,audio_mode_t mode)1139 static int adev_set_mode(struct audio_hw_device *dev, audio_mode_t mode)
1140 {
1141 return 0;
1142 }
1143
adev_set_mic_mute(struct audio_hw_device * dev,bool state)1144 static int adev_set_mic_mute(struct audio_hw_device *dev, bool state)
1145 {
1146 struct audio_device * adev = (struct audio_device *)dev;
1147 pthread_mutex_lock(&adev->lock);
1148 adev->mic_muted = state;
1149 pthread_mutex_unlock(&adev->lock);
1150 return -ENOSYS;
1151 }
1152
adev_get_mic_mute(const struct audio_hw_device * dev,bool * state)1153 static int adev_get_mic_mute(const struct audio_hw_device *dev, bool *state)
1154 {
1155 return -ENOSYS;
1156 }
1157
adev_dump(const audio_hw_device_t * device,int fd)1158 static int adev_dump(const audio_hw_device_t *device, int fd)
1159 {
1160 return 0;
1161 }
1162
adev_close(hw_device_t * device)1163 static int adev_close(hw_device_t *device)
1164 {
1165 struct audio_device *adev = (struct audio_device *)device;
1166 free(device);
1167
1168 return 0;
1169 }
1170
adev_open(const hw_module_t * module,const char * name,hw_device_t ** device)1171 static int adev_open(const hw_module_t* module, const char* name, hw_device_t** device)
1172 {
1173 #if TARGET_AUDIO_PRIMARY
1174 struct mixer *mixer;
1175 struct mixer_ctl *ctl;
1176 #endif
1177 if (strcmp(name, AUDIO_HARDWARE_INTERFACE) != 0)
1178 return -EINVAL;
1179
1180 struct audio_device *adev = calloc(1, sizeof(struct audio_device));
1181 if (!adev)
1182 return -ENOMEM;
1183
1184 profile_init(&adev->out_profile, PCM_OUT);
1185 profile_init(&adev->in_profile, PCM_IN);
1186
1187 adev->hw_device.common.tag = HARDWARE_DEVICE_TAG;
1188 adev->hw_device.common.version = AUDIO_DEVICE_API_VERSION_2_0;
1189 adev->hw_device.common.module = (struct hw_module_t *)module;
1190 adev->hw_device.common.close = adev_close;
1191
1192 adev->hw_device.init_check = adev_init_check;
1193 adev->hw_device.set_voice_volume = adev_set_voice_volume;
1194 adev->hw_device.set_master_volume = adev_set_master_volume;
1195 adev->hw_device.set_mode = adev_set_mode;
1196 adev->hw_device.set_mic_mute = adev_set_mic_mute;
1197 adev->hw_device.get_mic_mute = adev_get_mic_mute;
1198 adev->hw_device.set_parameters = adev_set_parameters;
1199 adev->hw_device.get_parameters = adev_get_parameters;
1200 adev->hw_device.get_input_buffer_size = adev_get_input_buffer_size;
1201 adev->hw_device.open_output_stream = adev_open_output_stream;
1202 adev->hw_device.close_output_stream = adev_close_output_stream;
1203 adev->hw_device.open_input_stream = adev_open_input_stream;
1204 adev->hw_device.close_input_stream = adev_close_input_stream;
1205 adev->hw_device.dump = adev_dump;
1206
1207 *device = &adev->hw_device.common;
1208 #if TARGET_AUDIO_PRIMARY
1209 mixer = mixer_open(1);
1210
1211 if (mixer) {
1212 /* turning on master volume */
1213 ctl = mixer_get_ctl(mixer,30);
1214 mixer_ctl_set_value(ctl,0,1);
1215
1216 /* setting master volume to value 50 */
1217 ctl = mixer_get_ctl(mixer,29);
1218 adev->master_volume = 50;
1219 mixer_ctl_set_value(ctl,0,adev->master_volume);
1220 mixer_close(mixer);
1221 }
1222 #endif
1223 return 0;
1224 }
1225
1226 static struct hw_module_methods_t hal_module_methods = {
1227 .open = adev_open,
1228 };
1229
1230 struct audio_module HAL_MODULE_INFO_SYM = {
1231 .common = {
1232 .tag = HARDWARE_MODULE_TAG,
1233 .module_api_version = AUDIO_MODULE_API_VERSION_0_1,
1234 .hal_api_version = HARDWARE_HAL_API_VERSION,
1235 .id = AUDIO_HARDWARE_MODULE_ID,
1236 .name = "audio HW HAL",
1237 .author = "The Android Open Source Project",
1238 .methods = &hal_module_methods,
1239 },
1240 };
1241