From: Takashi Sakamoto Date: Mon, 18 Nov 2019 04:22:44 +0000 (+0900) Subject: rawmidi: add global method to get devnode string for rawmidi device X-Git-Tag: v0.1.0~189 X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=7613de810a844a4170e1dfd7145c1ca727dd00ad;p=alsa-gobject.git rawmidi: add global method to get devnode string for rawmidi device Signed-off-by: Takashi Sakamoto --- diff --git a/src/rawmidi/alsarawmidi.map b/src/rawmidi/alsarawmidi.map index efe4be4..5b375a2 100644 --- a/src/rawmidi/alsarawmidi.map +++ b/src/rawmidi/alsarawmidi.map @@ -5,6 +5,7 @@ ALSA_GOBJECT_0_0_0 { "alsarawmidi_get_device_id_list"; "alsarawmidi_get_rawmidi_sysname"; + "alsarawmidi_get_rawmidi_devnode"; local: *; }; diff --git a/src/rawmidi/query.c b/src/rawmidi/query.c index 442a6cb..4d035f0 100644 --- a/src/rawmidi/query.c +++ b/src/rawmidi/query.c @@ -241,3 +241,58 @@ void alsarawmidi_get_rawmidi_sysname(guint card_id, guint device_id, udev_unref(ctx); } + +/** + * alsarawmidi_get_rawmidi_devnode: + * @card_id: The numeridcal ID of sound card. + * @device_id: The numerical ID of rawmidi device for the sound card. + * @devnode: (out): The string for devnode of rawmidi device. + * @error: A #GError. + * + * Allocate devnode string for rawmidi device and return it when exists. + */ +void alsarawmidi_get_rawmidi_devnode(guint card_id, guint device_id, + char **devnode, GError **error) +{ + unsigned int length; + char *name; + struct udev *ctx; + struct udev_device *dev; + const char *node; + + length = strlen(RAWMIDI_SYSNAME_TEMPLATE) + calculate_digits(card_id) + + calculate_digits(device_id) + 1; + name = g_try_malloc0(length); + if (name == NULL) { + generate_error(error, ENOMEM); + return; + } + snprintf(name, length, RAWMIDI_SYSNAME_TEMPLATE, card_id, device_id); + + ctx = udev_new(); + if (ctx == NULL) { + generate_error(error, errno); + g_free(name); + return; + } + + dev = udev_device_new_from_subsystem_sysname(ctx, "sound", name); + g_free(name); + if (dev == NULL) { + generate_error(error, ENODEV); + udev_unref(ctx); + return; + } + + node = udev_device_get_devnode(dev); + if (node == NULL) { + generate_error(error, ENOENT); + } else { + *devnode = strdup(node); + if (*devnode == NULL) + generate_error(error, ENOMEM); + } + + udev_device_unref(dev); + udev_unref(ctx); +} diff --git a/src/rawmidi/query.h b/src/rawmidi/query.h index c853226..eb2b7c6 100644 --- a/src/rawmidi/query.h +++ b/src/rawmidi/query.h @@ -14,6 +14,9 @@ void alsarawmidi_get_device_id_list(guint card_id, void alsarawmidi_get_rawmidi_sysname(guint card_id, guint device_id, char **sysname, GError **error); +void alsarawmidi_get_rawmidi_devnode(guint card_id, guint device_id, + char **devnode, GError **error); + G_END_DECLS #endif