From: Takashi Sakamoto Date: Mon, 18 Nov 2019 04:22:44 +0000 (+0900) Subject: ctl: add global method to get devnode string of control device for sound card X-Git-Tag: v0.1.0~425 X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=af34dd2a5266b2d50a3d4e1724915221d9f97f9a;p=alsa-gobject.git ctl: add global method to get devnode string of control device for sound card --- diff --git a/src/ctl/alsactl.map b/src/ctl/alsactl.map index d88b1e7..45d84d3 100644 --- a/src/ctl/alsactl.map +++ b/src/ctl/alsactl.map @@ -9,6 +9,7 @@ ALSA_GOBJECT_0_0_0 { "alsactl_get_card_id_list"; "alsactl_get_card_sysname"; "alsactl_get_control_sysname"; + "alsactl_get_control_devnode"; local: *; }; diff --git a/src/ctl/query.c b/src/ctl/query.c index 1a8118d..47499a9 100644 --- a/src/ctl/query.c +++ b/src/ctl/query.c @@ -276,3 +276,51 @@ void alsactl_get_control_sysname(guint card_id, char **sysname, GError **error) *sysname = name; } + +/** + * alsactl_get_control_devnode: + * @card_id: The numerical ID of sound card. + * @devnode: (out): The string for devnode of control device for the sound card. + * @error: A #GError. + * + * Allocate string of devnode for control device of the sound card and return it + * if exists. + */ +void alsactl_get_control_devnode(guint card_id, char **devnode, GError **error) +{ + char *sysname; + struct udev *ctx; + struct udev_device *dev; + const char *node; + + g_return_if_fail(devnode != NULL); + + allocate_sysname(&sysname, CONTROL_SYSNAME_TEMPLATE, card_id, error); + if (*error != NULL) + return; + + ctx = udev_new(); + if (ctx == NULL) { + generate_error(error, errno); + g_free(sysname); + return; + } + + dev = udev_device_new_from_subsystem_sysname(ctx, "sound", sysname); + if (dev == NULL) { + generate_error(error, ENODEV); + g_free(sysname); + udev_unref(ctx); + return; + } + g_free(sysname); + + node = udev_device_get_devnode(dev); + if (node != NULL) + *devnode = strdup(node); + else + generate_error(error, ENODEV); + + udev_device_unref(dev); + udev_unref(ctx); +} diff --git a/src/ctl/query.h b/src/ctl/query.h index ef135d4..d9d3c72 100644 --- a/src/ctl/query.h +++ b/src/ctl/query.h @@ -14,6 +14,8 @@ void alsactl_get_card_sysname(guint card_id, char **sysname, GError **error); void alsactl_get_control_sysname(guint card_id, char **sysname, GError **error); +void alsactl_get_control_devnode(guint card_id, char **devnode, GError **error); + G_END_DECLS #endif