From: Takashi Sakamoto Date: Mon, 18 Nov 2019 04:22:44 +0000 (+0900) Subject: ctl: add global method to get sysname of sound card X-Git-Tag: v0.1.0~427 X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=5d46474a69d42ae6c9b8c45bee485586bc075d84;p=alsa-gobject.git ctl: add global method to get sysname of sound card --- diff --git a/src/ctl/alsactl.map b/src/ctl/alsactl.map index 523c019..c5f73b9 100644 --- a/src/ctl/alsactl.map +++ b/src/ctl/alsactl.map @@ -7,6 +7,7 @@ ALSA_GOBJECT_0_0_0 { "alsactl_event_mask_flag_get_type"; "alsactl_get_card_id_list"; + "alsactl_get_card_sysname"; local: *; }; diff --git a/src/ctl/query.c b/src/ctl/query.c index 0a83447..542f92b 100644 --- a/src/ctl/query.c +++ b/src/ctl/query.c @@ -5,9 +5,12 @@ #include #include #include +#include #include +#define CARD_SYSNAME_TEMPLATE "card%u" + // For error handling. G_DEFINE_QUARK("alsactl-error", alsactl_error) @@ -169,3 +172,79 @@ void alsactl_get_card_id_list(guint **entries, gsize *entry_count, end: release_udev_enum(enumerator); } + +static void allocate_sysname(char **sysname ,const char *template, + guint card_id, GError **error) +{ + unsigned int digits; + unsigned int number; + unsigned int length; + + digits = 0; + number = card_id; + while (number > 0) { + number /= 10; + ++digits; + } + + length = strlen(template) + digits; + *sysname = g_try_malloc0(length + 1); + if (*sysname == NULL) { + generate_error(error, ENOMEM); + return; + } + + snprintf(*sysname, length, template, card_id); +} + +static bool check_existence(char *sysname, GError **error) +{ + struct udev *ctx; + struct udev_device *dev; + bool result; + + ctx = udev_new(); + if (ctx == NULL) { + generate_error(error, errno); + return false; + } + + dev = udev_device_new_from_subsystem_sysname(ctx, "sound", sysname); + if (dev == NULL) { + generate_error(error, errno); + result = false; + } else { + result = true; + } + udev_device_unref(dev); + + udev_unref(ctx); + + return result; +} + +/** + * alsactl_get_card_sysname: + * @card_id: The numeridcal ID of sound card. + * @sysname: (out): The string for sysname of the sound card. + * @error: A #GError. + * + * Allocate sysname for the sound card and return it when it exists. + */ +void alsactl_get_card_sysname(guint card_id, char **sysname, GError **error) +{ + char *name; + + g_return_if_fail(sysname != NULL); + + allocate_sysname(&name, CARD_SYSNAME_TEMPLATE, card_id, error); + if (*error != NULL) + return; + + if (!check_existence(name, error)) { + g_free(name); + return; + } + + *sysname = name; +} diff --git a/src/ctl/query.h b/src/ctl/query.h index 62135ba..724f53b 100644 --- a/src/ctl/query.h +++ b/src/ctl/query.h @@ -10,6 +10,8 @@ G_BEGIN_DECLS void alsactl_get_card_id_list(guint **entries, gsize *entry_count, GError **error); +void alsactl_get_card_sysname(guint card_id, char **sysname, GError **error); + G_END_DECLS #endif