1/*** 2 This file is part of PulseAudio. 3 4 Copyright 2009 Lennart Poettering 5 6 PulseAudio is free software; you can redistribute it and/or modify 7 it under the terms of the GNU Lesser General Public License as 8 published by the Free Software Foundation; either version 2.1 of the 9 License, or (at your option) any later version. 10 11 PulseAudio is distributed in the hope that it will be useful, but 12 WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 General Public License for more details. 15 16 You should have received a copy of the GNU Lesser General Public 17 License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>. 18***/ 19 20#ifdef HAVE_CONFIG_H 21#include <config.h> 22#endif 23 24#include <errno.h> 25#include <limits.h> 26#include <dirent.h> 27#include <sys/inotify.h> 28#include <libudev.h> 29 30#include <pulse/timeval.h> 31 32#include <pulsecore/modargs.h> 33#include <pulsecore/core-error.h> 34#include <pulsecore/core-util.h> 35#include <pulsecore/namereg.h> 36#include <pulsecore/ratelimit.h> 37#include <pulsecore/strbuf.h> 38 39PA_MODULE_AUTHOR("Lennart Poettering"); 40PA_MODULE_DESCRIPTION("Detect available audio hardware and load matching drivers"); 41PA_MODULE_VERSION(PACKAGE_VERSION); 42PA_MODULE_LOAD_ONCE(true); 43PA_MODULE_USAGE( 44 "tsched=<enable system timer based scheduling mode?> " 45 "tsched_buffer_size=<buffer size when using timer based scheduling> " 46 "fixed_latency_range=<disable latency range changes on underrun?> " 47 "ignore_dB=<ignore dB information from the device?> " 48 "deferred_volume=<syncronize sw and hw volume changes in IO-thread?> " 49 "use_ucm=<use ALSA UCM for card configuration?> " 50 "avoid_resampling=<use stream original sample rate if possible?>"); 51 52struct device { 53 char *path; 54 bool need_verify; 55 bool ignore; 56 char *card_name; 57 char *args; 58 uint32_t module; 59 pa_ratelimit ratelimit; 60}; 61 62struct userdata { 63 pa_core *core; 64 pa_hashmap *devices; 65 66 bool use_tsched:1; 67 bool tsched_buffer_size_valid:1; 68 bool fixed_latency_range:1; 69 bool ignore_dB:1; 70 bool deferred_volume:1; 71 bool use_ucm:1; 72 bool avoid_resampling:1; 73 74 uint32_t tsched_buffer_size; 75 76 struct udev* udev; 77 struct udev_monitor *monitor; 78 pa_io_event *udev_io; 79 80 int inotify_fd; 81 pa_io_event *inotify_io; 82}; 83 84static const char* const valid_modargs[] = { 85 "tsched", 86 "tsched_buffer_size", 87 "fixed_latency_range", 88 "ignore_dB", 89 "deferred_volume", 90 "use_ucm", 91 "avoid_resampling", 92 NULL 93}; 94 95static int setup_inotify(struct userdata *u); 96 97static void device_free(struct device *d) { 98 pa_assert(d); 99 100 pa_xfree(d->path); 101 pa_xfree(d->card_name); 102 pa_xfree(d->args); 103 pa_xfree(d); 104} 105 106static const char *path_get_card_id(const char *path) { 107 const char *e; 108 109 if (!path) 110 return NULL; 111 112 if (!(e = strrchr(path, '/'))) 113 return NULL; 114 115 if (!pa_startswith(e, "/card")) 116 return NULL; 117 118 return e + 5; 119} 120 121static char *card_get_sysattr(const char *card_idx, const char *name) { 122 struct udev *udev; 123 struct udev_device *card = NULL; 124 char *t, *r = NULL; 125 const char *v; 126 127 pa_assert(card_idx); 128 pa_assert(name); 129 130 if (!(udev = udev_new())) { 131 pa_log_error("Failed to allocate udev context."); 132 goto finish; 133 } 134 135 t = pa_sprintf_malloc("/sys/class/sound/card%s", card_idx); 136 card = udev_device_new_from_syspath(udev, t); 137 pa_xfree(t); 138 139 if (!card) { 140 pa_log_error("Failed to get card object."); 141 goto finish; 142 } 143 144 if ((v = udev_device_get_sysattr_value(card, name)) && *v) 145 r = pa_xstrdup(v); 146 147finish: 148 149 if (card) 150 udev_device_unref(card); 151 152 if (udev) 153 udev_unref(udev); 154 155 return r; 156} 157 158static bool pcm_is_modem(const char *card_idx, const char *pcm) { 159 char *sysfs_path, *pcm_class; 160 bool is_modem; 161 162 pa_assert(card_idx); 163 pa_assert(pcm); 164 165 /* Check /sys/class/sound/card.../pcmC...../pcm_class. An HDA 166 * modem can be used simultaneously with generic 167 * playback/record. */ 168 169 sysfs_path = pa_sprintf_malloc("pcmC%sD%s/pcm_class", card_idx, pcm); 170 pcm_class = card_get_sysattr(card_idx, sysfs_path); 171 is_modem = pcm_class && pa_streq(pcm_class, "modem"); 172 pa_xfree(pcm_class); 173 pa_xfree(sysfs_path); 174 175 return is_modem; 176} 177 178static bool is_card_busy(const char *id) { 179 char *card_path = NULL, *pcm_path = NULL, *sub_status = NULL; 180 DIR *card_dir = NULL, *pcm_dir = NULL; 181 FILE *status_file = NULL; 182 struct dirent *de; 183 bool busy = false; 184 185 pa_assert(id); 186 187 /* This simply uses /proc/asound/card.../pcm.../sub.../status to 188 * check whether there is still a process using this audio device. */ 189 190 card_path = pa_sprintf_malloc("/proc/asound/card%s", id); 191 192 if (!(card_dir = opendir(card_path))) { 193 pa_log_warn("Failed to open %s: %s", card_path, pa_cstrerror(errno)); 194 goto fail; 195 } 196 197 for (;;) { 198 errno = 0; 199 de = readdir(card_dir); 200 if (!de && errno) { 201 pa_log_warn("readdir() failed: %s", pa_cstrerror(errno)); 202 goto fail; 203 } 204 205 if (!de) 206 break; 207 208 if (!pa_startswith(de->d_name, "pcm")) 209 continue; 210 211 if (pcm_is_modem(id, de->d_name + 3)) 212 continue; 213 214 pa_xfree(pcm_path); 215 pcm_path = pa_sprintf_malloc("%s/%s", card_path, de->d_name); 216 217 if (pcm_dir) 218 closedir(pcm_dir); 219 220 if (!(pcm_dir = opendir(pcm_path))) { 221 pa_log_warn("Failed to open %s: %s", pcm_path, pa_cstrerror(errno)); 222 continue; 223 } 224 225 for (;;) { 226 char line[32]; 227 228 errno = 0; 229 de = readdir(pcm_dir); 230 if (!de && errno) { 231 pa_log_warn("readdir() failed: %s", pa_cstrerror(errno)); 232 goto fail; 233 } 234 235 if (!de) 236 break; 237 238 if (!pa_startswith(de->d_name, "sub")) 239 continue; 240 241 pa_xfree(sub_status); 242 sub_status = pa_sprintf_malloc("%s/%s/status", pcm_path, de->d_name); 243 244 if (status_file) 245 fclose(status_file); 246 247 if (!(status_file = pa_fopen_cloexec(sub_status, "r"))) { 248 pa_log_warn("Failed to open %s: %s", sub_status, pa_cstrerror(errno)); 249 continue; 250 } 251 252 if (!(fgets(line, sizeof(line)-1, status_file))) { 253 pa_log_warn("Failed to read from %s: %s", sub_status, pa_cstrerror(errno)); 254 continue; 255 } 256 257 if (!pa_streq(line, "closed\n")) { 258 busy = true; 259 break; 260 } 261 } 262 } 263 264fail: 265 266 pa_xfree(card_path); 267 pa_xfree(pcm_path); 268 pa_xfree(sub_status); 269 270 if (card_dir) 271 closedir(card_dir); 272 273 if (pcm_dir) 274 closedir(pcm_dir); 275 276 if (status_file) 277 fclose(status_file); 278 279 return busy; 280} 281 282static void verify_access(struct userdata *u, struct device *d) { 283 char *cd; 284 pa_card *card; 285 bool accessible; 286 287 pa_assert(u); 288 pa_assert(d); 289 290 if (d->ignore) 291 return; 292 293 cd = pa_sprintf_malloc("/dev/snd/controlC%s", path_get_card_id(d->path)); 294 accessible = access(cd, R_OK|W_OK) >= 0; 295 pa_log_debug("%s is accessible: %s", cd, pa_yes_no(accessible)); 296 297 pa_xfree(cd); 298 299 if (d->module == PA_INVALID_INDEX) { 300 301 /* If we are not loaded, try to load */ 302 303 if (accessible) { 304 pa_module *m; 305 bool busy; 306 307 /* Check if any of the PCM devices that belong to this 308 * card are currently busy. If they are, don't try to load 309 * right now, to make sure the probing phase can 310 * successfully complete. When the current user of the 311 * device closes it we will get another notification via 312 * inotify and can then recheck. */ 313 314 busy = is_card_busy(path_get_card_id(d->path)); 315 pa_log_debug("%s is busy: %s", d->path, pa_yes_no(busy)); 316 317 if (!busy) { 318 319 /* So, why do we rate limit here? It's certainly ugly, 320 * but there seems to be no other way. Problem is 321 * this: if we are unable to configure/probe an audio 322 * device after opening it we will close it again and 323 * the module initialization will fail. This will then 324 * cause an inotify event on the device node which 325 * will be forwarded to us. We then try to reopen the 326 * audio device again, practically entering a busy 327 * loop. 328 * 329 * A clean fix would be if we would be able to ignore 330 * our own inotify close events. However, inotify 331 * lacks such functionality. Also, during probing of 332 * the device we cannot really distinguish between 333 * other processes causing EBUSY or ourselves, which 334 * means we have no way to figure out if the probing 335 * during opening was canceled by a "try again" 336 * failure or a "fatal" failure. */ 337 338 if (pa_ratelimit_test(&d->ratelimit, PA_LOG_DEBUG)) { 339 int err; 340 341 pa_log_debug("Loading module-alsa-card with arguments '%s'", d->args); 342 err = pa_module_load(&m, u->core, "module-alsa-card", d->args); 343 344 if (m) { 345 d->module = m->index; 346 pa_log_info("Card %s (%s) module loaded.", d->path, d->card_name); 347 } else if (err == -PA_ERR_NOENTITY) { 348 pa_log_info("Card %s (%s) module skipped.", d->path, d->card_name); 349 d->ignore = true; 350 } else { 351 pa_log_info("Card %s (%s) failed to load module.", d->path, d->card_name); 352 } 353 } else 354 pa_log_warn("Tried to configure %s (%s) more often than %u times in %llus", 355 d->path, 356 d->card_name, 357 d->ratelimit.burst, 358 (long long unsigned) (d->ratelimit.interval / PA_USEC_PER_SEC)); 359 } 360 } 361 362 } else { 363 364 /* If we are already loaded update suspend status with 365 * accessible boolean */ 366 367 if ((card = pa_namereg_get(u->core, d->card_name, PA_NAMEREG_CARD))) { 368 pa_log_debug("%s all sinks and sources of card %s.", accessible ? "Resuming" : "Suspending", d->card_name); 369 pa_card_suspend(card, !accessible, PA_SUSPEND_SESSION); 370 } 371 } 372} 373 374static void card_changed(struct userdata *u, struct udev_device *dev) { 375 struct device *d; 376 const char *path; 377 const char *t; 378 char *n; 379 pa_strbuf *args_buf; 380 381 pa_assert(u); 382 pa_assert(dev); 383 384 /* Maybe /dev/snd is now available? */ 385 setup_inotify(u); 386 387 path = udev_device_get_devpath(dev); 388 389 if ((d = pa_hashmap_get(u->devices, path))) { 390 verify_access(u, d); 391 return; 392 } 393 394 d = pa_xnew0(struct device, 1); 395 d->path = pa_xstrdup(path); 396 d->module = PA_INVALID_INDEX; 397 PA_INIT_RATELIMIT(d->ratelimit, 10*PA_USEC_PER_SEC, 5); 398 399 if (!(t = udev_device_get_property_value(dev, "PULSE_NAME"))) 400 if (!(t = udev_device_get_property_value(dev, "ID_ID"))) 401 if (!(t = udev_device_get_property_value(dev, "ID_PATH"))) 402 t = path_get_card_id(path); 403 404 n = pa_namereg_make_valid_name(t); 405 d->card_name = pa_sprintf_malloc("alsa_card.%s", n); 406 args_buf = pa_strbuf_new(); 407 pa_strbuf_printf(args_buf, 408 "device_id=\"%s\" " 409 "name=\"%s\" " 410 "card_name=\"%s\" " 411 "namereg_fail=false " 412 "tsched=%s " 413 "fixed_latency_range=%s " 414 "ignore_dB=%s " 415 "deferred_volume=%s " 416 "use_ucm=%s " 417 "avoid_resampling=%s " 418 "card_properties=\"module-udev-detect.discovered=1\"", 419 path_get_card_id(path), 420 n, 421 d->card_name, 422 pa_yes_no(u->use_tsched), 423 pa_yes_no(u->fixed_latency_range), 424 pa_yes_no(u->ignore_dB), 425 pa_yes_no(u->deferred_volume), 426 pa_yes_no(u->use_ucm), 427 pa_yes_no(u->avoid_resampling)); 428 pa_xfree(n); 429 430 if (u->tsched_buffer_size_valid) 431 pa_strbuf_printf(args_buf, " tsched_buffer_size=%" PRIu32, u->tsched_buffer_size); 432 433 d->args = pa_strbuf_to_string_free(args_buf); 434 435 pa_hashmap_put(u->devices, d->path, d); 436 437 verify_access(u, d); 438} 439 440static void remove_card(struct userdata *u, struct udev_device *dev) { 441 struct device *d; 442 443 pa_assert(u); 444 pa_assert(dev); 445 446 if (!(d = pa_hashmap_remove(u->devices, udev_device_get_devpath(dev)))) 447 return; 448 449 pa_log_info("Card %s removed.", d->path); 450 451 if (d->module != PA_INVALID_INDEX) 452 pa_module_unload_request_by_index(u->core, d->module, true); 453 454 device_free(d); 455} 456 457static void process_device(struct userdata *u, struct udev_device *dev) { 458 const char *action, *ff; 459 460 pa_assert(u); 461 pa_assert(dev); 462 463 if (udev_device_get_property_value(dev, "PULSE_IGNORE")) { 464 pa_log_debug("Ignoring %s, because marked so.", udev_device_get_devpath(dev)); 465 return; 466 } 467 468 if ((ff = udev_device_get_property_value(dev, "SOUND_CLASS")) && 469 pa_streq(ff, "modem")) { 470 pa_log_debug("Ignoring %s, because it is a modem.", udev_device_get_devpath(dev)); 471 return; 472 } 473 474 action = udev_device_get_action(dev); 475 476 if (action && pa_streq(action, "remove")) 477 remove_card(u, dev); 478 else if ((!action || pa_streq(action, "change")) && udev_device_get_property_value(dev, "SOUND_INITIALIZED")) 479 card_changed(u, dev); 480 481 /* For an explanation why we don't look for 'add' events here 482 * have a look into /lib/udev/rules.d/78-sound-card.rules! */ 483} 484 485static void process_path(struct userdata *u, const char *path) { 486 struct udev_device *dev; 487 488 if (!path_get_card_id(path)) 489 return; 490 491 if (!(dev = udev_device_new_from_syspath(u->udev, path))) { 492 pa_log("Failed to get udev device object from udev."); 493 return; 494 } 495 496 process_device(u, dev); 497 udev_device_unref(dev); 498} 499 500static void monitor_cb( 501 pa_mainloop_api*a, 502 pa_io_event* e, 503 int fd, 504 pa_io_event_flags_t events, 505 void *userdata) { 506 507 struct userdata *u = userdata; 508 struct udev_device *dev; 509 510 pa_assert(a); 511 512 if (!(dev = udev_monitor_receive_device(u->monitor))) { 513 pa_log("Failed to get udev device object from monitor."); 514 goto fail; 515 } 516 517 if (!path_get_card_id(udev_device_get_devpath(dev))) { 518 udev_device_unref(dev); 519 return; 520 } 521 522 process_device(u, dev); 523 udev_device_unref(dev); 524 return; 525 526fail: 527 a->io_free(u->udev_io); 528 u->udev_io = NULL; 529} 530 531static bool pcm_node_belongs_to_device( 532 struct device *d, 533 const char *node) { 534 535 char *cd; 536 bool b; 537 538 cd = pa_sprintf_malloc("pcmC%sD", path_get_card_id(d->path)); 539 b = pa_startswith(node, cd); 540 pa_xfree(cd); 541 542 return b; 543} 544 545static bool control_node_belongs_to_device( 546 struct device *d, 547 const char *node) { 548 549 char *cd; 550 bool b; 551 552 cd = pa_sprintf_malloc("controlC%s", path_get_card_id(d->path)); 553 b = pa_streq(node, cd); 554 pa_xfree(cd); 555 556 return b; 557} 558 559static void inotify_cb( 560 pa_mainloop_api*a, 561 pa_io_event* e, 562 int fd, 563 pa_io_event_flags_t events, 564 void *userdata) { 565 566 struct { 567 struct inotify_event e; 568 char name[NAME_MAX]; 569 } buf; 570 struct userdata *u = userdata; 571 static int type = 0; 572 bool deleted = false; 573 struct device *d; 574 void *state; 575 576 for (;;) { 577 ssize_t r; 578 struct inotify_event *event; 579 580 pa_zero(buf); 581 if ((r = pa_read(fd, &buf, sizeof(buf), &type)) <= 0) { 582 583 if (r < 0 && errno == EAGAIN) 584 break; 585 586 pa_log("read() from inotify failed: %s", r < 0 ? pa_cstrerror(errno) : "EOF"); 587 goto fail; 588 } 589 590 event = &buf.e; 591 while (r > 0) { 592 size_t len; 593 594 if ((size_t) r < sizeof(struct inotify_event)) { 595 pa_log("read() too short."); 596 goto fail; 597 } 598 599 len = sizeof(struct inotify_event) + event->len; 600 601 if ((size_t) r < len) { 602 pa_log("Payload missing."); 603 goto fail; 604 } 605 606 /* From udev we get the guarantee that the control 607 * device's ACL is changed last. To avoid races when ACLs 608 * are changed we hence watch only the control device */ 609 if (((event->mask & IN_ATTRIB) && pa_startswith(event->name, "controlC"))) 610 PA_HASHMAP_FOREACH(d, u->devices, state) 611 if (control_node_belongs_to_device(d, event->name)) 612 d->need_verify = true; 613 614 /* ALSA doesn't really give us any guarantee on the closing 615 * order, so let's simply hope */ 616 if (((event->mask & IN_CLOSE_WRITE) && pa_startswith(event->name, "pcmC"))) 617 PA_HASHMAP_FOREACH(d, u->devices, state) 618 if (pcm_node_belongs_to_device(d, event->name)) 619 d->need_verify = true; 620 621 /* /dev/snd/ might have been removed */ 622 if ((event->mask & (IN_DELETE_SELF|IN_MOVE_SELF))) 623 deleted = true; 624 625 event = (struct inotify_event*) ((uint8_t*) event + len); 626 r -= len; 627 } 628 } 629 630 PA_HASHMAP_FOREACH(d, u->devices, state) 631 if (d->need_verify) { 632 d->need_verify = false; 633 verify_access(u, d); 634 } 635 636 if (!deleted) 637 return; 638 639fail: 640 if (u->inotify_io) { 641 a->io_free(u->inotify_io); 642 u->inotify_io = NULL; 643 } 644 645 if (u->inotify_fd >= 0) { 646 pa_close(u->inotify_fd); 647 u->inotify_fd = -1; 648 } 649} 650 651static int setup_inotify(struct userdata *u) { 652 int r; 653 654 if (u->inotify_fd >= 0) 655 return 0; 656 657 if ((u->inotify_fd = inotify_init1(IN_CLOEXEC|IN_NONBLOCK)) < 0) { 658 pa_log("inotify_init1() failed: %s", pa_cstrerror(errno)); 659 return -1; 660 } 661 662 r = inotify_add_watch(u->inotify_fd, "/dev/snd", IN_ATTRIB|IN_CLOSE_WRITE|IN_DELETE_SELF|IN_MOVE_SELF); 663 664 if (r < 0) { 665 int saved_errno = errno; 666 667 pa_close(u->inotify_fd); 668 u->inotify_fd = -1; 669 670 if (saved_errno == ENOENT) { 671 pa_log_debug("/dev/snd/ is apparently not existing yet, retrying to create inotify watch later."); 672 return 0; 673 } 674 675 if (saved_errno == ENOSPC) { 676 pa_log("You apparently ran out of inotify watches, probably because Tracker/Beagle took them all away. " 677 "I wished people would do their homework first and fix inotify before using it for watching whole " 678 "directory trees which is something the current inotify is certainly not useful for. " 679 "Please make sure to drop the Tracker/Beagle guys a line complaining about their broken use of inotify."); 680 return 0; 681 } 682 683 pa_log("inotify_add_watch() failed: %s", pa_cstrerror(saved_errno)); 684 return -1; 685 } 686 687 pa_assert_se(u->inotify_io = u->core->mainloop->io_new(u->core->mainloop, u->inotify_fd, PA_IO_EVENT_INPUT, inotify_cb, u)); 688 689 return 0; 690} 691 692int pa__init(pa_module *m) { 693 struct userdata *u = NULL; 694 pa_modargs *ma; 695 struct udev_enumerate *enumerate = NULL; 696 struct udev_list_entry *item = NULL, *first = NULL; 697 int fd; 698 bool use_tsched = true, fixed_latency_range = false, ignore_dB = false, deferred_volume = m->core->deferred_volume; 699 bool use_ucm = true; 700 bool avoid_resampling; 701 702 pa_assert(m); 703 704 if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { 705 pa_log("Failed to parse module arguments"); 706 goto fail; 707 } 708 709 m->userdata = u = pa_xnew0(struct userdata, 1); 710 u->core = m->core; 711 u->devices = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, (pa_free_cb_t) device_free); 712 u->inotify_fd = -1; 713 714 if (pa_modargs_get_value_boolean(ma, "tsched", &use_tsched) < 0) { 715 pa_log("Failed to parse tsched= argument."); 716 goto fail; 717 } 718 u->use_tsched = use_tsched; 719 720 if (pa_modargs_get_value(ma, "tsched_buffer_size", NULL)) { 721 if (pa_modargs_get_value_u32(ma, "tsched_buffer_size", &u->tsched_buffer_size) < 0) { 722 pa_log("Failed to parse tsched_buffer_size= argument."); 723 goto fail; 724 } 725 726 u->tsched_buffer_size_valid = true; 727 } 728 729 if (pa_modargs_get_value_boolean(ma, "fixed_latency_range", &fixed_latency_range) < 0) { 730 pa_log("Failed to parse fixed_latency_range= argument."); 731 goto fail; 732 } 733 u->fixed_latency_range = fixed_latency_range; 734 735 if (pa_modargs_get_value_boolean(ma, "ignore_dB", &ignore_dB) < 0) { 736 pa_log("Failed to parse ignore_dB= argument."); 737 goto fail; 738 } 739 u->ignore_dB = ignore_dB; 740 741 if (pa_modargs_get_value_boolean(ma, "deferred_volume", &deferred_volume) < 0) { 742 pa_log("Failed to parse deferred_volume= argument."); 743 goto fail; 744 } 745 u->deferred_volume = deferred_volume; 746 747 if (pa_modargs_get_value_boolean(ma, "use_ucm", &use_ucm) < 0) { 748 pa_log("Failed to parse use_ucm= argument."); 749 goto fail; 750 } 751 u->use_ucm = use_ucm; 752 753 avoid_resampling = m->core->avoid_resampling; 754 if (pa_modargs_get_value_boolean(ma, "avoid_resampling", &avoid_resampling) < 0) { 755 pa_log("Failed to parse avoid_resampling= argument."); 756 goto fail; 757 } 758 u->avoid_resampling = avoid_resampling; 759 760 if (!(u->udev = udev_new())) { 761 pa_log("Failed to initialize udev library."); 762 goto fail; 763 } 764 765 if (setup_inotify(u) < 0) 766 goto fail; 767 768 if (!(u->monitor = udev_monitor_new_from_netlink(u->udev, "udev"))) { 769 pa_log("Failed to initialize monitor."); 770 goto fail; 771 } 772 773 if (udev_monitor_filter_add_match_subsystem_devtype(u->monitor, "sound", NULL) < 0) { 774 pa_log("Failed to subscribe to sound devices."); 775 goto fail; 776 } 777 778 errno = 0; 779 if (udev_monitor_enable_receiving(u->monitor) < 0) { 780 pa_log("Failed to enable monitor: %s", pa_cstrerror(errno)); 781 if (errno == EPERM) 782 pa_log_info("Most likely your kernel is simply too old and " 783 "allows only privileged processes to listen to device events. " 784 "Please upgrade your kernel to at least 2.6.30."); 785 goto fail; 786 } 787 788 if ((fd = udev_monitor_get_fd(u->monitor)) < 0) { 789 pa_log("Failed to get udev monitor fd."); 790 goto fail; 791 } 792 793 pa_assert_se(u->udev_io = u->core->mainloop->io_new(u->core->mainloop, fd, PA_IO_EVENT_INPUT, monitor_cb, u)); 794 795 if (!(enumerate = udev_enumerate_new(u->udev))) { 796 pa_log("Failed to initialize udev enumerator."); 797 goto fail; 798 } 799 800 if (udev_enumerate_add_match_subsystem(enumerate, "sound") < 0) { 801 pa_log("Failed to match to subsystem."); 802 goto fail; 803 } 804 805 if (udev_enumerate_scan_devices(enumerate) < 0) { 806 pa_log("Failed to scan for devices."); 807 goto fail; 808 } 809 810 first = udev_enumerate_get_list_entry(enumerate); 811 udev_list_entry_foreach(item, first) 812 process_path(u, udev_list_entry_get_name(item)); 813 814 udev_enumerate_unref(enumerate); 815 816 pa_log_info("Found %u cards.", pa_hashmap_size(u->devices)); 817 818 pa_modargs_free(ma); 819 820 return 0; 821 822fail: 823 824 if (enumerate) 825 udev_enumerate_unref(enumerate); 826 827 if (ma) 828 pa_modargs_free(ma); 829 830 pa__done(m); 831 832 return -1; 833} 834 835void pa__done(pa_module *m) { 836 struct userdata *u; 837 838 pa_assert(m); 839 840 if (!(u = m->userdata)) 841 return; 842 843 if (u->udev_io) 844 m->core->mainloop->io_free(u->udev_io); 845 846 if (u->monitor) 847 udev_monitor_unref(u->monitor); 848 849 if (u->udev) 850 udev_unref(u->udev); 851 852 if (u->inotify_io) 853 m->core->mainloop->io_free(u->inotify_io); 854 855 if (u->inotify_fd >= 0) 856 pa_close(u->inotify_fd); 857 858 if (u->devices) 859 pa_hashmap_free(u->devices); 860 861 pa_xfree(u); 862} 863