mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-29 05:40:27 -04:00
spa/alsa-udev: ignore all errors in card busy check
If card busy check fails due to error, just log info message and consider the card not busy. For kernels with CONFIG_SND_PROCFS=n, /proc/asound is not present, and we have to handle that. It's also better to fail open here, rather than end up with missing devices.
This commit is contained in:
parent
fa484f346e
commit
bae2cc0a6e
1 changed files with 12 additions and 7 deletions
|
|
@ -286,8 +286,8 @@ static int get_num_pcm_devices(unsigned int card_id)
|
|||
continue;
|
||||
|
||||
res = check_device_pcm_class(entry->d_name);
|
||||
if (res == 0 || res == -ENOENT) {
|
||||
/* count device also if sysfs status file not there */
|
||||
if (res != -ENXIO) {
|
||||
/* count device also if sysfs status file not accessible */
|
||||
++num_dev;
|
||||
}
|
||||
}
|
||||
|
|
@ -325,11 +325,13 @@ static int check_device_available(struct impl *this, struct device *device, int
|
|||
* don't want to actually open any devices using alsa-lib (generates uncontrolled
|
||||
* number of inotify events), or replicate its subdevice logic.
|
||||
*
|
||||
* The pcmXX directories do not exist if kernel is compiled with
|
||||
* CONFIG_SND_VERBOSE_PROCFS=n. In that case, the busy check always
|
||||
* succeeds.
|
||||
* The /proc/asound directory might not exist if kernel is compiled with
|
||||
* CONFIG_SND_PROCFS=n, and the pcmXX directories may be missing if compiled
|
||||
* with CONFIG_SND_VERBOSE_PROCFS=n. In those cases, the busy check always succeeds.
|
||||
*/
|
||||
|
||||
res = 0;
|
||||
|
||||
spa_scnprintf(path, sizeof(path), "/proc/asound/card%u", (unsigned int)device->id);
|
||||
|
||||
if ((card = opendir(path)) == NULL)
|
||||
|
|
@ -369,7 +371,7 @@ static int check_device_available(struct impl *this, struct device *device, int
|
|||
if (!spa_strstartswith(buf, "closed")) {
|
||||
spa_log_debug(this->log, "card %u pcm device %s busy",
|
||||
(unsigned int)device->id, entry->d_name);
|
||||
errno = EBUSY;
|
||||
res = -EBUSY;
|
||||
goto done;
|
||||
}
|
||||
spa_log_debug(this->log, "card %u pcm device %s free",
|
||||
|
|
@ -385,7 +387,10 @@ static int check_device_available(struct impl *this, struct device *device, int
|
|||
goto done;
|
||||
|
||||
done:
|
||||
res = -errno;
|
||||
if (errno != 0) {
|
||||
spa_log_info(this->log, "card %u: failed to find busy status (%s)",
|
||||
(unsigned int)device->id, spa_strerror(-errno));
|
||||
}
|
||||
if (card)
|
||||
closedir(card);
|
||||
if (pcm)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue