From: Takashi Sakamoto Date: Mon, 18 Nov 2019 04:22:44 +0000 (+0900) Subject: rawmidi: add global method to get information of substream for rawmidi device X-Git-Tag: v0.1.0~185 X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=609c52798ea0cfc193a978112829e8794c4e7235;p=alsa-gobject.git rawmidi: add global method to get information of substream for rawmidi device Signed-off-by: Takashi Sakamoto --- diff --git a/src/rawmidi/alsarawmidi.map b/src/rawmidi/alsarawmidi.map index 47d4da9..9a384c3 100644 --- a/src/rawmidi/alsarawmidi.map +++ b/src/rawmidi/alsarawmidi.map @@ -7,6 +7,7 @@ ALSA_GOBJECT_0_0_0 { "alsarawmidi_get_rawmidi_sysname"; "alsarawmidi_get_rawmidi_devnode"; "alsarawmidi_get_subdevice_id_list"; + "alsarawmidi_get_substream_info"; "alsarawmidi_substream_info_get_type"; local: diff --git a/src/rawmidi/privates.h b/src/rawmidi/privates.h index c98b695..9d901ca 100644 --- a/src/rawmidi/privates.h +++ b/src/rawmidi/privates.h @@ -7,6 +7,10 @@ #include #include +#include "substream-info.h" + +#include + G_BEGIN_DECLS GQuark alsarawmidi_error_quark(void); @@ -15,6 +19,9 @@ GQuark alsarawmidi_error_quark(void); g_set_error(err, alsarawmidi_error_quark(), errno, \ __FILE__ ":%d: %s", __LINE__, strerror(errno)) +void rawmidi_substream_info_refer_private(ALSARawmidiSubstreamInfo *self, + struct snd_rawmidi_info **info); + G_END_DECLS #endif diff --git a/src/rawmidi/query.c b/src/rawmidi/query.c index 3abdfb2..7ef4363 100644 --- a/src/rawmidi/query.c +++ b/src/rawmidi/query.c @@ -12,8 +12,6 @@ #include -#include - // For error reporting. G_DEFINE_QUARK("alsarawmidi-error", alsarawmidi_error) @@ -396,3 +394,38 @@ void alsarawmidi_get_subdevice_id_list(guint card, guint device, (*entries)[i] = i; *entry_count = info.subdevices_count; } + +/** + * alsarawmidi_get_substream_info: + * @card_id: The numberical value for sound card to query. + * @device_id: The numerical value of rawmidi device to query. + * @direction: The direction of stream, one of ALSARawmidiStreamDirection. + * @subdevice_id: The numerical value of subdevice in rawmidi device. + * @substream_info: (out): The information of substream for the subdevice. + * @error: A #GError. + */ +void alsarawmidi_get_substream_info(guint card_id, guint device_id, + ALSARawmidiStreamDirection direction, + guint subdevice_id, + ALSARawmidiSubstreamInfo **substream_info, + GError **error) +{ + struct snd_rawmidi_info *info; + + if (substream_info == NULL) { + generate_error(error, EINVAL); + return; + } + + *substream_info = g_object_new(ALSARAWMIDI_TYPE_SUBSTREAM_INFO, NULL); + + rawmidi_substream_info_refer_private(*substream_info, &info); + info->device = device_id; + info->subdevice = subdevice_id; + info->stream = direction; + info->card = card_id; + + rawmidi_perform_ctl_ioctl(card_id, SNDRV_CTL_IOCTL_RAWMIDI_INFO, info, error); + if (*error != NULL) + g_object_unref(*substream_info); +} diff --git a/src/rawmidi/query.h b/src/rawmidi/query.h index be5f2c9..41d948e 100644 --- a/src/rawmidi/query.h +++ b/src/rawmidi/query.h @@ -6,6 +6,7 @@ #include #include +#include G_BEGIN_DECLS @@ -24,6 +25,12 @@ void alsarawmidi_get_subdevice_id_list(guint card, guint device, guint **entries, gsize *entry_count, GError **error); +void alsarawmidi_get_substream_info(guint card_id, guint device_id, + ALSARawmidiStreamDirection direction, + guint subdevice_id, + ALSARawmidiSubstreamInfo **substream_info, + GError **error); + G_END_DECLS #endif diff --git a/src/rawmidi/substream-info.c b/src/rawmidi/substream-info.c index 1b218ad..3e8feec 100644 --- a/src/rawmidi/substream-info.c +++ b/src/rawmidi/substream-info.c @@ -1,7 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-or-later -#include "substream-info.h" - -#include +#include "privates.h" struct _ALSARawmidiSubstreamInfoPrivate { struct snd_rawmidi_info info; @@ -154,3 +152,12 @@ static void alsarawmidi_substream_info_init(ALSARawmidiSubstreamInfo *self) { return; } + +void rawmidi_substream_info_refer_private(ALSARawmidiSubstreamInfo *self, + struct snd_rawmidi_info **info) +{ + ALSARawmidiSubstreamInfoPrivate *priv = + alsarawmidi_substream_info_get_instance_private(self); + + *info = &priv->info; +}