Home | History | Annotate | Download | only in server
      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 #ifndef _GNU_SOURCE
      7 #define _GNU_SOURCE /* For asprintf */
      8 #endif
      9 
     10 #include <alsa/asoundlib.h>
     11 #include <syslog.h>
     12 
     13 #include "cras_alsa_card.h"
     14 #include "cras_alsa_io.h"
     15 #include "cras_alsa_mixer.h"
     16 #include "cras_alsa_ucm.h"
     17 #include "cras_device_blacklist.h"
     18 #include "cras_card_config.h"
     19 #include "cras_config.h"
     20 #include "cras_iodev.h"
     21 #include "cras_iodev_list.h"
     22 #include "cras_system_state.h"
     23 #include "cras_types.h"
     24 #include "cras_util.h"
     25 #include "utlist.h"
     26 
     27 #define MAX_ALSA_CARDS 32 /* Alsa limit on number of cards. */
     28 #define MAX_ALSA_PCM_NAME_LENGTH 6 /* Alsa names "hw:XX" + 1 for null. */
     29 #define MAX_INI_NAME_LENGTH 63 /* 63 chars + 1 for null where declared. */
     30 #define MAX_COUPLED_OUTPUT_SIZE 4
     31 
     32 struct iodev_list_node {
     33 	struct cras_iodev *iodev;
     34 	enum CRAS_STREAM_DIRECTION direction;
     35 	struct iodev_list_node *prev, *next;
     36 };
     37 
     38 /* Keeps an fd that is registered with system state.  A list of fds must be
     39  * kept so that they can be removed when the card is destroyed. */
     40 struct hctl_poll_fd {
     41 	int fd;
     42 	struct hctl_poll_fd *prev, *next;
     43 };
     44 
     45 /* Holds information about each sound card on the system.
     46  * name - of the form hw:XX,YY.
     47  * card_index - 0 based index, value of "XX" in the name.
     48  * iodevs - Input and output devices for this card.
     49  * mixer - Controls the mixer controls for this card.
     50  * ucm - CRAS use case manager if available.
     51  * hctl - ALSA high-level control interface.
     52  * hctl_poll_fds - List of fds registered with cras_system_state.
     53  * config - Config info for this card, can be NULL if none found.
     54  */
     55 struct cras_alsa_card {
     56 	char name[MAX_ALSA_PCM_NAME_LENGTH];
     57 	size_t card_index;
     58 	struct iodev_list_node *iodevs;
     59 	struct cras_alsa_mixer *mixer;
     60 	struct cras_use_case_mgr *ucm;
     61 	snd_hctl_t *hctl;
     62 	struct hctl_poll_fd *hctl_poll_fds;
     63 	struct cras_card_config *config;
     64 };
     65 
     66 /* Creates an iodev for the given device.
     67  * Args:
     68  *    alsa_card - the alsa_card the device will be added to.
     69  *    info - Information about the card type and priority.
     70  *    card_name - The name of the card.
     71  *    dev_name - The name of the device.
     72  *    dev_id - The id string of the device.
     73  *    device_index - 0 based index, value of "YY" in "hw:XX,YY".
     74  *    direction - Input or output.
     75  * Returns:
     76  *    Pointer to the created iodev, or NULL on error.
     77  *    other negative error code otherwise.
     78  */
     79 struct cras_iodev *create_iodev_for_device(
     80 		struct cras_alsa_card *alsa_card,
     81 		struct cras_alsa_card_info *info,
     82 		const char *card_name,
     83 		const char *dev_name,
     84 		const char *dev_id,
     85 		unsigned device_index,
     86 		enum CRAS_STREAM_DIRECTION direction)
     87 {
     88 	struct iodev_list_node *new_dev;
     89 	struct iodev_list_node *node;
     90 	int first = 1;
     91 
     92 	/* Find whether this is the first device in this direction, and
     93 	 * avoid duplicate device indexes. */
     94 	DL_FOREACH(alsa_card->iodevs, node) {
     95 		if (node->direction != direction)
     96 			continue;
     97 		first = 0;
     98 		if (alsa_iodev_index(node->iodev) == device_index) {
     99 			syslog(LOG_DEBUG,
    100 			       "Skipping duplicate device for %s:%s:%s [%u]",
    101 			       card_name, dev_name, dev_id, device_index);
    102 			return node->iodev;
    103 		}
    104 	}
    105 
    106 	new_dev = calloc(1, sizeof(*new_dev));
    107 	if (new_dev == NULL)
    108 		return NULL;
    109 
    110 	new_dev->direction = direction;
    111 	new_dev->iodev = alsa_iodev_create(info->card_index,
    112 					   card_name,
    113 					   device_index,
    114 					   dev_name,
    115 					   dev_id,
    116 					   info->card_type,
    117 					   first,
    118 					   alsa_card->mixer,
    119 					   alsa_card->config,
    120 					   alsa_card->ucm,
    121 					   alsa_card->hctl,
    122 					   direction,
    123 					   info->usb_vendor_id,
    124 					   info->usb_product_id,
    125 					   info->usb_serial_number);
    126 	if (new_dev->iodev == NULL) {
    127 		syslog(LOG_ERR, "Couldn't create alsa_iodev for %u:%u\n",
    128 		       info->card_index, device_index);
    129 		free(new_dev);
    130 		return NULL;
    131 	}
    132 
    133 	syslog(LOG_DEBUG, "New %s device %u:%d",
    134 	       direction == CRAS_STREAM_OUTPUT ? "playback" : "capture",
    135 	       info->card_index,
    136 	       device_index);
    137 
    138 	DL_APPEND(alsa_card->iodevs, new_dev);
    139 	return new_dev->iodev;
    140 }
    141 
    142 /* Returns non-zero if this card has hctl jacks.
    143  */
    144 static int card_has_hctl_jack(struct cras_alsa_card *alsa_card)
    145 {
    146 	struct iodev_list_node *node;
    147 
    148 	/* Find the first device that has an hctl jack. */
    149 	DL_FOREACH(alsa_card->iodevs, node) {
    150 		if (alsa_iodev_has_hctl_jacks(node->iodev))
    151 			return 1;
    152 	}
    153 	return 0;
    154 }
    155 
    156 /* Check if a device should be ignored for this card. Returns non-zero if the
    157  * device is in the blacklist and should be ignored.
    158  */
    159 static int should_ignore_dev(struct cras_alsa_card_info *info,
    160 			     struct cras_device_blacklist *blacklist,
    161 			     size_t device_index)
    162 {
    163 	if (info->card_type == ALSA_CARD_TYPE_USB)
    164 		return cras_device_blacklist_check(blacklist,
    165 						   info->usb_vendor_id,
    166 						   info->usb_product_id,
    167 						   info->usb_desc_checksum,
    168 						   device_index);
    169 	return 0;
    170 }
    171 
    172 /* Filters an array of mixer control names. Keep a name if it is
    173  * specified in the ucm config. */
    174 static struct mixer_name *filter_controls(struct cras_use_case_mgr *ucm,
    175 					  struct mixer_name *controls)
    176 {
    177 	struct mixer_name *control;
    178 	DL_FOREACH(controls, control) {
    179 		char *dev = ucm_get_dev_for_mixer(ucm, control->name,
    180 						  CRAS_STREAM_OUTPUT);
    181 		if (!dev)
    182 			DL_DELETE(controls, control);
    183 	}
    184 	return controls;
    185 }
    186 
    187 /* Handles notifications from alsa controls.  Called by main thread when a poll
    188  * fd provided by alsa signals there is an event available. */
    189 static void alsa_control_event_pending(void *arg)
    190 {
    191 	struct cras_alsa_card *card;
    192 
    193 	card = (struct cras_alsa_card *)arg;
    194 	if (card == NULL) {
    195 		syslog(LOG_ERR, "Invalid card from control event.");
    196 		return;
    197 	}
    198 
    199 	/* handle_events will trigger the callback registered with each control
    200 	 * that has changed. */
    201 	snd_hctl_handle_events(card->hctl);
    202 }
    203 
    204 static int add_controls_and_iodevs_by_matching(
    205 		struct cras_alsa_card_info *info,
    206 		struct cras_device_blacklist *blacklist,
    207 		struct cras_alsa_card *alsa_card,
    208 		const char *card_name,
    209 		snd_ctl_t *handle)
    210 {
    211 	struct mixer_name *coupled_controls = NULL;
    212 	int dev_idx;
    213 	snd_pcm_info_t *dev_info;
    214 	struct mixer_name *extra_controls = NULL;
    215 	int rc = 0;
    216 
    217 	snd_pcm_info_alloca(&dev_info);
    218 
    219 	if (alsa_card->ucm) {
    220 		char *extra_main_volume;
    221 
    222 		/* Filter the extra output mixer names */
    223 		extra_controls =
    224 			filter_controls(alsa_card->ucm,
    225 				mixer_name_add(extra_controls, "IEC958",
    226 					       CRAS_STREAM_OUTPUT,
    227 					       MIXER_NAME_VOLUME));
    228 
    229 		/* Get the extra main volume control. */
    230 		extra_main_volume = ucm_get_flag(alsa_card->ucm,
    231 						 "ExtraMainVolume");
    232 		if (extra_main_volume) {
    233 			extra_controls =
    234 				mixer_name_add(extra_controls,
    235 					       extra_main_volume,
    236 					       CRAS_STREAM_OUTPUT,
    237 					       MIXER_NAME_MAIN_VOLUME);
    238 			free(extra_main_volume);
    239 		}
    240 		mixer_name_dump(extra_controls, "extra controls");
    241 
    242 		/* Check if coupled controls has been specified for speaker. */
    243 		coupled_controls = ucm_get_coupled_mixer_names(
    244 					alsa_card->ucm, "Speaker");
    245 		mixer_name_dump(coupled_controls, "coupled controls");
    246 	}
    247 
    248 	/* Add controls to mixer by name matching. */
    249 	rc = cras_alsa_mixer_add_controls_by_name_matching(
    250 			alsa_card->mixer,
    251 			extra_controls,
    252 			coupled_controls);
    253 	if (rc) {
    254 		syslog(LOG_ERR, "Fail adding controls to mixer for %s.",
    255 		       alsa_card->name);
    256 		goto error;
    257 	}
    258 
    259 	/* Go through every device. */
    260 	dev_idx = -1;
    261 	while (1) {
    262 		rc = snd_ctl_pcm_next_device(handle, &dev_idx);
    263 		if (rc < 0)
    264 			goto error;
    265 		if (dev_idx < 0)
    266 			break;
    267 
    268 		snd_pcm_info_set_device(dev_info, dev_idx);
    269 		snd_pcm_info_set_subdevice(dev_info, 0);
    270 
    271 		/* Check for playback devices. */
    272 		snd_pcm_info_set_stream(
    273 			dev_info, SND_PCM_STREAM_PLAYBACK);
    274 		if (snd_ctl_pcm_info(handle, dev_info) == 0 &&
    275 		    !should_ignore_dev(info, blacklist, dev_idx)) {
    276 			struct cras_iodev *iodev =
    277 				create_iodev_for_device(
    278 					alsa_card,
    279 					info,
    280 					card_name,
    281 					snd_pcm_info_get_name(dev_info),
    282 					snd_pcm_info_get_id(dev_info),
    283 					dev_idx,
    284 					CRAS_STREAM_OUTPUT);
    285 			if (iodev) {
    286 				rc = alsa_iodev_legacy_complete_init(
    287 					iodev);
    288 				if (rc < 0)
    289 					goto error;
    290 			}
    291 		}
    292 
    293 		/* Check for capture devices. */
    294 		snd_pcm_info_set_stream(
    295 			dev_info, SND_PCM_STREAM_CAPTURE);
    296 		if (snd_ctl_pcm_info(handle, dev_info) == 0) {
    297 			struct cras_iodev *iodev =
    298 				create_iodev_for_device(
    299 					alsa_card,
    300 					info,
    301 					card_name,
    302 					snd_pcm_info_get_name(dev_info),
    303 					snd_pcm_info_get_id(dev_info),
    304 					dev_idx,
    305 					CRAS_STREAM_INPUT);
    306 			if (iodev) {
    307 				rc = alsa_iodev_legacy_complete_init(
    308 					iodev);
    309 				if (rc < 0)
    310 					goto error;
    311 			}
    312 		}
    313 	}
    314 error:
    315 	mixer_name_free(coupled_controls);
    316 	mixer_name_free(extra_controls);
    317 	return rc;
    318 }
    319 
    320 static int add_controls_and_iodevs_with_ucm(
    321 		struct cras_alsa_card_info *info,
    322 		struct cras_alsa_card *alsa_card,
    323 		const char *card_name,
    324 		snd_ctl_t *handle)
    325 {
    326 	snd_pcm_info_t *dev_info;
    327 	struct iodev_list_node *node;
    328 	int rc = 0;
    329 	struct ucm_section *section;
    330 	struct ucm_section *ucm_sections;
    331 
    332 	snd_pcm_info_alloca(&dev_info);
    333 
    334 	/* Get info on the devices specified in the UCM config. */
    335 	ucm_sections = ucm_get_sections(alsa_card->ucm);
    336 	if (!ucm_sections) {
    337 		syslog(LOG_ERR,
    338 		       "Could not retrieve any UCM SectionDevice"
    339 		       " info for '%s'.", card_name);
    340 		rc = -ENOENT;
    341 		goto error;
    342 	}
    343 
    344 	/* Create all of the controls first. */
    345 	DL_FOREACH(ucm_sections, section) {
    346 		rc = cras_alsa_mixer_add_controls_in_section(
    347 				alsa_card->mixer, section);
    348 		if (rc) {
    349 			syslog(LOG_ERR, "Failed adding controls to"
    350 					" mixer for '%s:%s'",
    351 					card_name,
    352 					section->name);
    353 			goto error;
    354 		}
    355 	}
    356 
    357 	/* Create all of the devices. */
    358 	DL_FOREACH(ucm_sections, section) {
    359 		snd_pcm_info_set_device(dev_info, section->dev_idx);
    360 		snd_pcm_info_set_subdevice(dev_info, 0);
    361 		if (section->dir == CRAS_STREAM_OUTPUT)
    362 			snd_pcm_info_set_stream(
    363 				dev_info, SND_PCM_STREAM_PLAYBACK);
    364 		else if (section->dir == CRAS_STREAM_INPUT)
    365 			snd_pcm_info_set_stream(
    366 				dev_info, SND_PCM_STREAM_CAPTURE);
    367 		else {
    368 			syslog(LOG_ERR, "Unexpected direction: %d",
    369 			       section->dir);
    370 			rc = -EINVAL;
    371 			goto error;
    372 		}
    373 
    374 		if (snd_ctl_pcm_info(handle, dev_info)) {
    375 			syslog(LOG_ERR,
    376 			       "Could not get info for device: %s",
    377 			       section->name);
    378 			continue;
    379 		}
    380 
    381 		create_iodev_for_device(
    382 			alsa_card, info, card_name,
    383 			snd_pcm_info_get_name(dev_info),
    384 			snd_pcm_info_get_id(dev_info),
    385 			section->dev_idx, section->dir);
    386 	}
    387 
    388 	/* Setup jacks and controls for the devices. */
    389 	DL_FOREACH(ucm_sections, section) {
    390 		DL_FOREACH(alsa_card->iodevs, node) {
    391 			if (node->direction == section->dir &&
    392 			    alsa_iodev_index(node->iodev) ==
    393 			    section->dev_idx)
    394 				break;
    395 		}
    396 		if (node) {
    397 			rc = alsa_iodev_ucm_add_nodes_and_jacks(
    398 				node->iodev, section);
    399 			if (rc < 0)
    400 				goto error;
    401 		}
    402 	}
    403 
    404 	DL_FOREACH(alsa_card->iodevs, node) {
    405 		alsa_iodev_ucm_complete_init(node->iodev);
    406 	}
    407 
    408 error:
    409 	ucm_section_free_list(ucm_sections);
    410 	return rc;
    411 }
    412 
    413 /*
    414  * Exported Interface.
    415  */
    416 
    417 struct cras_alsa_card *cras_alsa_card_create(
    418 		struct cras_alsa_card_info *info,
    419 		const char *device_config_dir,
    420 		struct cras_device_blacklist *blacklist,
    421 		const char *ucm_suffix)
    422 {
    423 	snd_ctl_t *handle = NULL;
    424 	int rc, n;
    425 	snd_ctl_card_info_t *card_info;
    426 	const char *card_name;
    427 	struct cras_alsa_card *alsa_card;
    428 
    429 	if (info->card_index >= MAX_ALSA_CARDS) {
    430 		syslog(LOG_ERR,
    431 		       "Invalid alsa card index %u",
    432 		       info->card_index);
    433 		return NULL;
    434 	}
    435 
    436 	snd_ctl_card_info_alloca(&card_info);
    437 
    438 	alsa_card = calloc(1, sizeof(*alsa_card));
    439 	if (alsa_card == NULL)
    440 		return NULL;
    441 	alsa_card->card_index = info->card_index;
    442 
    443 	snprintf(alsa_card->name,
    444 		 MAX_ALSA_PCM_NAME_LENGTH,
    445 		 "hw:%u",
    446 		 info->card_index);
    447 
    448 	rc = snd_ctl_open(&handle, alsa_card->name, 0);
    449 	if (rc < 0) {
    450 		syslog(LOG_ERR, "Fail opening control %s.", alsa_card->name);
    451 		goto error_bail;
    452 	}
    453 
    454 	rc = snd_ctl_card_info(handle, card_info);
    455 	if (rc < 0) {
    456 		syslog(LOG_ERR, "Error getting card info.");
    457 		goto error_bail;
    458 	}
    459 
    460 	card_name = snd_ctl_card_info_get_name(card_info);
    461 	if (card_name == NULL) {
    462 		syslog(LOG_ERR, "Error getting card name.");
    463 		goto error_bail;
    464 	}
    465 
    466 	/* Read config file for this card if it exists. */
    467 	alsa_card->config = cras_card_config_create(device_config_dir,
    468 						    card_name);
    469 	if (alsa_card->config == NULL)
    470 		syslog(LOG_DEBUG, "No config file for %s", alsa_card->name);
    471 
    472 	/* Create a use case manager if a configuration is available. */
    473 	if (ucm_suffix) {
    474 		char *ucm_name;
    475 		if (asprintf(&ucm_name, "%s.%s", card_name, ucm_suffix) == -1) {
    476 			syslog(LOG_ERR, "Error creating ucm name");
    477 			goto error_bail;
    478 		}
    479 		alsa_card->ucm = ucm_create(ucm_name);
    480 		syslog(LOG_INFO, "Card %s (%s) has UCM: %s",
    481 		       alsa_card->name, ucm_name,
    482 		       alsa_card->ucm ? "yes" : "no");
    483 		free(ucm_name);
    484 	} else {
    485 		alsa_card->ucm = ucm_create(card_name);
    486 		syslog(LOG_INFO, "Card %s (%s) has UCM: %s",
    487 		       alsa_card->name, card_name,
    488 		       alsa_card->ucm ? "yes" : "no");
    489 	}
    490 
    491 	rc = snd_hctl_open(&alsa_card->hctl,
    492 			   alsa_card->name,
    493 			   SND_CTL_NONBLOCK);
    494 	if (rc < 0) {
    495 		syslog(LOG_DEBUG,
    496 		       "failed to get hctl for %s", alsa_card->name);
    497 		alsa_card->hctl = NULL;
    498 	} else {
    499 		rc = snd_hctl_nonblock(alsa_card->hctl, 1);
    500 		if (rc < 0) {
    501 			syslog(LOG_ERR,
    502 			    "failed to nonblock hctl for %s", alsa_card->name);
    503 			goto error_bail;
    504 		}
    505 
    506 		rc = snd_hctl_load(alsa_card->hctl);
    507 		if (rc < 0) {
    508 			syslog(LOG_ERR,
    509 			       "failed to load hctl for %s", alsa_card->name);
    510 			goto error_bail;
    511 		}
    512 	}
    513 
    514 	/* Create one mixer per card. */
    515 	alsa_card->mixer = cras_alsa_mixer_create(alsa_card->name);
    516 
    517 	if (alsa_card->mixer == NULL) {
    518 		syslog(LOG_ERR, "Fail opening mixer for %s.", alsa_card->name);
    519 		goto error_bail;
    520 	}
    521 
    522 	if (alsa_card->ucm && ucm_has_fully_specified_ucm_flag(alsa_card->ucm))
    523 		rc = add_controls_and_iodevs_with_ucm(
    524 				info, alsa_card, card_name, handle);
    525 	else
    526 		rc = add_controls_and_iodevs_by_matching(
    527 				info, blacklist, alsa_card, card_name, handle);
    528 	if (rc)
    529 		goto error_bail;
    530 
    531 	n = alsa_card->hctl ?
    532 		snd_hctl_poll_descriptors_count(alsa_card->hctl) : 0;
    533 	if (n != 0 && card_has_hctl_jack(alsa_card)) {
    534 		struct hctl_poll_fd *registered_fd;
    535 		struct pollfd *pollfds;
    536 		int i;
    537 
    538 		pollfds = malloc(n * sizeof(*pollfds));
    539 		if (pollfds == NULL) {
    540 			rc = -ENOMEM;
    541 			goto error_bail;
    542 		}
    543 
    544 		n = snd_hctl_poll_descriptors(alsa_card->hctl, pollfds, n);
    545 		for (i = 0; i < n; i++) {
    546 			registered_fd = calloc(1, sizeof(*registered_fd));
    547 			if (registered_fd == NULL) {
    548 				free(pollfds);
    549 				rc = -ENOMEM;
    550 				goto error_bail;
    551 			}
    552 			registered_fd->fd = pollfds[i].fd;
    553 			DL_APPEND(alsa_card->hctl_poll_fds, registered_fd);
    554 			rc = cras_system_add_select_fd(
    555 					registered_fd->fd,
    556 					alsa_control_event_pending,
    557 					alsa_card);
    558 			if (rc < 0) {
    559 				DL_DELETE(alsa_card->hctl_poll_fds,
    560 					  registered_fd);
    561 				free(pollfds);
    562 				goto error_bail;
    563 			}
    564 		}
    565 		free(pollfds);
    566 	}
    567 
    568 	snd_ctl_close(handle);
    569 	return alsa_card;
    570 
    571 error_bail:
    572 	if (handle != NULL)
    573 		snd_ctl_close(handle);
    574 	cras_alsa_card_destroy(alsa_card);
    575 	return NULL;
    576 }
    577 
    578 void cras_alsa_card_destroy(struct cras_alsa_card *alsa_card)
    579 {
    580 	struct iodev_list_node *curr;
    581 	struct hctl_poll_fd *poll_fd;
    582 
    583 	if (alsa_card == NULL)
    584 		return;
    585 
    586 	DL_FOREACH(alsa_card->iodevs, curr) {
    587 		alsa_iodev_destroy(curr->iodev);
    588 		DL_DELETE(alsa_card->iodevs, curr);
    589 		free(curr);
    590 	}
    591 	DL_FOREACH(alsa_card->hctl_poll_fds, poll_fd) {
    592 		cras_system_rm_select_fd(poll_fd->fd);
    593 		DL_DELETE(alsa_card->hctl_poll_fds, poll_fd);
    594 		free(poll_fd);
    595 	}
    596 	if (alsa_card->hctl)
    597 		snd_hctl_close(alsa_card->hctl);
    598 	if (alsa_card->ucm)
    599 		ucm_destroy(alsa_card->ucm);
    600 	if (alsa_card->mixer)
    601 		cras_alsa_mixer_destroy(alsa_card->mixer);
    602 	if (alsa_card->config)
    603 		cras_card_config_destroy(alsa_card->config);
    604 	free(alsa_card);
    605 }
    606 
    607 size_t cras_alsa_card_get_index(const struct cras_alsa_card *alsa_card)
    608 {
    609 	assert(alsa_card);
    610 	return alsa_card->card_index;
    611 }
    612