1 /* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2 * Use of this source code is governed by a BSD-style license that can be
3 * found in the LICENSE file.
4 */
5
6 #include <alsa/asoundlib.h>
7 #include <errno.h>
8 #include <limits.h>
9 #include <stdio.h>
10 #include <sys/param.h>
11 #include <sys/select.h>
12 #include <sys/socket.h>
13 #include <sys/time.h>
14 #include <syslog.h>
15 #include <time.h>
16
17 #include "audio_thread.h"
18 #include "cras_alsa_helpers.h"
19 #include "cras_alsa_io.h"
20 #include "cras_alsa_jack.h"
21 #include "cras_alsa_mixer.h"
22 #include "cras_alsa_ucm.h"
23 #include "cras_audio_area.h"
24 #include "cras_config.h"
25 #include "cras_utf8.h"
26 #include "cras_hotword_handler.h"
27 #include "cras_iodev.h"
28 #include "cras_iodev_list.h"
29 #include "cras_messages.h"
30 #include "cras_ramp.h"
31 #include "cras_rclient.h"
32 #include "cras_shm.h"
33 #include "cras_system_state.h"
34 #include "cras_types.h"
35 #include "cras_util.h"
36 #include "cras_volume_curve.h"
37 #include "sfh.h"
38 #include "softvol_curve.h"
39 #include "utlist.h"
40
41 #define HOTWORD_DEV "Wake on Voice"
42 #define DEFAULT "(default)"
43 #define HDMI "HDMI"
44 #define INTERNAL_MICROPHONE "Internal Mic"
45 #define INTERNAL_SPEAKER "Speaker"
46 #define KEYBOARD_MIC "Keyboard Mic"
47 #define HEADPHONE "Headphone"
48 #define MIC "Mic"
49 #define USB "USB"
50 #define LOOPBACK_CAPTURE "Loopback Capture"
51 #define LOOPBACK_PLAYBACK "Loopback Playback"
52
53 /*
54 * For USB, pad the output buffer. This avoids a situation where there isn't a
55 * complete URB's worth of audio ready to be transmitted when it is requested.
56 * The URB interval does track directly to the audio clock, making it hard to
57 * predict the exact interval.
58 */
59 #define USB_EXTRA_BUFFER_FRAMES 768
60
61 /*
62 * When snd_pcm_avail returns a value that is greater than buffer size,
63 * we know there is an underrun. If the number of underrun samples
64 * (avail - buffer_size) is greater than SEVERE_UNDERRUN_MS * rate,
65 * it is a severe underrun. Main thread should disable and then enable
66 * device to recover it from underrun.
67 */
68 #define SEVERE_UNDERRUN_MS 5000
69
70 /*
71 * When entering no stream state, audio thread needs to fill extra zeros in
72 * order to play remaining valid frames. The value indicates how many
73 * time will be filled.
74 */
75 static const struct timespec no_stream_fill_zeros_duration = {
76 0, 50 * 1000 * 1000 /* 50 msec. */
77 };
78
79 /*
80 * This extends cras_ionode to include alsa-specific information.
81 * Members:
82 * mixer_output - From cras_alsa_mixer.
83 * pcm_name - PCM name for snd_pcm_open.
84 * volume_curve - Volume curve for this node.
85 * jack - The jack associated with the node.
86 */
87 struct alsa_output_node {
88 struct cras_ionode base;
89 struct mixer_control *mixer_output;
90 const char *pcm_name;
91 struct cras_volume_curve *volume_curve;
92 const struct cras_alsa_jack *jack;
93 };
94
95 struct alsa_input_node {
96 struct cras_ionode base;
97 struct mixer_control *mixer_input;
98 const char *pcm_name;
99 const struct cras_alsa_jack *jack;
100 int8_t *channel_layout;
101 };
102
103 /*
104 * Child of cras_iodev, alsa_io handles ALSA interaction for sound devices.
105 * base - The cras_iodev structure "base class".
106 * pcm_name - The PCM name passed to snd_pcm_open() (e.g. "hw:0,0").
107 * dev_name - value from snd_pcm_info_get_name
108 * dev_id - value from snd_pcm_info_get_id
109 * device_index - ALSA index of device, Y in "hw:X:Y".
110 * next_ionode_index - The index we will give to the next ionode. Each ionode
111 * have a unique index within the iodev.
112 * card_type - the type of the card this iodev belongs.
113 * is_first - true if this is the first iodev on the card.
114 * fully_specified - true if this device and it's nodes were fully specified.
115 * That is, don't automatically create nodes for it.
116 * handle - Handle to the opened ALSA device.
117 * num_severe_underruns - Number of times we have run out of data badly.
118 Unlike num_underruns which records for the duration
119 where device is opened, num_severe_underruns records
120 since device is created. When severe underrun occurs
121 a possible action is to close/open device.
122 * alsa_stream - Playback or capture type.
123 * mixer - Alsa mixer used to control volume and mute of the device.
124 * config - Card config for this alsa device.
125 * jack_list - List of alsa jack controls for this device.
126 * ucm - CRAS use case manager, if configuration is found.
127 * mmap_offset - offset returned from mmap_begin.
128 * poll_fd - Descriptor used to block until data is ready.
129 * dma_period_set_microsecs - If non-zero, the value to apply to the dma_period.
130 * free_running - true if device is playing zeros in the buffer without
131 * user filling meaningful data. The device buffer is filled
132 * with zeros. In this state, appl_ptr remains the same
133 * while hw_ptr keeps running ahead.
134 * filled_zeros_for_draining - The number of zeros filled for draining.
135 * severe_underrun_frames - The threshold for severe underrun.
136 * default_volume_curve - Default volume curve that converts from an index
137 * to dBFS.
138 * has_dependent_dev - true if this iodev has dependent device.
139 */
140 struct alsa_io {
141 struct cras_iodev base;
142 char *pcm_name;
143 char *dev_name;
144 char *dev_id;
145 uint32_t device_index;
146 uint32_t next_ionode_index;
147 enum CRAS_ALSA_CARD_TYPE card_type;
148 int is_first;
149 int fully_specified;
150 snd_pcm_t *handle;
151 unsigned int num_severe_underruns;
152 snd_pcm_stream_t alsa_stream;
153 struct cras_alsa_mixer *mixer;
154 const struct cras_card_config *config;
155 struct cras_alsa_jack_list *jack_list;
156 struct cras_use_case_mgr *ucm;
157 snd_pcm_uframes_t mmap_offset;
158 int poll_fd;
159 unsigned int dma_period_set_microsecs;
160 int free_running;
161 unsigned int filled_zeros_for_draining;
162 snd_pcm_uframes_t severe_underrun_frames;
163 struct cras_volume_curve *default_volume_curve;
164 int hwparams_set;
165 int has_dependent_dev;
166 };
167
168 static void init_device_settings(struct alsa_io *aio);
169
170 static int alsa_iodev_set_active_node(struct cras_iodev *iodev,
171 struct cras_ionode *ionode,
172 unsigned dev_enabled);
173
174 static int get_fixed_rate(struct alsa_io *aio);
175
176 static int update_supported_formats(struct cras_iodev *iodev);
177
178 /*
179 * Defines the default values of nodes.
180 */
181 static const struct {
182 const char *name;
183 enum CRAS_NODE_TYPE type;
184 enum CRAS_NODE_POSITION position;
185 } node_defaults[] = {
186 {
187 .name = DEFAULT,
188 .type = CRAS_NODE_TYPE_UNKNOWN,
189 .position = NODE_POSITION_INTERNAL,
190 },
191 {
192 .name = INTERNAL_SPEAKER,
193 .type = CRAS_NODE_TYPE_INTERNAL_SPEAKER,
194 .position = NODE_POSITION_INTERNAL,
195 },
196 {
197 .name = INTERNAL_MICROPHONE,
198 .type = CRAS_NODE_TYPE_MIC,
199 .position = NODE_POSITION_INTERNAL,
200 },
201 {
202 .name = KEYBOARD_MIC,
203 .type = CRAS_NODE_TYPE_MIC,
204 .position = NODE_POSITION_KEYBOARD,
205 },
206 {
207 .name = HDMI,
208 .type = CRAS_NODE_TYPE_HDMI,
209 .position = NODE_POSITION_EXTERNAL,
210 },
211 {
212 .name = "IEC958",
213 .type = CRAS_NODE_TYPE_HDMI,
214 .position = NODE_POSITION_EXTERNAL,
215 },
216 {
217 .name = "Headphone",
218 .type = CRAS_NODE_TYPE_HEADPHONE,
219 .position = NODE_POSITION_EXTERNAL,
220 },
221 {
222 .name = "Front Headphone",
223 .type = CRAS_NODE_TYPE_HEADPHONE,
224 .position = NODE_POSITION_EXTERNAL,
225 },
226 {
227 .name = "Front Mic",
228 .type = CRAS_NODE_TYPE_MIC,
229 .position = NODE_POSITION_FRONT,
230 },
231 {
232 .name = "Rear Mic",
233 .type = CRAS_NODE_TYPE_MIC,
234 .position = NODE_POSITION_REAR,
235 },
236 {
237 .name = "Mic",
238 .type = CRAS_NODE_TYPE_MIC,
239 .position = NODE_POSITION_EXTERNAL,
240 },
241 {
242 .name = HOTWORD_DEV,
243 .type = CRAS_NODE_TYPE_HOTWORD,
244 .position = NODE_POSITION_INTERNAL,
245 },
246 {
247 .name = "Haptic",
248 .type = CRAS_NODE_TYPE_HAPTIC,
249 .position = NODE_POSITION_INTERNAL,
250 },
251 {
252 .name = "Rumbler",
253 .type = CRAS_NODE_TYPE_HAPTIC,
254 .position = NODE_POSITION_INTERNAL,
255 },
256 {
257 .name = "Line Out",
258 .type = CRAS_NODE_TYPE_LINEOUT,
259 .position = NODE_POSITION_EXTERNAL,
260 },
261 {
262 .name = "SCO Line In",
263 .type = CRAS_NODE_TYPE_BLUETOOTH,
264 .position = NODE_POSITION_EXTERNAL,
265 },
266 {
267 .name = "SCO Line Out",
268 .type = CRAS_NODE_TYPE_BLUETOOTH,
269 .position = NODE_POSITION_EXTERNAL,
270 },
271 {
272 .name = "Echo Reference",
273 .type = CRAS_NODE_TYPE_ECHO_REFERENCE,
274 .position = NODE_POSITION_INTERNAL,
275 },
276 {
277 .name = LOOPBACK_CAPTURE,
278 .type = CRAS_NODE_TYPE_ALSA_LOOPBACK,
279 .position = NODE_POSITION_INTERNAL,
280 },
281 {
282 .name = LOOPBACK_PLAYBACK,
283 .type = CRAS_NODE_TYPE_ALSA_LOOPBACK,
284 .position = NODE_POSITION_INTERNAL,
285 },
286 };
287
set_hwparams(struct cras_iodev * iodev)288 static int set_hwparams(struct cras_iodev *iodev)
289 {
290 struct alsa_io *aio = (struct alsa_io *)iodev;
291 int period_wakeup;
292 int rc;
293
294 /* Only need to set hardware params once. */
295 if (aio->hwparams_set)
296 return 0;
297
298 /* If it's a wake on voice device, period_wakeups are required. */
299 period_wakeup = (iodev->active_node->type == CRAS_NODE_TYPE_HOTWORD);
300
301 /* Sets frame rate and channel count to alsa device before
302 * we test channel mapping. */
303 rc = cras_alsa_set_hwparams(aio->handle, iodev->format,
304 &iodev->buffer_size, period_wakeup,
305 aio->dma_period_set_microsecs);
306 if (rc < 0)
307 return rc;
308
309 aio->hwparams_set = 1;
310 return 0;
311 }
312
313 /*
314 * iodev callbacks.
315 */
316
frames_queued(const struct cras_iodev * iodev,struct timespec * tstamp)317 static int frames_queued(const struct cras_iodev *iodev,
318 struct timespec *tstamp)
319 {
320 struct alsa_io *aio = (struct alsa_io *)iodev;
321 int rc;
322 snd_pcm_uframes_t frames;
323
324 rc = cras_alsa_get_avail_frames(aio->handle, aio->base.buffer_size,
325 aio->severe_underrun_frames,
326 iodev->info.name, &frames, tstamp);
327 if (rc < 0) {
328 if (rc == -EPIPE)
329 aio->num_severe_underruns++;
330 return rc;
331 }
332 clock_gettime(CLOCK_MONOTONIC_RAW, tstamp);
333 if (iodev->direction == CRAS_STREAM_INPUT)
334 return (int)frames;
335
336 /* For output, return number of frames that are used. */
337 return iodev->buffer_size - frames;
338 }
339
delay_frames(const struct cras_iodev * iodev)340 static int delay_frames(const struct cras_iodev *iodev)
341 {
342 struct alsa_io *aio = (struct alsa_io *)iodev;
343 snd_pcm_sframes_t delay;
344 int rc;
345
346 rc = cras_alsa_get_delay_frames(aio->handle, iodev->buffer_size,
347 &delay);
348 if (rc < 0)
349 return rc;
350
351 return (int)delay;
352 }
353
close_dev(struct cras_iodev * iodev)354 static int close_dev(struct cras_iodev *iodev)
355 {
356 struct alsa_io *aio = (struct alsa_io *)iodev;
357
358 /* Removes audio thread callback from main thread. */
359 if (aio->poll_fd >= 0)
360 audio_thread_rm_callback_sync(
361 cras_iodev_list_get_audio_thread(), aio->poll_fd);
362 if (!aio->handle)
363 return 0;
364 cras_alsa_pcm_close(aio->handle);
365 aio->handle = NULL;
366 aio->free_running = 0;
367 aio->filled_zeros_for_draining = 0;
368 aio->hwparams_set = 0;
369 cras_iodev_free_format(&aio->base);
370 cras_iodev_free_audio_area(&aio->base);
371 return 0;
372 }
373
empty_hotword_cb(void * arg,int revents)374 static int empty_hotword_cb(void *arg, int revents)
375 {
376 /* Only need this once. */
377 struct alsa_io *aio = (struct alsa_io *)arg;
378 audio_thread_rm_callback(aio->poll_fd);
379 aio->poll_fd = -1;
380 aio->base.input_streaming = 1;
381
382 /* Send hotword triggered signal. */
383 cras_hotword_send_triggered_msg();
384
385 return 0;
386 }
387
open_dev(struct cras_iodev * iodev)388 static int open_dev(struct cras_iodev *iodev)
389 {
390 struct alsa_io *aio = (struct alsa_io *)iodev;
391 snd_pcm_t *handle;
392 int rc;
393 const char *pcm_name = NULL;
394 int enable_noise_cancellation;
395
396 if (aio->base.direction == CRAS_STREAM_OUTPUT) {
397 struct alsa_output_node *aout =
398 (struct alsa_output_node *)aio->base.active_node;
399 pcm_name = aout->pcm_name;
400 } else {
401 struct alsa_input_node *ain =
402 (struct alsa_input_node *)aio->base.active_node;
403 pcm_name = ain->pcm_name;
404 }
405
406 /* For legacy UCM path which doesn't have PlaybackPCM or CapturePCM. */
407 if (pcm_name == NULL)
408 pcm_name = aio->pcm_name;
409
410 rc = cras_alsa_pcm_open(&handle, pcm_name, aio->alsa_stream);
411 if (rc < 0)
412 return rc;
413
414 aio->handle = handle;
415
416 /* Enable or disable noise cancellation if it supports. */
417 if (aio->ucm && iodev->direction == CRAS_STREAM_INPUT &&
418 ucm_node_noise_cancellation_exists(aio->ucm,
419 iodev->active_node->name)) {
420 enable_noise_cancellation =
421 cras_system_get_noise_cancellation_enabled();
422 rc = ucm_enable_node_noise_cancellation(
423 aio->ucm, iodev->active_node->name,
424 enable_noise_cancellation);
425 if (rc < 0)
426 return rc;
427 }
428
429 return 0;
430 }
431
configure_dev(struct cras_iodev * iodev)432 static int configure_dev(struct cras_iodev *iodev)
433 {
434 struct alsa_io *aio = (struct alsa_io *)iodev;
435 int rc;
436
437 /* This is called after the first stream added so configure for it.
438 * format must be set before opening the device.
439 */
440 if (iodev->format == NULL)
441 return -EINVAL;
442 aio->free_running = 0;
443 aio->filled_zeros_for_draining = 0;
444 aio->severe_underrun_frames =
445 SEVERE_UNDERRUN_MS * iodev->format->frame_rate / 1000;
446
447 cras_iodev_init_audio_area(iodev, iodev->format->num_channels);
448
449 syslog(LOG_DEBUG, "Configure alsa device %s rate %zuHz, %zu channels",
450 aio->pcm_name, iodev->format->frame_rate,
451 iodev->format->num_channels);
452
453 rc = set_hwparams(iodev);
454 if (rc < 0)
455 return rc;
456
457 /* Set channel map to device */
458 rc = cras_alsa_set_channel_map(aio->handle, iodev->format);
459 if (rc < 0)
460 return rc;
461
462 /* Configure software params. */
463 rc = cras_alsa_set_swparams(aio->handle);
464 if (rc < 0)
465 return rc;
466
467 /* Initialize device settings. */
468 init_device_settings(aio);
469
470 aio->poll_fd = -1;
471 if (iodev->active_node->type == CRAS_NODE_TYPE_HOTWORD) {
472 struct pollfd *ufds;
473 int count, i;
474
475 count = snd_pcm_poll_descriptors_count(aio->handle);
476 if (count <= 0) {
477 syslog(LOG_ERR, "Invalid poll descriptors count\n");
478 return count;
479 }
480
481 ufds = (struct pollfd *)malloc(sizeof(struct pollfd) * count);
482 if (ufds == NULL)
483 return -ENOMEM;
484
485 rc = snd_pcm_poll_descriptors(aio->handle, ufds, count);
486 if (rc < 0) {
487 syslog(LOG_ERR,
488 "Getting hotword poll descriptors: %s\n",
489 snd_strerror(rc));
490 free(ufds);
491 return rc;
492 }
493
494 for (i = 0; i < count; i++) {
495 if (ufds[i].events & POLLIN) {
496 aio->poll_fd = ufds[i].fd;
497 break;
498 }
499 }
500 free(ufds);
501
502 if (aio->poll_fd >= 0)
503 audio_thread_add_events_callback(
504 aio->poll_fd, empty_hotword_cb, aio, POLLIN);
505 }
506
507 /* Capture starts right away, playback will wait for samples. */
508 if (aio->alsa_stream == SND_PCM_STREAM_CAPTURE)
509 cras_alsa_pcm_start(aio->handle);
510
511 return 0;
512 }
513
514 /*
515 * Check if ALSA device is opened by checking if handle is valid.
516 * Note that to fully open a cras_iodev, ALSA device is opened first, then there
517 * are some device init settings to be done in init_device_settings.
518 * Therefore, when setting volume/mute/gain in init_device_settings,
519 * cras_iodev is not in CRAS_IODEV_STATE_OPEN yet. We need to check if handle
520 * is valid when setting those properties, instead of checking
521 * cras_iodev_is_open.
522 */
has_handle(const struct alsa_io * aio)523 static int has_handle(const struct alsa_io *aio)
524 {
525 return !!aio->handle;
526 }
527
start(const struct cras_iodev * iodev)528 static int start(const struct cras_iodev *iodev)
529 {
530 struct alsa_io *aio = (struct alsa_io *)iodev;
531 snd_pcm_t *handle = aio->handle;
532 int rc;
533
534 if (snd_pcm_state(handle) == SND_PCM_STATE_RUNNING)
535 return 0;
536
537 if (snd_pcm_state(handle) == SND_PCM_STATE_SUSPENDED) {
538 rc = cras_alsa_attempt_resume(handle);
539 if (rc < 0) {
540 syslog(LOG_ERR, "Resume error: %s", snd_strerror(rc));
541 return rc;
542 }
543 cras_iodev_reset_rate_estimator(iodev);
544 } else {
545 rc = cras_alsa_pcm_start(handle);
546 if (rc < 0) {
547 syslog(LOG_ERR, "Start error: %s", snd_strerror(rc));
548 return rc;
549 }
550 }
551
552 return 0;
553 }
554
get_buffer(struct cras_iodev * iodev,struct cras_audio_area ** area,unsigned * frames)555 static int get_buffer(struct cras_iodev *iodev, struct cras_audio_area **area,
556 unsigned *frames)
557 {
558 struct alsa_io *aio = (struct alsa_io *)iodev;
559 snd_pcm_uframes_t nframes = *frames;
560 uint8_t *dst = NULL;
561 size_t format_bytes;
562 int rc;
563
564 aio->mmap_offset = 0;
565 format_bytes = cras_get_format_bytes(iodev->format);
566
567 rc = cras_alsa_mmap_begin(aio->handle, format_bytes, &dst,
568 &aio->mmap_offset, &nframes);
569
570 iodev->area->frames = nframes;
571 cras_audio_area_config_buf_pointers(iodev->area, iodev->format, dst);
572
573 *area = iodev->area;
574 *frames = nframes;
575
576 return rc;
577 }
578
put_buffer(struct cras_iodev * iodev,unsigned nwritten)579 static int put_buffer(struct cras_iodev *iodev, unsigned nwritten)
580 {
581 struct alsa_io *aio = (struct alsa_io *)iodev;
582
583 return cras_alsa_mmap_commit(aio->handle, aio->mmap_offset, nwritten);
584 }
585
flush_buffer(struct cras_iodev * iodev)586 static int flush_buffer(struct cras_iodev *iodev)
587 {
588 struct alsa_io *aio = (struct alsa_io *)iodev;
589 snd_pcm_uframes_t nframes;
590
591 if (iodev->direction == CRAS_STREAM_INPUT) {
592 nframes = snd_pcm_avail(aio->handle);
593 nframes = snd_pcm_forwardable(aio->handle);
594 return snd_pcm_forward(aio->handle, nframes);
595 }
596 return 0;
597 }
598
599 /*
600 * Gets the first plugged node in list. This is used as the
601 * default node to set as active.
602 */
first_plugged_node(struct cras_iodev * iodev)603 static struct cras_ionode *first_plugged_node(struct cras_iodev *iodev)
604 {
605 struct cras_ionode *n;
606
607 /* When this is called at iodev creation, none of the nodes
608 * are selected. Just pick the first plugged one and let Chrome
609 * choose it later. */
610 DL_FOREACH (iodev->nodes, n) {
611 if (n->plugged)
612 return n;
613 }
614 return iodev->nodes;
615 }
616
update_active_node(struct cras_iodev * iodev,unsigned node_idx,unsigned dev_enabled)617 static void update_active_node(struct cras_iodev *iodev, unsigned node_idx,
618 unsigned dev_enabled)
619 {
620 struct cras_ionode *n;
621
622 /* If a node exists for node_idx, set it as active. */
623 DL_FOREACH (iodev->nodes, n) {
624 if (n->idx == node_idx) {
625 alsa_iodev_set_active_node(iodev, n, dev_enabled);
626 return;
627 }
628 }
629
630 alsa_iodev_set_active_node(iodev, first_plugged_node(iodev),
631 dev_enabled);
632 }
633
update_channel_layout(struct cras_iodev * iodev)634 static int update_channel_layout(struct cras_iodev *iodev)
635 {
636 struct alsa_io *aio = (struct alsa_io *)iodev;
637 int err = 0;
638
639 /* If the capture channel map is specified in UCM, prefer it over
640 * what ALSA provides. */
641 if (aio->ucm && (iodev->direction == CRAS_STREAM_INPUT)) {
642 struct alsa_input_node *input =
643 (struct alsa_input_node *)iodev->active_node;
644
645 if (input->channel_layout) {
646 memcpy(iodev->format->channel_layout,
647 input->channel_layout,
648 CRAS_CH_MAX * sizeof(*input->channel_layout));
649 return 0;
650 }
651 }
652
653 err = set_hwparams(iodev);
654 if (err < 0)
655 return err;
656
657 return cras_alsa_get_channel_map(aio->handle, iodev->format);
658 }
659
set_hotword_model(struct cras_iodev * iodev,const char * model_name)660 static int set_hotword_model(struct cras_iodev *iodev, const char *model_name)
661 {
662 struct alsa_io *aio = (struct alsa_io *)iodev;
663 if (!aio->ucm)
664 return -EINVAL;
665
666 return ucm_set_hotword_model(aio->ucm, model_name);
667 }
668
get_hotword_models(struct cras_iodev * iodev)669 static char *get_hotword_models(struct cras_iodev *iodev)
670 {
671 struct alsa_io *aio = (struct alsa_io *)iodev;
672 if (!aio->ucm)
673 return NULL;
674
675 return ucm_get_hotword_models(aio->ucm);
676 }
677
678 /*
679 * Alsa helper functions.
680 */
681
get_active_output(const struct alsa_io * aio)682 static struct alsa_output_node *get_active_output(const struct alsa_io *aio)
683 {
684 return (struct alsa_output_node *)aio->base.active_node;
685 }
686
get_active_input(const struct alsa_io * aio)687 static struct alsa_input_node *get_active_input(const struct alsa_io *aio)
688 {
689 return (struct alsa_input_node *)aio->base.active_node;
690 }
691
692 /*
693 * Gets the curve for the active output node. If the node doesn't have volume
694 * curve specified, return the default volume curve of the parent iodev.
695 */
696 static const struct cras_volume_curve *
get_curve_for_output_node(const struct alsa_io * aio,const struct alsa_output_node * node)697 get_curve_for_output_node(const struct alsa_io *aio,
698 const struct alsa_output_node *node)
699 {
700 if (node && node->volume_curve)
701 return node->volume_curve;
702 return aio->default_volume_curve;
703 }
704
705 /*
706 * Gets the curve for the active output.
707 */
708 static const struct cras_volume_curve *
get_curve_for_active_output(const struct alsa_io * aio)709 get_curve_for_active_output(const struct alsa_io *aio)
710 {
711 struct alsa_output_node *node = get_active_output(aio);
712 return get_curve_for_output_node(aio, node);
713 }
714
715 /*
716 * Informs the system of the volume limits for this device.
717 */
set_alsa_volume_limits(struct alsa_io * aio)718 static void set_alsa_volume_limits(struct alsa_io *aio)
719 {
720 const struct cras_volume_curve *curve;
721
722 /* Only set the limits if the dev is active. */
723 if (!has_handle(aio))
724 return;
725
726 curve = get_curve_for_active_output(aio);
727 cras_system_set_volume_limits(curve->get_dBFS(curve, 1), /* min */
728 curve->get_dBFS(curve,
729 CRAS_MAX_SYSTEM_VOLUME));
730 }
731
732 /*
733 * Sets the volume of the playback device to the specified level. Receives a
734 * volume index from the system settings, ranging from 0 to 100, converts it to
735 * dB using the volume curve, and sends the dB value to alsa.
736 */
set_alsa_volume(struct cras_iodev * iodev)737 static void set_alsa_volume(struct cras_iodev *iodev)
738 {
739 const struct alsa_io *aio = (const struct alsa_io *)iodev;
740 const struct cras_volume_curve *curve;
741 size_t volume;
742 struct alsa_output_node *aout;
743
744 assert(aio);
745 if (aio->mixer == NULL)
746 return;
747
748 /* Only set the volume if the dev is active. */
749 if (!has_handle(aio))
750 return;
751
752 volume = cras_system_get_volume();
753 curve = get_curve_for_active_output(aio);
754 if (curve == NULL)
755 return;
756 aout = get_active_output(aio);
757 if (aout)
758 volume = cras_iodev_adjust_node_volume(&aout->base, volume);
759
760 /* Samples get scaled for devices using software volume, set alsa
761 * volume to 100. */
762 if (cras_iodev_software_volume_needed(iodev))
763 volume = 100;
764
765 cras_alsa_mixer_set_dBFS(aio->mixer, curve->get_dBFS(curve, volume),
766 aout ? aout->mixer_output : NULL);
767 }
768
769 /*
770 * Sets the alsa mute control for this iodev.
771 */
set_alsa_mute(struct cras_iodev * iodev)772 static void set_alsa_mute(struct cras_iodev *iodev)
773 {
774 const struct alsa_io *aio = (const struct alsa_io *)iodev;
775 struct alsa_output_node *aout;
776
777 if (!has_handle(aio))
778 return;
779
780 aout = get_active_output(aio);
781 cras_alsa_mixer_set_mute(aio->mixer, cras_system_get_mute(),
782 aout ? aout->mixer_output : NULL);
783 }
784
785 /*
786 * Sets the capture gain to the current system input gain level, given in dBFS.
787 * Set mute based on the system mute state. This gain can be positive or
788 * negative and might be adjusted often if an app is running an AGC.
789 */
set_alsa_capture_gain(struct cras_iodev * iodev)790 static void set_alsa_capture_gain(struct cras_iodev *iodev)
791 {
792 const struct alsa_io *aio = (const struct alsa_io *)iodev;
793 struct alsa_input_node *ain;
794 long min_capture_gain, max_capture_gain, gain;
795 assert(aio);
796 if (aio->mixer == NULL)
797 return;
798
799 /* Only set the volume if the dev is active. */
800 if (!has_handle(aio))
801 return;
802
803 ain = get_active_input(aio);
804
805 cras_alsa_mixer_set_capture_mute(aio->mixer,
806 cras_system_get_capture_mute(),
807 ain ? ain->mixer_input : NULL);
808
809 /* For USB device without UCM config, not change a gain control. */
810 if (ain && ain->base.type == CRAS_NODE_TYPE_USB && !aio->ucm)
811 return;
812
813 /* Set hardware gain to 0dB if software gain is needed. */
814 if (cras_iodev_software_volume_needed(iodev))
815 gain = 0;
816 else {
817 min_capture_gain = cras_alsa_mixer_get_minimum_capture_gain(
818 aio->mixer, ain ? ain->mixer_input : NULL);
819 max_capture_gain = cras_alsa_mixer_get_maximum_capture_gain(
820 aio->mixer, ain ? ain->mixer_input : NULL);
821 gain = MAX(iodev->active_node->capture_gain, min_capture_gain);
822 gain = MIN(gain, max_capture_gain);
823 }
824
825 cras_alsa_mixer_set_capture_dBFS(aio->mixer, gain,
826 ain ? ain->mixer_input : NULL);
827 }
828
829 /*
830 * Swaps the left and right channels of the given node.
831 */
set_alsa_node_swapped(struct cras_iodev * iodev,struct cras_ionode * node,int enable)832 static int set_alsa_node_swapped(struct cras_iodev *iodev,
833 struct cras_ionode *node, int enable)
834 {
835 const struct alsa_io *aio = (const struct alsa_io *)iodev;
836 assert(aio);
837 return ucm_enable_swap_mode(aio->ucm, node->name, enable);
838 }
839
840 /*
841 * Initializes the device settings according to system volume, mute, gain
842 * settings.
843 * Updates system capture gain limits based on current active device/node.
844 */
init_device_settings(struct alsa_io * aio)845 static void init_device_settings(struct alsa_io *aio)
846 {
847 /* Register for volume/mute callback and set initial volume/mute for
848 * the device. */
849 if (aio->base.direction == CRAS_STREAM_OUTPUT) {
850 set_alsa_volume_limits(aio);
851 set_alsa_volume(&aio->base);
852 set_alsa_mute(&aio->base);
853 } else {
854 set_alsa_capture_gain(&aio->base);
855 }
856 }
857
858 /*
859 * Functions run in the main server context.
860 */
861
862 /*
863 * Frees resources used by the alsa iodev.
864 * Args:
865 * iodev - the iodev to free the resources from.
866 */
free_alsa_iodev_resources(struct alsa_io * aio)867 static void free_alsa_iodev_resources(struct alsa_io *aio)
868 {
869 struct cras_ionode *node;
870 struct alsa_output_node *aout;
871 struct alsa_input_node *ain;
872
873 free(aio->base.supported_rates);
874 free(aio->base.supported_channel_counts);
875 free(aio->base.supported_formats);
876
877 DL_FOREACH (aio->base.nodes, node) {
878 if (aio->base.direction == CRAS_STREAM_OUTPUT) {
879 aout = (struct alsa_output_node *)node;
880 cras_volume_curve_destroy(aout->volume_curve);
881 free((void *)aout->pcm_name);
882 } else {
883 ain = (struct alsa_input_node *)node;
884 free((void *)ain->pcm_name);
885 }
886 cras_iodev_rm_node(&aio->base, node);
887 free(node->softvol_scalers);
888 free((void *)node->dsp_name);
889 free(node);
890 }
891
892 cras_iodev_free_resources(&aio->base);
893 free(aio->pcm_name);
894 if (aio->dev_id)
895 free(aio->dev_id);
896 if (aio->dev_name)
897 free(aio->dev_name);
898 }
899
900 /*
901 * Returns true if this is the first internal device.
902 */
first_internal_device(struct alsa_io * aio)903 static int first_internal_device(struct alsa_io *aio)
904 {
905 return aio->is_first && aio->card_type == ALSA_CARD_TYPE_INTERNAL;
906 }
907
908 /*
909 * Returns true if there is already a node created with the given name.
910 */
has_node(struct alsa_io * aio,const char * name)911 static int has_node(struct alsa_io *aio, const char *name)
912 {
913 struct cras_ionode *node;
914
915 DL_FOREACH (aio->base.nodes, node)
916 if (!strcmp(node->name, name))
917 return 1;
918
919 return 0;
920 }
921
922 /*
923 * Returns true if string s ends with the given suffix.
924 */
endswith(const char * s,const char * suffix)925 int endswith(const char *s, const char *suffix)
926 {
927 size_t n = strlen(s);
928 size_t m = strlen(suffix);
929 return n >= m && !strcmp(s + (n - m), suffix);
930 }
931
932 #ifdef CRAS_DBUS
933 /*
934 * Drop the node name and replace it with node type.
935 */
drop_node_name(struct cras_ionode * node)936 static void drop_node_name(struct cras_ionode *node)
937 {
938 if (node->type == CRAS_NODE_TYPE_USB)
939 strcpy(node->name, USB);
940 else if (node->type == CRAS_NODE_TYPE_HDMI)
941 strcpy(node->name, HDMI);
942 else {
943 /* Only HDMI or USB node might have invalid name to drop */
944 syslog(LOG_ERR,
945 "Unexpectedly drop node name for "
946 "node: %s, type: %d",
947 node->name, node->type);
948 strcpy(node->name, DEFAULT);
949 }
950 }
951 #endif
952
953 /*
954 * Sets the initial plugged state and type of a node based on its
955 * name. Chrome will assign priority to nodes base on node type.
956 */
set_node_initial_state(struct cras_ionode * node,enum CRAS_ALSA_CARD_TYPE card_type)957 static void set_node_initial_state(struct cras_ionode *node,
958 enum CRAS_ALSA_CARD_TYPE card_type)
959 {
960 unsigned i;
961
962 node->volume = 100;
963 node->type = CRAS_NODE_TYPE_UNKNOWN;
964 /* Go through the known names */
965 for (i = 0; i < ARRAY_SIZE(node_defaults); i++)
966 if (!strncmp(node->name, node_defaults[i].name,
967 strlen(node_defaults[i].name))) {
968 node->position = node_defaults[i].position;
969 node->plugged =
970 (node->position != NODE_POSITION_EXTERNAL);
971 node->type = node_defaults[i].type;
972 if (node->plugged)
973 gettimeofday(&node->plugged_time, NULL);
974 break;
975 }
976
977 /*
978 * If we didn't find a matching name above, but the node is a jack node,
979 * and there is no "HDMI" in the node name, then this must be a 3.5mm
980 * headphone/mic.
981 * Set its type and name to headphone/mic. The name is important because
982 * it associates the UCM section to the node so the properties like
983 * default node gain can be obtained.
984 * This matches node names like "DAISY-I2S Mic Jack".
985 * If HDMI is in the node name, set its type to HDMI. This matches node names
986 * like "Rockchip HDMI Jack".
987 */
988 if (i == ARRAY_SIZE(node_defaults)) {
989 if (endswith(node->name, "Jack") && !strstr(node->name, HDMI)) {
990 if (node->dev->direction == CRAS_STREAM_OUTPUT) {
991 node->type = CRAS_NODE_TYPE_HEADPHONE;
992 strncpy(node->name, HEADPHONE,
993 sizeof(node->name) - 1);
994 } else {
995 node->type = CRAS_NODE_TYPE_MIC;
996 strncpy(node->name, MIC,
997 sizeof(node->name) - 1);
998 }
999 }
1000 if (strstr(node->name, HDMI) &&
1001 node->dev->direction == CRAS_STREAM_OUTPUT)
1002 node->type = CRAS_NODE_TYPE_HDMI;
1003 }
1004
1005 /* Regardless of the node name of a USB headset (it can be "Speaker"),
1006 * set it's type to usb.
1007 */
1008 if (card_type == ALSA_CARD_TYPE_USB) {
1009 node->type = CRAS_NODE_TYPE_USB;
1010 node->position = NODE_POSITION_EXTERNAL;
1011 }
1012
1013 #ifdef CRAS_DBUS
1014 if (!is_utf8_string(node->name))
1015 drop_node_name(node);
1016 #endif
1017 }
1018
get_ucm_flag_integer(struct alsa_io * aio,const char * flag_name,int * result)1019 static int get_ucm_flag_integer(struct alsa_io *aio, const char *flag_name,
1020 int *result)
1021 {
1022 char *value;
1023 int i;
1024
1025 if (!aio->ucm)
1026 return -1;
1027
1028 value = ucm_get_flag(aio->ucm, flag_name);
1029 if (!value)
1030 return -1;
1031
1032 i = atoi(value);
1033 free(value);
1034 *result = i;
1035 return 0;
1036 }
1037
auto_unplug_input_node(struct alsa_io * aio)1038 static int auto_unplug_input_node(struct alsa_io *aio)
1039 {
1040 int result;
1041 if (get_ucm_flag_integer(aio, "AutoUnplugInputNode", &result))
1042 return 0;
1043 return result;
1044 }
1045
auto_unplug_output_node(struct alsa_io * aio)1046 static int auto_unplug_output_node(struct alsa_io *aio)
1047 {
1048 int result;
1049 if (get_ucm_flag_integer(aio, "AutoUnplugOutputNode", &result))
1050 return 0;
1051 return result;
1052 }
1053
no_create_default_input_node(struct alsa_io * aio)1054 static int no_create_default_input_node(struct alsa_io *aio)
1055 {
1056 int result;
1057 if (get_ucm_flag_integer(aio, "NoCreateDefaultInputNode", &result))
1058 return 0;
1059 return result;
1060 }
1061
no_create_default_output_node(struct alsa_io * aio)1062 static int no_create_default_output_node(struct alsa_io *aio)
1063 {
1064 int result;
1065 if (get_ucm_flag_integer(aio, "NoCreateDefaultOutputNode", &result))
1066 return 0;
1067 return result;
1068 }
1069
1070 static void
set_output_node_software_volume_needed(struct alsa_output_node * output,struct alsa_io * aio)1071 set_output_node_software_volume_needed(struct alsa_output_node *output,
1072 struct alsa_io *aio)
1073 {
1074 struct cras_alsa_mixer *mixer = aio->mixer;
1075 long range = 0;
1076
1077 if (aio->ucm && ucm_get_disable_software_volume(aio->ucm)) {
1078 output->base.software_volume_needed = 0;
1079 syslog(LOG_DEBUG, "Disable software volume for %s from ucm.",
1080 output->base.name);
1081 return;
1082 }
1083
1084 /* Use software volume for HDMI output and nodes without volume mixer
1085 * control. */
1086 if ((output->base.type == CRAS_NODE_TYPE_HDMI) ||
1087 (!cras_alsa_mixer_has_main_volume(mixer) &&
1088 !cras_alsa_mixer_has_volume(output->mixer_output)))
1089 output->base.software_volume_needed = 1;
1090
1091 /* Use software volume if the usb device's volume range is smaller
1092 * than 40dB */
1093 if (output->base.type == CRAS_NODE_TYPE_USB) {
1094 range += cras_alsa_mixer_get_dB_range(mixer);
1095 range += cras_alsa_mixer_get_output_dB_range(
1096 output->mixer_output);
1097 if (range < 4000)
1098 output->base.software_volume_needed = 1;
1099 }
1100 if (output->base.software_volume_needed)
1101 syslog(LOG_DEBUG, "Use software volume for node: %s",
1102 output->base.name);
1103 }
1104
set_input_default_node_gain(struct alsa_input_node * input,struct alsa_io * aio)1105 static void set_input_default_node_gain(struct alsa_input_node *input,
1106 struct alsa_io *aio)
1107 {
1108 long gain;
1109
1110 input->base.capture_gain = DEFAULT_CAPTURE_GAIN;
1111 input->base.ui_gain_scaler = 1.0f;
1112
1113 if (!aio->ucm)
1114 return;
1115
1116 if (ucm_get_default_node_gain(aio->ucm, input->base.name, &gain) == 0)
1117 input->base.capture_gain = gain;
1118 }
1119
set_input_node_intrinsic_sensitivity(struct alsa_input_node * input,struct alsa_io * aio)1120 static void set_input_node_intrinsic_sensitivity(struct alsa_input_node *input,
1121 struct alsa_io *aio)
1122 {
1123 long sensitivity;
1124 int rc;
1125
1126 input->base.intrinsic_sensitivity = 0;
1127
1128 if (aio->ucm) {
1129 rc = ucm_get_intrinsic_sensitivity(aio->ucm, input->base.name,
1130 &sensitivity);
1131 if (rc)
1132 return;
1133 } else if (input->base.type == CRAS_NODE_TYPE_USB) {
1134 /*
1135 * For USB devices without UCM config, trust the default capture gain.
1136 * Set sensitivity to the default dbfs so the capture gain is 0.
1137 */
1138 sensitivity = DEFAULT_CAPTURE_VOLUME_DBFS;
1139 } else {
1140 return;
1141 }
1142
1143 input->base.intrinsic_sensitivity = sensitivity;
1144 input->base.capture_gain = DEFAULT_CAPTURE_VOLUME_DBFS - sensitivity;
1145 syslog(LOG_INFO,
1146 "Use software gain %ld for %s because IntrinsicSensitivity %ld is"
1147 " specified in UCM",
1148 input->base.capture_gain, input->base.name, sensitivity);
1149 }
1150
check_auto_unplug_output_node(struct alsa_io * aio,struct cras_ionode * node,int plugged)1151 static void check_auto_unplug_output_node(struct alsa_io *aio,
1152 struct cras_ionode *node, int plugged)
1153 {
1154 struct cras_ionode *tmp;
1155
1156 if (!auto_unplug_output_node(aio))
1157 return;
1158
1159 /* Auto unplug internal speaker if any output node has been created */
1160 if (!strcmp(node->name, INTERNAL_SPEAKER) && plugged) {
1161 DL_FOREACH (aio->base.nodes, tmp)
1162 if (tmp->plugged && (tmp != node))
1163 cras_iodev_set_node_plugged(node, 0);
1164 } else {
1165 DL_FOREACH (aio->base.nodes, tmp) {
1166 if (!strcmp(tmp->name, INTERNAL_SPEAKER))
1167 cras_iodev_set_node_plugged(tmp, !plugged);
1168 }
1169 }
1170 }
1171
1172 /*
1173 * Callback for listing mixer outputs. The mixer will call this once for each
1174 * output associated with this device. Most commonly this is used to tell the
1175 * device it has Headphones and Speakers.
1176 */
new_output(struct alsa_io * aio,struct mixer_control * cras_output,const char * name)1177 static struct alsa_output_node *new_output(struct alsa_io *aio,
1178 struct mixer_control *cras_output,
1179 const char *name)
1180 {
1181 struct alsa_output_node *output;
1182 syslog(LOG_DEBUG, "New output node for '%s'", name);
1183 if (aio == NULL) {
1184 syslog(LOG_ERR, "Invalid aio when listing outputs.");
1185 return NULL;
1186 }
1187 output = (struct alsa_output_node *)calloc(1, sizeof(*output));
1188 if (output == NULL) {
1189 syslog(LOG_ERR, "Out of memory when listing outputs.");
1190 return NULL;
1191 }
1192 output->base.dev = &aio->base;
1193 output->base.idx = aio->next_ionode_index++;
1194 output->base.stable_id =
1195 SuperFastHash(name, strlen(name), aio->base.info.stable_id);
1196 if (aio->ucm)
1197 output->base.dsp_name =
1198 ucm_get_dsp_name_for_dev(aio->ucm, name);
1199
1200 if (strcmp(name, "SCO Line Out") == 0)
1201 output->base.is_sco_pcm = 1;
1202 output->mixer_output = cras_output;
1203
1204 /* Volume curve. */
1205 output->volume_curve = cras_card_config_get_volume_curve_for_control(
1206 aio->config,
1207 name ? name : cras_alsa_mixer_get_control_name(cras_output));
1208
1209 strncpy(output->base.name, name, sizeof(output->base.name) - 1);
1210 set_node_initial_state(&output->base, aio->card_type);
1211 set_output_node_software_volume_needed(output, aio);
1212
1213 cras_iodev_add_node(&aio->base, &output->base);
1214
1215 check_auto_unplug_output_node(aio, &output->base, output->base.plugged);
1216 return output;
1217 }
1218
new_output_by_mixer_control(struct mixer_control * cras_output,void * callback_arg)1219 static void new_output_by_mixer_control(struct mixer_control *cras_output,
1220 void *callback_arg)
1221 {
1222 struct alsa_io *aio = (struct alsa_io *)callback_arg;
1223 char node_name[CRAS_IODEV_NAME_BUFFER_SIZE];
1224 const char *ctl_name;
1225
1226 ctl_name = cras_alsa_mixer_get_control_name(cras_output);
1227 if (!ctl_name)
1228 return;
1229
1230 if (aio->card_type == ALSA_CARD_TYPE_USB) {
1231 if (snprintf(node_name, sizeof(node_name), "%s: %s",
1232 aio->base.info.name, ctl_name) > 0) {
1233 new_output(aio, cras_output, node_name);
1234 }
1235 } else {
1236 new_output(aio, cras_output, ctl_name);
1237 }
1238 }
1239
check_auto_unplug_input_node(struct alsa_io * aio,struct cras_ionode * node,int plugged)1240 static void check_auto_unplug_input_node(struct alsa_io *aio,
1241 struct cras_ionode *node, int plugged)
1242 {
1243 struct cras_ionode *tmp;
1244 if (!auto_unplug_input_node(aio))
1245 return;
1246
1247 /* Auto unplug internal mic if any input node has already
1248 * been created */
1249 if (!strcmp(node->name, INTERNAL_MICROPHONE) && plugged) {
1250 DL_FOREACH (aio->base.nodes, tmp)
1251 if (tmp->plugged && (tmp != node))
1252 cras_iodev_set_node_plugged(node, 0);
1253 } else {
1254 DL_FOREACH (aio->base.nodes, tmp)
1255 if (!strcmp(tmp->name, INTERNAL_MICROPHONE))
1256 cras_iodev_set_node_plugged(tmp, !plugged);
1257 }
1258 }
1259
new_input(struct alsa_io * aio,struct mixer_control * cras_input,const char * name)1260 static struct alsa_input_node *new_input(struct alsa_io *aio,
1261 struct mixer_control *cras_input,
1262 const char *name)
1263 {
1264 struct cras_iodev *iodev = &aio->base;
1265 struct alsa_input_node *input;
1266 int err;
1267
1268 input = (struct alsa_input_node *)calloc(1, sizeof(*input));
1269 if (input == NULL) {
1270 syslog(LOG_ERR, "Out of memory when listing inputs.");
1271 return NULL;
1272 }
1273 input->base.dev = &aio->base;
1274 input->base.idx = aio->next_ionode_index++;
1275 input->base.stable_id =
1276 SuperFastHash(name, strlen(name), aio->base.info.stable_id);
1277 if (strcmp(name, "SCO Line In") == 0)
1278 input->base.is_sco_pcm = 1;
1279 input->mixer_input = cras_input;
1280 strncpy(input->base.name, name, sizeof(input->base.name) - 1);
1281 set_node_initial_state(&input->base, aio->card_type);
1282 set_input_default_node_gain(input, aio);
1283 set_input_node_intrinsic_sensitivity(input, aio);
1284
1285 if (aio->ucm) {
1286 /* Check if channel map is specified in UCM. */
1287 input->channel_layout = (int8_t *)malloc(
1288 CRAS_CH_MAX * sizeof(*input->channel_layout));
1289 err = ucm_get_capture_chmap_for_dev(aio->ucm, name,
1290 input->channel_layout);
1291 if (err) {
1292 free(input->channel_layout);
1293 input->channel_layout = 0;
1294 }
1295 if (ucm_get_preempt_hotword(aio->ucm, name)) {
1296 iodev->pre_open_iodev_hook =
1297 cras_iodev_list_suspend_hotword_streams;
1298 iodev->post_close_iodev_hook =
1299 cras_iodev_list_resume_hotword_stream;
1300 }
1301
1302 input->base.dsp_name = ucm_get_dsp_name_for_dev(aio->ucm, name);
1303 }
1304
1305 cras_iodev_add_node(&aio->base, &input->base);
1306 check_auto_unplug_input_node(aio, &input->base, input->base.plugged);
1307 return input;
1308 }
1309
new_input_by_mixer_control(struct mixer_control * cras_input,void * callback_arg)1310 static void new_input_by_mixer_control(struct mixer_control *cras_input,
1311 void *callback_arg)
1312 {
1313 struct alsa_io *aio = (struct alsa_io *)callback_arg;
1314 char node_name[CRAS_IODEV_NAME_BUFFER_SIZE];
1315 const char *ctl_name = cras_alsa_mixer_get_control_name(cras_input);
1316
1317 if (aio->card_type == ALSA_CARD_TYPE_USB) {
1318 int ret = snprintf(node_name, sizeof(node_name), "%s: %s",
1319 aio->base.info.name, ctl_name);
1320 // Truncation is OK, but add a check to make the compiler happy.
1321 if (ret == sizeof(node_name))
1322 node_name[sizeof(node_name) - 1] = '\0';
1323 new_input(aio, cras_input, node_name);
1324 } else {
1325 new_input(aio, cras_input, ctl_name);
1326 }
1327 }
1328
1329 /*
1330 * Finds the output node associated with the jack. Returns NULL if not found.
1331 */
1332 static struct alsa_output_node *
get_output_node_from_jack(struct alsa_io * aio,const struct cras_alsa_jack * jack)1333 get_output_node_from_jack(struct alsa_io *aio,
1334 const struct cras_alsa_jack *jack)
1335 {
1336 struct mixer_control *mixer_output;
1337 struct cras_ionode *node = NULL;
1338 struct alsa_output_node *aout = NULL;
1339
1340 /* Search by jack first. */
1341 DL_SEARCH_SCALAR_WITH_CAST(aio->base.nodes, node, aout, jack, jack);
1342 if (aout)
1343 return aout;
1344
1345 /* Search by mixer control next. */
1346 mixer_output = cras_alsa_jack_get_mixer_output(jack);
1347 if (mixer_output == NULL)
1348 return NULL;
1349
1350 DL_SEARCH_SCALAR_WITH_CAST(aio->base.nodes, node, aout, mixer_output,
1351 mixer_output);
1352 return aout;
1353 }
1354
1355 static struct alsa_input_node *
get_input_node_from_jack(struct alsa_io * aio,const struct cras_alsa_jack * jack)1356 get_input_node_from_jack(struct alsa_io *aio, const struct cras_alsa_jack *jack)
1357 {
1358 struct mixer_control *mixer_input;
1359 struct cras_ionode *node = NULL;
1360 struct alsa_input_node *ain = NULL;
1361
1362 mixer_input = cras_alsa_jack_get_mixer_input(jack);
1363 if (mixer_input == NULL) {
1364 DL_SEARCH_SCALAR_WITH_CAST(aio->base.nodes, node, ain, jack,
1365 jack);
1366 return ain;
1367 }
1368
1369 DL_SEARCH_SCALAR_WITH_CAST(aio->base.nodes, node, ain, mixer_input,
1370 mixer_input);
1371 return ain;
1372 }
1373
get_jack_from_node(struct cras_ionode * node)1374 static const struct cras_alsa_jack *get_jack_from_node(struct cras_ionode *node)
1375 {
1376 const struct cras_alsa_jack *jack = NULL;
1377
1378 if (node == NULL)
1379 return NULL;
1380
1381 if (node->dev->direction == CRAS_STREAM_OUTPUT)
1382 jack = ((struct alsa_output_node *)node)->jack;
1383 else if (node->dev->direction == CRAS_STREAM_INPUT)
1384 jack = ((struct alsa_input_node *)node)->jack;
1385
1386 return jack;
1387 }
1388
1389 /*
1390 * Returns the dsp name specified in the ucm config. If there is a dsp name
1391 * specified for the active node, use that. Otherwise NULL should be returned.
1392 */
get_active_dsp_name(struct alsa_io * aio)1393 static const char *get_active_dsp_name(struct alsa_io *aio)
1394 {
1395 struct cras_ionode *node = aio->base.active_node;
1396
1397 if (node == NULL)
1398 return NULL;
1399
1400 return node->dsp_name;
1401 }
1402
1403 /*
1404 * Creates volume curve for the node associated with given jack.
1405 */
1406 static struct cras_volume_curve *
create_volume_curve_for_jack(const struct cras_card_config * config,const struct cras_alsa_jack * jack)1407 create_volume_curve_for_jack(const struct cras_card_config *config,
1408 const struct cras_alsa_jack *jack)
1409 {
1410 struct cras_volume_curve *curve;
1411 const char *name;
1412
1413 /* Use jack's UCM device name as key to get volume curve. */
1414 name = cras_alsa_jack_get_ucm_device(jack);
1415 curve = cras_card_config_get_volume_curve_for_control(config, name);
1416 if (curve)
1417 return curve;
1418
1419 /* Use alsa jack's name as key to get volume curve. */
1420 name = cras_alsa_jack_get_name(jack);
1421 curve = cras_card_config_get_volume_curve_for_control(config, name);
1422 if (curve)
1423 return curve;
1424
1425 return NULL;
1426 }
1427
1428 /*
1429 * Updates max_supported_channels value into cras_iodev_info.
1430 * Note that supported_rates, supported_channel_counts, and supported_formats of
1431 * iodev will be updated to the latest values after calling.
1432 */
update_max_supported_channels(struct cras_iodev * iodev)1433 static void update_max_supported_channels(struct cras_iodev *iodev)
1434 {
1435 struct alsa_io *aio = (struct alsa_io *)iodev;
1436 unsigned int max_channels = 0;
1437 size_t i;
1438 bool active_node_predicted = false;
1439 int rc;
1440
1441 /*
1442 * max_supported_channels might be wrong in dependent PCM cases. Always
1443 * return 2 for such cases.
1444 */
1445 if (aio->has_dependent_dev) {
1446 max_channels = 2;
1447 goto update_info;
1448 }
1449
1450 if (aio->handle) {
1451 syslog(LOG_ERR,
1452 "update_max_supported_channels should not be called "
1453 "while device is opened.");
1454 return;
1455 }
1456
1457 /*
1458 * In the case of updating max_supported_channels on changing jack
1459 * plugging status of devices, the active node may not be determined
1460 * yet. Use the first node as the active node for obtaining the value of
1461 * max_supported_channels.
1462 */
1463 if (!iodev->active_node) {
1464 if (!iodev->nodes)
1465 goto update_info;
1466 iodev->active_node = iodev->nodes;
1467 syslog(LOG_DEBUG,
1468 "Predict ionode %s as active node temporarily.",
1469 iodev->active_node->name);
1470 active_node_predicted = true;
1471 }
1472
1473 rc = open_dev(iodev);
1474 if (active_node_predicted)
1475 iodev->active_node = NULL; // Reset the predicted active_node.
1476 if (rc)
1477 goto update_info;
1478
1479 rc = update_supported_formats(iodev);
1480 if (rc)
1481 goto close_iodev;
1482
1483 for (i = 0; iodev->supported_channel_counts[i] != 0; i++) {
1484 if (iodev->supported_channel_counts[i] > max_channels)
1485 max_channels = iodev->supported_channel_counts[i];
1486 }
1487
1488 close_iodev:
1489 close_dev(iodev);
1490
1491 update_info:
1492 iodev->info.max_supported_channels = max_channels;
1493 }
1494
1495 /*
1496 * Callback that is called when an output jack is plugged or unplugged.
1497 */
jack_output_plug_event(const struct cras_alsa_jack * jack,int plugged,void * arg)1498 static void jack_output_plug_event(const struct cras_alsa_jack *jack,
1499 int plugged, void *arg)
1500 {
1501 struct alsa_io *aio;
1502 struct alsa_output_node *node;
1503 const char *jack_name;
1504
1505 if (arg == NULL)
1506 return;
1507
1508 aio = (struct alsa_io *)arg;
1509 node = get_output_node_from_jack(aio, jack);
1510 jack_name = cras_alsa_jack_get_name(jack);
1511 if (!strcmp(jack_name, "Speaker Phantom Jack"))
1512 jack_name = INTERNAL_SPEAKER;
1513
1514 /* If there isn't a node for this jack, create one. */
1515 if (node == NULL) {
1516 if (aio->fully_specified) {
1517 /* When fully specified, can't have new nodes. */
1518 syslog(LOG_ERR, "No matching output node for jack %s!",
1519 jack_name);
1520 return;
1521 }
1522 node = new_output(aio, NULL, jack_name);
1523 if (node == NULL)
1524 return;
1525
1526 cras_alsa_jack_update_node_type(jack, &(node->base.type));
1527 }
1528
1529 if (!node->jack) {
1530 if (aio->fully_specified)
1531 syslog(LOG_ERR,
1532 "Jack '%s' was found to match output node '%s'."
1533 " Please fix your UCM configuration to match.",
1534 jack_name, node->base.name);
1535
1536 /* If we already have the node, associate with the jack. */
1537 node->jack = jack;
1538 if (node->volume_curve == NULL)
1539 node->volume_curve =
1540 create_volume_curve_for_jack(aio->config, jack);
1541 }
1542
1543 syslog(LOG_DEBUG, "%s plugged: %d, %s", jack_name, plugged,
1544 cras_alsa_mixer_get_control_name(node->mixer_output));
1545
1546 cras_alsa_jack_update_monitor_name(jack, node->base.name,
1547 sizeof(node->base.name));
1548
1549 #ifdef CRAS_DBUS
1550 /* The name got from jack might be an invalid UTF8 string. */
1551 if (!is_utf8_string(node->base.name))
1552 drop_node_name(&node->base);
1553 #endif
1554
1555 cras_iodev_set_node_plugged(&node->base, plugged);
1556
1557 check_auto_unplug_output_node(aio, &node->base, plugged);
1558
1559 /*
1560 * For HDMI plug event cases, update max supported channels according
1561 * to the current active node.
1562 */
1563 if (node->base.type == CRAS_NODE_TYPE_HDMI && plugged)
1564 update_max_supported_channels(&aio->base);
1565 }
1566
1567 /*
1568 * Callback that is called when an input jack is plugged or unplugged.
1569 */
jack_input_plug_event(const struct cras_alsa_jack * jack,int plugged,void * arg)1570 static void jack_input_plug_event(const struct cras_alsa_jack *jack,
1571 int plugged, void *arg)
1572 {
1573 struct alsa_io *aio;
1574 struct alsa_input_node *node;
1575 struct mixer_control *cras_input;
1576 const char *jack_name;
1577
1578 if (arg == NULL)
1579 return;
1580 aio = (struct alsa_io *)arg;
1581 node = get_input_node_from_jack(aio, jack);
1582 jack_name = cras_alsa_jack_get_name(jack);
1583
1584 /* If there isn't a node for this jack, create one. */
1585 if (node == NULL) {
1586 if (aio->fully_specified) {
1587 /* When fully specified, can't have new nodes. */
1588 syslog(LOG_ERR, "No matching input node for jack %s!",
1589 jack_name);
1590 return;
1591 }
1592 cras_input = cras_alsa_jack_get_mixer_input(jack);
1593 node = new_input(aio, cras_input, jack_name);
1594 if (node == NULL)
1595 return;
1596 }
1597
1598 syslog(LOG_DEBUG, "%s plugged: %d, %s", jack_name, plugged,
1599 cras_alsa_mixer_get_control_name(node->mixer_input));
1600
1601 /* If we already have the node, associate with the jack. */
1602 if (!node->jack) {
1603 if (aio->fully_specified)
1604 syslog(LOG_ERR,
1605 "Jack '%s' was found to match input node '%s'."
1606 " Please fix your UCM configuration to match.",
1607 jack_name, node->base.name);
1608 node->jack = jack;
1609 }
1610
1611 cras_iodev_set_node_plugged(&node->base, plugged);
1612
1613 check_auto_unplug_input_node(aio, &node->base, plugged);
1614 }
1615
1616 /*
1617 * Sets the name of the given iodev, using the name and index of the card
1618 * combined with the device index and direction.
1619 */
set_iodev_name(struct cras_iodev * dev,const char * card_name,const char * dev_name,size_t card_index,size_t device_index,enum CRAS_ALSA_CARD_TYPE card_type,size_t usb_vid,size_t usb_pid,char * usb_serial_number)1620 static void set_iodev_name(struct cras_iodev *dev, const char *card_name,
1621 const char *dev_name, size_t card_index,
1622 size_t device_index,
1623 enum CRAS_ALSA_CARD_TYPE card_type, size_t usb_vid,
1624 size_t usb_pid, char *usb_serial_number)
1625 {
1626 snprintf(dev->info.name, sizeof(dev->info.name), "%s: %s:%zu,%zu",
1627 card_name, dev_name, card_index, device_index);
1628 dev->info.name[ARRAY_SIZE(dev->info.name) - 1] = '\0';
1629 syslog(LOG_DEBUG, "Add device name=%s", dev->info.name);
1630
1631 dev->info.stable_id =
1632 SuperFastHash(card_name, strlen(card_name), strlen(card_name));
1633 dev->info.stable_id =
1634 SuperFastHash(dev_name, strlen(dev_name), dev->info.stable_id);
1635
1636 switch (card_type) {
1637 case ALSA_CARD_TYPE_INTERNAL:
1638 dev->info.stable_id = SuperFastHash((const char *)&device_index,
1639 sizeof(device_index),
1640 dev->info.stable_id);
1641 break;
1642 case ALSA_CARD_TYPE_USB:
1643 dev->info.stable_id =
1644 SuperFastHash((const char *)&usb_vid, sizeof(usb_vid),
1645 dev->info.stable_id);
1646 dev->info.stable_id =
1647 SuperFastHash((const char *)&usb_pid, sizeof(usb_pid),
1648 dev->info.stable_id);
1649 dev->info.stable_id = SuperFastHash(usb_serial_number,
1650 strlen(usb_serial_number),
1651 dev->info.stable_id);
1652 break;
1653 default:
1654 break;
1655 }
1656 syslog(LOG_DEBUG, "Stable ID=%08x", dev->info.stable_id);
1657 }
1658
get_fixed_rate(struct alsa_io * aio)1659 static int get_fixed_rate(struct alsa_io *aio)
1660 {
1661 const char *name;
1662
1663 if (aio->base.direction == CRAS_STREAM_OUTPUT) {
1664 struct alsa_output_node *active = get_active_output(aio);
1665 if (!active)
1666 return -ENOENT;
1667 name = active->base.name;
1668 } else {
1669 struct alsa_input_node *active = get_active_input(aio);
1670 if (!active)
1671 return -ENOENT;
1672 name = active->base.name;
1673 }
1674
1675 return ucm_get_sample_rate_for_dev(aio->ucm, name, aio->base.direction);
1676 }
1677
get_fixed_channels(struct alsa_io * aio)1678 static size_t get_fixed_channels(struct alsa_io *aio)
1679 {
1680 const char *name;
1681 int rc;
1682 size_t channels;
1683
1684 if (aio->base.direction == CRAS_STREAM_OUTPUT) {
1685 struct alsa_output_node *active = get_active_output(aio);
1686 if (!active)
1687 return -ENOENT;
1688 name = active->base.name;
1689 } else {
1690 struct alsa_input_node *active = get_active_input(aio);
1691 if (!active)
1692 return -ENOENT;
1693 name = active->base.name;
1694 }
1695
1696 rc = ucm_get_channels_for_dev(aio->ucm, name, aio->base.direction,
1697 &channels);
1698 return (rc) ? 0 : channels;
1699 }
1700
1701 /*
1702 * Updates the supported sample rates and channel counts.
1703 */
update_supported_formats(struct cras_iodev * iodev)1704 static int update_supported_formats(struct cras_iodev *iodev)
1705 {
1706 struct alsa_io *aio = (struct alsa_io *)iodev;
1707 int err;
1708 int fixed_rate;
1709 size_t fixed_channels;
1710
1711 free(iodev->supported_rates);
1712 iodev->supported_rates = NULL;
1713 free(iodev->supported_channel_counts);
1714 iodev->supported_channel_counts = NULL;
1715 free(iodev->supported_formats);
1716 iodev->supported_formats = NULL;
1717
1718 err = cras_alsa_fill_properties(aio->handle, &iodev->supported_rates,
1719 &iodev->supported_channel_counts,
1720 &iodev->supported_formats);
1721 if (err)
1722 return err;
1723
1724 if (aio->ucm) {
1725 /* Allow UCM to override supplied rates. */
1726 fixed_rate = get_fixed_rate(aio);
1727 if (fixed_rate > 0) {
1728 free(iodev->supported_rates);
1729 iodev->supported_rates = (size_t *)malloc(
1730 2 * sizeof(iodev->supported_rates[0]));
1731 iodev->supported_rates[0] = fixed_rate;
1732 iodev->supported_rates[1] = 0;
1733 }
1734
1735 /* Allow UCM to override supported channel counts. */
1736 fixed_channels = get_fixed_channels(aio);
1737 if (fixed_channels > 0) {
1738 free(iodev->supported_channel_counts);
1739 iodev->supported_channel_counts = (size_t *)malloc(
1740 2 * sizeof(iodev->supported_channel_counts[0]));
1741 iodev->supported_channel_counts[0] = fixed_channels;
1742 iodev->supported_channel_counts[1] = 0;
1743 }
1744 }
1745 return 0;
1746 }
1747
1748 /*
1749 * Builds software volume scalers for output nodes in the device.
1750 */
build_softvol_scalers(struct alsa_io * aio)1751 static void build_softvol_scalers(struct alsa_io *aio)
1752 {
1753 struct cras_ionode *ionode;
1754
1755 DL_FOREACH (aio->base.nodes, ionode) {
1756 struct alsa_output_node *aout;
1757 const struct cras_volume_curve *curve;
1758
1759 aout = (struct alsa_output_node *)ionode;
1760 curve = get_curve_for_output_node(aio, aout);
1761
1762 ionode->softvol_scalers = softvol_build_from_curve(curve);
1763 }
1764 }
1765
enable_active_ucm(struct alsa_io * aio,int plugged)1766 static void enable_active_ucm(struct alsa_io *aio, int plugged)
1767 {
1768 const struct cras_alsa_jack *jack;
1769 const char *name;
1770
1771 if (aio->base.direction == CRAS_STREAM_OUTPUT) {
1772 struct alsa_output_node *active = get_active_output(aio);
1773 if (!active)
1774 return;
1775 name = active->base.name;
1776 jack = active->jack;
1777 } else {
1778 struct alsa_input_node *active = get_active_input(aio);
1779 if (!active)
1780 return;
1781 name = active->base.name;
1782 jack = active->jack;
1783 }
1784
1785 if (jack)
1786 cras_alsa_jack_enable_ucm(jack, plugged);
1787 else if (aio->ucm)
1788 ucm_set_enabled(aio->ucm, name, plugged);
1789 }
1790
fill_whole_buffer_with_zeros(struct cras_iodev * iodev)1791 static int fill_whole_buffer_with_zeros(struct cras_iodev *iodev)
1792 {
1793 struct alsa_io *aio = (struct alsa_io *)iodev;
1794 int rc;
1795 uint8_t *dst = NULL;
1796 size_t format_bytes;
1797
1798 /* Fill whole buffer with zeros. */
1799 rc = cras_alsa_mmap_get_whole_buffer(aio->handle, &dst);
1800
1801 if (rc < 0) {
1802 syslog(LOG_ERR, "Failed to get whole buffer: %s",
1803 snd_strerror(rc));
1804 return rc;
1805 }
1806
1807 format_bytes = cras_get_format_bytes(iodev->format);
1808 memset(dst, 0, iodev->buffer_size * format_bytes);
1809
1810 return 0;
1811 }
1812
1813 /*
1814 * Move appl_ptr to min_buffer_level + min_cb_level frames ahead of hw_ptr
1815 * when resuming from free run.
1816 */
adjust_appl_ptr_for_leaving_free_run(struct cras_iodev * odev)1817 static int adjust_appl_ptr_for_leaving_free_run(struct cras_iodev *odev)
1818 {
1819 struct alsa_io *aio = (struct alsa_io *)odev;
1820 snd_pcm_uframes_t ahead;
1821
1822 ahead = odev->min_buffer_level + odev->min_cb_level;
1823 return cras_alsa_resume_appl_ptr(aio->handle, ahead);
1824 }
1825
1826 /*
1827 * Move appl_ptr to min_buffer_level + min_cb_level * 1.5 frames ahead of
1828 * hw_ptr when adjusting appl_ptr from underrun.
1829 */
adjust_appl_ptr_for_underrun(struct cras_iodev * odev)1830 static int adjust_appl_ptr_for_underrun(struct cras_iodev *odev)
1831 {
1832 struct alsa_io *aio = (struct alsa_io *)odev;
1833 snd_pcm_uframes_t ahead;
1834
1835 ahead = odev->min_buffer_level + odev->min_cb_level +
1836 odev->min_cb_level / 2;
1837 return cras_alsa_resume_appl_ptr(aio->handle, ahead);
1838 }
1839
1840 /* This function is for leaving no-stream state but still not in free run yet.
1841 * The device may have valid samples remaining. We need to adjust appl_ptr to
1842 * the correct position, which is MAX(min_cb_level + min_buffer_level,
1843 * valid_sample) */
adjust_appl_ptr_samples_remaining(struct cras_iodev * odev)1844 static int adjust_appl_ptr_samples_remaining(struct cras_iodev *odev)
1845 {
1846 struct alsa_io *aio = (struct alsa_io *)odev;
1847 int rc;
1848 unsigned int real_hw_level, valid_sample, offset;
1849 struct timespec hw_tstamp;
1850
1851 /* Get the amount of valid samples which haven't been played yet.
1852 * The real_hw_level is the real hw_level in device buffer. It doesn't
1853 * subtract min_buffer_level. */
1854 valid_sample = 0;
1855 rc = odev->frames_queued(odev, &hw_tstamp);
1856 if (rc < 0)
1857 return rc;
1858 real_hw_level = rc;
1859
1860 /*
1861 * If underrun happened, handle it. Because alsa_output_underrun function
1862 * has already called adjust_appl_ptr, we don't need to call it again.
1863 */
1864 if (real_hw_level <= odev->min_buffer_level)
1865 return cras_iodev_output_underrun(odev, real_hw_level, 0);
1866
1867 if (real_hw_level > aio->filled_zeros_for_draining)
1868 valid_sample = real_hw_level - aio->filled_zeros_for_draining;
1869
1870 offset = MAX(odev->min_buffer_level + odev->min_cb_level, valid_sample);
1871
1872 /* Fill zeros to make sure there are enough zero samples in device buffer.*/
1873 if (offset > real_hw_level) {
1874 rc = cras_iodev_fill_odev_zeros(odev, offset - real_hw_level);
1875 if (rc)
1876 return rc;
1877 }
1878 return cras_alsa_resume_appl_ptr(aio->handle, offset);
1879 }
1880
alsa_output_underrun(struct cras_iodev * odev)1881 static int alsa_output_underrun(struct cras_iodev *odev)
1882 {
1883 int rc;
1884
1885 /* Fill whole buffer with zeros. This avoids samples left in buffer causing
1886 * noise when device plays them. */
1887 rc = fill_whole_buffer_with_zeros(odev);
1888 if (rc)
1889 return rc;
1890 /* Adjust appl_ptr to leave underrun. */
1891 return adjust_appl_ptr_for_underrun(odev);
1892 }
1893
possibly_enter_free_run(struct cras_iodev * odev)1894 static int possibly_enter_free_run(struct cras_iodev *odev)
1895 {
1896 struct alsa_io *aio = (struct alsa_io *)odev;
1897 int rc;
1898 unsigned int real_hw_level, fr_to_write;
1899 struct timespec hw_tstamp;
1900
1901 if (aio->free_running)
1902 return 0;
1903
1904 /* Check if all valid samples are played. If all valid samples are played,
1905 * fill whole buffer with zeros. The real_hw_level is the real hw_level in
1906 * device buffer. It doesn't subtract min_buffer_level.*/
1907 rc = odev->frames_queued(odev, &hw_tstamp);
1908 if (rc < 0)
1909 return rc;
1910 real_hw_level = rc;
1911
1912 /* If underrun happened, handle it and enter free run state. */
1913 if (real_hw_level <= odev->min_buffer_level) {
1914 rc = cras_iodev_output_underrun(odev, real_hw_level, 0);
1915 if (rc < 0)
1916 return rc;
1917 aio->free_running = 1;
1918 return 0;
1919 }
1920
1921 if (real_hw_level <= aio->filled_zeros_for_draining ||
1922 real_hw_level == 0) {
1923 rc = fill_whole_buffer_with_zeros(odev);
1924 if (rc < 0)
1925 return rc;
1926 aio->free_running = 1;
1927 return 0;
1928 }
1929
1930 /* Fill zeros to drain valid samples. */
1931 fr_to_write = MIN(cras_time_to_frames(&no_stream_fill_zeros_duration,
1932 odev->format->frame_rate),
1933 odev->buffer_size - real_hw_level);
1934 rc = cras_iodev_fill_odev_zeros(odev, fr_to_write);
1935 if (rc)
1936 return rc;
1937 aio->filled_zeros_for_draining += fr_to_write;
1938
1939 return 0;
1940 }
1941
leave_free_run(struct cras_iodev * odev)1942 static int leave_free_run(struct cras_iodev *odev)
1943 {
1944 struct alsa_io *aio = (struct alsa_io *)odev;
1945 int rc;
1946
1947 /* Restart rate estimation because free run internval should not
1948 * be included. */
1949 cras_iodev_reset_rate_estimator(odev);
1950
1951 if (aio->free_running)
1952 rc = adjust_appl_ptr_for_leaving_free_run(odev);
1953 else
1954 rc = adjust_appl_ptr_samples_remaining(odev);
1955 if (rc) {
1956 syslog(LOG_ERR, "device %s failed to leave free run, rc = %d",
1957 odev->info.name, rc);
1958 return rc;
1959 }
1960 aio->free_running = 0;
1961 aio->filled_zeros_for_draining = 0;
1962
1963 return 0;
1964 }
1965
1966 /*
1967 * Free run state is the optimization of no_stream playback on alsa_io.
1968 * The whole buffer will be filled with zeros. Device can play these zeros
1969 * indefinitely. When there is new meaningful sample, appl_ptr should be
1970 * resumed to some distance ahead of hw_ptr.
1971 */
no_stream(struct cras_iodev * odev,int enable)1972 static int no_stream(struct cras_iodev *odev, int enable)
1973 {
1974 if (enable)
1975 return possibly_enter_free_run(odev);
1976 else
1977 return leave_free_run(odev);
1978 }
1979
is_free_running(const struct cras_iodev * odev)1980 static int is_free_running(const struct cras_iodev *odev)
1981 {
1982 struct alsa_io *aio = (struct alsa_io *)odev;
1983
1984 return aio->free_running;
1985 }
1986
get_num_severe_underruns(const struct cras_iodev * iodev)1987 static unsigned int get_num_severe_underruns(const struct cras_iodev *iodev)
1988 {
1989 const struct alsa_io *aio = (const struct alsa_io *)iodev;
1990 return aio->num_severe_underruns;
1991 }
1992
set_default_hotword_model(struct cras_iodev * iodev)1993 static void set_default_hotword_model(struct cras_iodev *iodev)
1994 {
1995 const char *default_models[] = { "en_all", "en_us" };
1996 cras_node_id_t node_id;
1997 unsigned i;
1998
1999 if (!iodev->active_node ||
2000 iodev->active_node->type != CRAS_NODE_TYPE_HOTWORD)
2001 return;
2002
2003 node_id = cras_make_node_id(iodev->info.idx, iodev->active_node->idx);
2004 /* This is a no-op if the default_model is not supported */
2005 for (i = 0; i < ARRAY_SIZE(default_models); ++i)
2006 if (!cras_iodev_list_set_hotword_model(node_id,
2007 default_models[i]))
2008 return;
2009 }
2010
get_valid_frames(struct cras_iodev * odev,struct timespec * tstamp)2011 static int get_valid_frames(struct cras_iodev *odev, struct timespec *tstamp)
2012 {
2013 struct alsa_io *aio = (struct alsa_io *)odev;
2014 int rc;
2015 unsigned int real_hw_level;
2016
2017 /*
2018 * Get the amount of valid frames which haven't been played yet.
2019 * The real_hw_level is the real hw_level in device buffer. It doesn't
2020 * subtract min_buffer_level.
2021 */
2022 if (aio->free_running) {
2023 clock_gettime(CLOCK_MONOTONIC_RAW, tstamp);
2024 return 0;
2025 }
2026
2027 rc = odev->frames_queued(odev, tstamp);
2028 if (rc < 0)
2029 return rc;
2030 real_hw_level = rc;
2031
2032 if (real_hw_level > aio->filled_zeros_for_draining)
2033 return real_hw_level - aio->filled_zeros_for_draining;
2034
2035 return 0;
2036 }
2037
support_noise_cancellation(const struct cras_iodev * iodev)2038 static int support_noise_cancellation(const struct cras_iodev *iodev)
2039 {
2040 struct alsa_io *aio = (struct alsa_io *)iodev;
2041
2042 if (!aio->ucm || !iodev->active_node)
2043 return 0;
2044
2045 return ucm_node_noise_cancellation_exists(aio->ucm,
2046 iodev->active_node->name);
2047 }
2048
2049 /*
2050 * Exported Interface.
2051 */
2052
2053 struct cras_iodev *
alsa_iodev_create(size_t card_index,const char * card_name,size_t device_index,const char * pcm_name,const char * dev_name,const char * dev_id,enum CRAS_ALSA_CARD_TYPE card_type,int is_first,struct cras_alsa_mixer * mixer,const struct cras_card_config * config,struct cras_use_case_mgr * ucm,snd_hctl_t * hctl,enum CRAS_STREAM_DIRECTION direction,size_t usb_vid,size_t usb_pid,char * usb_serial_number)2054 alsa_iodev_create(size_t card_index, const char *card_name, size_t device_index,
2055 const char *pcm_name, const char *dev_name,
2056 const char *dev_id, enum CRAS_ALSA_CARD_TYPE card_type,
2057 int is_first, struct cras_alsa_mixer *mixer,
2058 const struct cras_card_config *config,
2059 struct cras_use_case_mgr *ucm, snd_hctl_t *hctl,
2060 enum CRAS_STREAM_DIRECTION direction, size_t usb_vid,
2061 size_t usb_pid, char *usb_serial_number)
2062 {
2063 struct alsa_io *aio;
2064 struct cras_iodev *iodev;
2065
2066 if (direction != CRAS_STREAM_INPUT && direction != CRAS_STREAM_OUTPUT)
2067 return NULL;
2068
2069 aio = (struct alsa_io *)calloc(1, sizeof(*aio));
2070 if (!aio)
2071 return NULL;
2072 iodev = &aio->base;
2073 iodev->direction = direction;
2074
2075 aio->device_index = device_index;
2076 aio->card_type = card_type;
2077 aio->is_first = is_first;
2078 aio->handle = NULL;
2079 aio->num_severe_underruns = 0;
2080 if (dev_name) {
2081 aio->dev_name = strdup(dev_name);
2082 if (!aio->dev_name)
2083 goto cleanup_iodev;
2084 }
2085 if (dev_id) {
2086 aio->dev_id = strdup(dev_id);
2087 if (!aio->dev_id)
2088 goto cleanup_iodev;
2089 }
2090 aio->free_running = 0;
2091 aio->filled_zeros_for_draining = 0;
2092 aio->has_dependent_dev = 0;
2093 aio->pcm_name = strdup(pcm_name);
2094 if (aio->pcm_name == NULL)
2095 goto cleanup_iodev;
2096
2097 if (direction == CRAS_STREAM_INPUT) {
2098 aio->alsa_stream = SND_PCM_STREAM_CAPTURE;
2099 aio->base.set_capture_gain = set_alsa_capture_gain;
2100 aio->base.set_capture_mute = set_alsa_capture_gain;
2101 } else {
2102 aio->alsa_stream = SND_PCM_STREAM_PLAYBACK;
2103 aio->base.set_volume = set_alsa_volume;
2104 aio->base.set_mute = set_alsa_mute;
2105 aio->base.output_underrun = alsa_output_underrun;
2106 }
2107 iodev->open_dev = open_dev;
2108 iodev->configure_dev = configure_dev;
2109 iodev->close_dev = close_dev;
2110 iodev->update_supported_formats = update_supported_formats;
2111 iodev->frames_queued = frames_queued;
2112 iodev->delay_frames = delay_frames;
2113 iodev->get_buffer = get_buffer;
2114 iodev->put_buffer = put_buffer;
2115 iodev->flush_buffer = flush_buffer;
2116 iodev->start = start;
2117 iodev->update_active_node = update_active_node;
2118 iodev->update_channel_layout = update_channel_layout;
2119 iodev->set_hotword_model = set_hotword_model;
2120 iodev->get_hotword_models = get_hotword_models;
2121 iodev->no_stream = no_stream;
2122 iodev->is_free_running = is_free_running;
2123 iodev->get_num_severe_underruns = get_num_severe_underruns;
2124 iodev->get_valid_frames = get_valid_frames;
2125 iodev->set_swap_mode_for_node = cras_iodev_dsp_set_swap_mode_for_node;
2126 iodev->support_noise_cancellation = support_noise_cancellation;
2127
2128 if (card_type == ALSA_CARD_TYPE_USB)
2129 iodev->min_buffer_level = USB_EXTRA_BUFFER_FRAMES;
2130
2131 iodev->ramp = cras_ramp_create();
2132 if (iodev->ramp == NULL)
2133 goto cleanup_iodev;
2134 iodev->initial_ramp_request = CRAS_IODEV_RAMP_REQUEST_UP_START_PLAYBACK;
2135
2136 aio->mixer = mixer;
2137 aio->config = config;
2138 if (direction == CRAS_STREAM_OUTPUT) {
2139 aio->default_volume_curve =
2140 cras_card_config_get_volume_curve_for_control(
2141 config, "Default");
2142 if (aio->default_volume_curve == NULL)
2143 aio->default_volume_curve =
2144 cras_volume_curve_create_default();
2145 }
2146 aio->ucm = ucm;
2147 if (ucm) {
2148 unsigned int level;
2149 int rc;
2150
2151 /* Set callback for swap mode if it is supported
2152 * in ucm modifier. */
2153 if (ucm_swap_mode_exists(ucm))
2154 aio->base.set_swap_mode_for_node =
2155 set_alsa_node_swapped;
2156
2157 rc = ucm_get_min_buffer_level(ucm, &level);
2158 if (!rc && direction == CRAS_STREAM_OUTPUT)
2159 iodev->min_buffer_level = level;
2160 }
2161
2162 set_iodev_name(iodev, card_name, dev_name, card_index, device_index,
2163 card_type, usb_vid, usb_pid, usb_serial_number);
2164
2165 aio->jack_list = cras_alsa_jack_list_create(
2166 card_index, card_name, device_index, is_first, mixer, ucm, hctl,
2167 direction,
2168 direction == CRAS_STREAM_OUTPUT ? jack_output_plug_event :
2169 jack_input_plug_event,
2170 aio);
2171 if (!aio->jack_list)
2172 goto cleanup_iodev;
2173
2174 /* HDMI outputs don't have volume adjustment, do it in software. */
2175 if (direction == CRAS_STREAM_OUTPUT && strstr(dev_name, HDMI))
2176 iodev->software_volume_needed = 1;
2177
2178 /* Add this now so that cleanup of the iodev (in case of error or card
2179 * card removal will function as expected. */
2180 if (direction == CRAS_STREAM_OUTPUT)
2181 cras_iodev_list_add_output(&aio->base);
2182 else
2183 cras_iodev_list_add_input(&aio->base);
2184 return &aio->base;
2185
2186 cleanup_iodev:
2187 free_alsa_iodev_resources(aio);
2188 free(aio);
2189 return NULL;
2190 }
2191
alsa_iodev_legacy_complete_init(struct cras_iodev * iodev)2192 int alsa_iodev_legacy_complete_init(struct cras_iodev *iodev)
2193 {
2194 struct alsa_io *aio = (struct alsa_io *)iodev;
2195 const char *dev_name;
2196 const char *dev_id;
2197 enum CRAS_STREAM_DIRECTION direction;
2198 int err;
2199 int is_first;
2200 struct cras_alsa_mixer *mixer;
2201
2202 if (!aio)
2203 return -EINVAL;
2204 direction = iodev->direction;
2205 dev_name = aio->dev_name;
2206 dev_id = aio->dev_id;
2207 is_first = aio->is_first;
2208 mixer = aio->mixer;
2209
2210 /* Create output nodes for mixer controls, such as Headphone
2211 * and Speaker, only for the first device. */
2212 if (direction == CRAS_STREAM_OUTPUT && is_first)
2213 cras_alsa_mixer_list_outputs(mixer, new_output_by_mixer_control,
2214 aio);
2215 else if (direction == CRAS_STREAM_INPUT && is_first)
2216 cras_alsa_mixer_list_inputs(mixer, new_input_by_mixer_control,
2217 aio);
2218
2219 err = cras_alsa_jack_list_find_jacks_by_name_matching(aio->jack_list);
2220 if (err)
2221 return err;
2222
2223 /* Create nodes for jacks that aren't associated with an
2224 * already existing node. Get an initial read of the jacks for
2225 * this device. */
2226 cras_alsa_jack_list_report(aio->jack_list);
2227
2228 /* Make a default node if there is still no node for this
2229 * device, or we still don't have the "Speaker"/"Internal Mic"
2230 * node for the first internal device. Note that the default
2231 * node creation can be supressed by UCM flags for platforms
2232 * which really don't have an internal device. */
2233 if ((direction == CRAS_STREAM_OUTPUT) &&
2234 !no_create_default_output_node(aio)) {
2235 if (first_internal_device(aio) &&
2236 !has_node(aio, INTERNAL_SPEAKER) && !has_node(aio, HDMI)) {
2237 if (strstr(aio->base.info.name, HDMI))
2238 new_output(aio, NULL, HDMI);
2239 else
2240 new_output(aio, NULL, INTERNAL_SPEAKER);
2241 } else if (!aio->base.nodes) {
2242 new_output(aio, NULL, DEFAULT);
2243 }
2244 } else if ((direction == CRAS_STREAM_INPUT) &&
2245 !no_create_default_input_node(aio)) {
2246 if (first_internal_device(aio) &&
2247 !has_node(aio, INTERNAL_MICROPHONE))
2248 new_input(aio, NULL, INTERNAL_MICROPHONE);
2249 else if (strstr(dev_name, KEYBOARD_MIC))
2250 new_input(aio, NULL, KEYBOARD_MIC);
2251 else if (dev_id && strstr(dev_id, HOTWORD_DEV))
2252 new_input(aio, NULL, HOTWORD_DEV);
2253 else if (!aio->base.nodes)
2254 new_input(aio, NULL, DEFAULT);
2255 }
2256
2257 /* Build software volume scalers. */
2258 if (direction == CRAS_STREAM_OUTPUT)
2259 build_softvol_scalers(aio);
2260
2261 /* Set the active node as the best node we have now. */
2262 alsa_iodev_set_active_node(&aio->base, first_plugged_node(&aio->base),
2263 0);
2264
2265 /* Set plugged for the first USB device per card when it appears if
2266 * there is no jack reporting plug status. */
2267 if (aio->card_type == ALSA_CARD_TYPE_USB && is_first &&
2268 !get_jack_from_node(iodev->active_node))
2269 cras_iodev_set_node_plugged(iodev->active_node, 1);
2270
2271 set_default_hotword_model(iodev);
2272
2273 /* Record max supported channels into cras_iodev_info. */
2274 update_max_supported_channels(iodev);
2275
2276 return 0;
2277 }
2278
alsa_iodev_ucm_add_nodes_and_jacks(struct cras_iodev * iodev,struct ucm_section * section)2279 int alsa_iodev_ucm_add_nodes_and_jacks(struct cras_iodev *iodev,
2280 struct ucm_section *section)
2281 {
2282 struct alsa_io *aio = (struct alsa_io *)iodev;
2283 struct mixer_control *control;
2284 struct alsa_input_node *input_node = NULL;
2285 struct cras_alsa_jack *jack;
2286 struct alsa_output_node *output_node = NULL;
2287 int rc;
2288
2289 if (!aio || !section)
2290 return -EINVAL;
2291
2292 /* Allow this section to add as a new node only if the device id
2293 * or dependent device id matches this iodev. */
2294 if (((uint32_t)section->dev_idx != aio->device_index) &&
2295 ((uint32_t)section->dependent_dev_idx != aio->device_index))
2296 return -EINVAL;
2297
2298 /* Set flag has_dependent_dev for the case of dependent device. */
2299 if (section->dependent_dev_idx != -1)
2300 aio->has_dependent_dev = 1;
2301
2302 /* This iodev is fully specified. Avoid automatic node creation. */
2303 aio->fully_specified = 1;
2304
2305 /* Check here in case the DmaPeriodMicrosecs flag has only been
2306 * specified on one of many device entries with the same PCM. */
2307 if (!aio->dma_period_set_microsecs)
2308 aio->dma_period_set_microsecs =
2309 ucm_get_dma_period_for_dev(aio->ucm, section->name);
2310
2311 /* Create a node matching this section. If there is a matching
2312 * control use that, otherwise make a node without a control. */
2313 control = cras_alsa_mixer_get_control_for_section(aio->mixer, section);
2314 if (iodev->direction == CRAS_STREAM_OUTPUT) {
2315 output_node = new_output(aio, control, section->name);
2316 if (!output_node)
2317 return -ENOMEM;
2318 output_node->pcm_name = strdup(section->pcm_name);
2319 } else if (iodev->direction == CRAS_STREAM_INPUT) {
2320 input_node = new_input(aio, control, section->name);
2321 if (!input_node)
2322 return -ENOMEM;
2323 input_node->pcm_name = strdup(section->pcm_name);
2324 }
2325
2326 /* Find any jack controls for this device. */
2327 rc = cras_alsa_jack_list_add_jack_for_section(aio->jack_list, section,
2328 &jack);
2329 if (rc)
2330 return rc;
2331
2332 /* Associated the jack with the node. */
2333 if (jack) {
2334 if (output_node) {
2335 output_node->jack = jack;
2336 if (!output_node->volume_curve)
2337 output_node->volume_curve =
2338 create_volume_curve_for_jack(
2339 aio->config, jack);
2340 } else if (input_node) {
2341 input_node->jack = jack;
2342 }
2343 }
2344 return 0;
2345 }
2346
alsa_iodev_ucm_complete_init(struct cras_iodev * iodev)2347 void alsa_iodev_ucm_complete_init(struct cras_iodev *iodev)
2348 {
2349 struct alsa_io *aio = (struct alsa_io *)iodev;
2350 struct cras_ionode *node;
2351
2352 if (!iodev)
2353 return;
2354
2355 /* Get an initial read of the jacks for this device. */
2356 cras_alsa_jack_list_report(aio->jack_list);
2357
2358 /* Build software volume scaler. */
2359 if (iodev->direction == CRAS_STREAM_OUTPUT)
2360 build_softvol_scalers(aio);
2361
2362 /* Set the active node as the best node we have now. */
2363 alsa_iodev_set_active_node(&aio->base, first_plugged_node(&aio->base),
2364 0);
2365
2366 /*
2367 * Set plugged for the USB device per card when it appears if
2368 * there is no jack reporting plug status
2369 */
2370 if (aio->card_type == ALSA_CARD_TYPE_USB) {
2371 DL_FOREACH (iodev->nodes, node) {
2372 if (!get_jack_from_node(node))
2373 cras_iodev_set_node_plugged(node, 1);
2374 }
2375 }
2376
2377 set_default_hotword_model(iodev);
2378
2379 node = iodev->active_node;
2380
2381 /* Record max supported channels into cras_iodev_info. */
2382 if (node && node->plugged)
2383 update_max_supported_channels(iodev);
2384 }
2385
alsa_iodev_destroy(struct cras_iodev * iodev)2386 void alsa_iodev_destroy(struct cras_iodev *iodev)
2387 {
2388 struct alsa_io *aio = (struct alsa_io *)iodev;
2389 int rc;
2390
2391 if (iodev->direction == CRAS_STREAM_INPUT)
2392 rc = cras_iodev_list_rm_input(iodev);
2393 else
2394 rc = cras_iodev_list_rm_output(iodev);
2395
2396 if (rc == -EBUSY) {
2397 syslog(LOG_ERR, "Failed to remove iodev %s", iodev->info.name);
2398 return;
2399 }
2400
2401 /* Free resources when device successfully removed. */
2402 cras_alsa_jack_list_destroy(aio->jack_list);
2403 free_alsa_iodev_resources(aio);
2404 cras_volume_curve_destroy(aio->default_volume_curve);
2405 free(iodev);
2406 }
2407
alsa_iodev_index(struct cras_iodev * iodev)2408 unsigned alsa_iodev_index(struct cras_iodev *iodev)
2409 {
2410 struct alsa_io *aio = (struct alsa_io *)iodev;
2411 return aio->device_index;
2412 }
2413
alsa_iodev_has_hctl_jacks(struct cras_iodev * iodev)2414 int alsa_iodev_has_hctl_jacks(struct cras_iodev *iodev)
2415 {
2416 struct alsa_io *aio = (struct alsa_io *)iodev;
2417 return cras_alsa_jack_list_has_hctl_jacks(aio->jack_list);
2418 }
2419
alsa_iodev_unmute_node(struct alsa_io * aio,struct cras_ionode * ionode)2420 static void alsa_iodev_unmute_node(struct alsa_io *aio,
2421 struct cras_ionode *ionode)
2422 {
2423 struct alsa_output_node *active = (struct alsa_output_node *)ionode;
2424 struct mixer_control *mixer = active->mixer_output;
2425 struct alsa_output_node *output;
2426 struct cras_ionode *node;
2427
2428 /* If this node is associated with mixer output, unmute the
2429 * active mixer output and mute all others, otherwise just set
2430 * the node as active and set the volume curve. */
2431 if (mixer) {
2432 /* Unmute the active mixer output, mute all others. */
2433 DL_FOREACH (aio->base.nodes, node) {
2434 output = (struct alsa_output_node *)node;
2435 if (output->mixer_output)
2436 cras_alsa_mixer_set_output_active_state(
2437 output->mixer_output, node == ionode);
2438 }
2439 }
2440 }
2441
alsa_iodev_set_active_node(struct cras_iodev * iodev,struct cras_ionode * ionode,unsigned dev_enabled)2442 static int alsa_iodev_set_active_node(struct cras_iodev *iodev,
2443 struct cras_ionode *ionode,
2444 unsigned dev_enabled)
2445 {
2446 struct alsa_io *aio = (struct alsa_io *)iodev;
2447 int rc = 0;
2448
2449 if (iodev->active_node == ionode)
2450 goto skip;
2451
2452 /* Disable jack ucm before switching node. */
2453 enable_active_ucm(aio, 0);
2454 if (dev_enabled && (iodev->direction == CRAS_STREAM_OUTPUT))
2455 alsa_iodev_unmute_node(aio, ionode);
2456
2457 cras_iodev_set_active_node(iodev, ionode);
2458 aio->base.dsp_name = get_active_dsp_name(aio);
2459 cras_iodev_update_dsp(iodev);
2460 skip:
2461 enable_active_ucm(aio, dev_enabled);
2462 if (ionode->type == CRAS_NODE_TYPE_HOTWORD) {
2463 if (dev_enabled) {
2464 rc = ucm_enable_hotword_model(aio->ucm);
2465 if (rc < 0)
2466 return rc;
2467 } else
2468 ucm_disable_all_hotword_models(aio->ucm);
2469 }
2470 /* Setting the volume will also unmute if the system isn't muted. */
2471 init_device_settings(aio);
2472 return 0;
2473 }
2474