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