From 02fba53aa8ebb1ed2b1be5aa8cc85ac5099dc57e Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Sun, 21 Jun 2020 21:45:52 +0900 Subject: [PATCH] rawmidi: add an API to retrieve current version of protocol in rawmidi interface Signed-off-by: Takashi Sakamoto --- src/rawmidi/alsarawmidi.map | 1 + src/rawmidi/stream-pair.c | 42 +++++++++++++++++++++++++++++++++++ src/rawmidi/stream-pair.h | 4 ++++ tests/alsarawmidi-stream-pair | 1 + 4 files changed, 48 insertions(+) diff --git a/src/rawmidi/alsarawmidi.map b/src/rawmidi/alsarawmidi.map index dc74eb6..103a407 100644 --- a/src/rawmidi/alsarawmidi.map +++ b/src/rawmidi/alsarawmidi.map @@ -14,6 +14,7 @@ ALSA_GOBJECT_0_0_0 { "alsarawmidi_stream_pair_get_type"; "alsarawmidi_stream_pair_new"; "alsarawmidi_stream_pair_open"; + "alsarawmidi_stream_pair_get_protocol_version"; "alsarawmidi_stream_pair_get_substream_info"; "alsarawmidi_stream_pair_set_substream_params"; "alsarawmidi_stream_pair_get_substream_status"; diff --git a/src/rawmidi/stream-pair.c b/src/rawmidi/stream-pair.c index 584b24e..61408e0 100644 --- a/src/rawmidi/stream-pair.c +++ b/src/rawmidi/stream-pair.c @@ -37,6 +37,7 @@ struct _ALSARawmidiStreamPairPrivate { int fd; char *devnode; + guint16 proto_ver_triplet[3]; }; G_DEFINE_TYPE_WITH_PRIVATE(ALSARawmidiStreamPair, alsarawmidi_stream_pair, G_TYPE_OBJECT) @@ -182,6 +183,7 @@ void alsarawmidi_stream_pair_open(ALSARawmidiStreamPair *self, guint card_id, { ALSARawmidiStreamPairPrivate *priv; char *devnode; + int proto_ver; g_return_if_fail(ALSARAWMIDI_IS_STREAM_PAIR(self)); priv = alsarawmidi_stream_pair_get_instance_private(self); @@ -222,7 +224,47 @@ void alsarawmidi_stream_pair_open(ALSARawmidiStreamPair *self, guint card_id, return; } + // Remember the version of protocol currently used. + if (ioctl(priv->fd, SNDRV_RAWMIDI_IOCTL_PVERSION, &proto_ver) < 0) { + generate_error(error, errno); + close(priv->fd); + priv->fd = -1; + g_free(devnode); + return; + } + priv->devnode = devnode; + priv->proto_ver_triplet[0] = SNDRV_PROTOCOL_MAJOR(proto_ver); + priv->proto_ver_triplet[1] = SNDRV_PROTOCOL_MINOR(proto_ver); + priv->proto_ver_triplet[2] = SNDRV_PROTOCOL_MICRO(proto_ver); +} + +/** + * alsarawmidi_stream_pair_get_protocol_version: + * @self: A #ALSARawmidiStreamPair. + * @proto_ver_triplet: (array fixed-size=3)(out)(transfer none): The version of + * protocol currently used. + * + * Get the version of rawmidi protocol currently used. The version is + * represented as the array with three elements; major, minor, and micro version + * in the order. The length of major version is 16 bit, the length of minor + * and micro version is 8 bit each. + */ +void alsarawmidi_stream_pair_get_protocol_version(ALSARawmidiStreamPair *self, + const guint16 *proto_ver_triplet[3], + GError **error) +{ + ALSARawmidiStreamPairPrivate *priv; + + g_return_if_fail(ALSARAWMIDI_IS_STREAM_PAIR(self)); + priv = alsarawmidi_stream_pair_get_instance_private(self); + + if (priv->fd < 0) { + generate_error(error, ENXIO); + return; + } + + *proto_ver_triplet = (const guint16 *)priv->proto_ver_triplet; } /** diff --git a/src/rawmidi/stream-pair.h b/src/rawmidi/stream-pair.h index d9931ab..006a3e2 100644 --- a/src/rawmidi/stream-pair.h +++ b/src/rawmidi/stream-pair.h @@ -76,6 +76,10 @@ void alsarawmidi_stream_pair_open(ALSARawmidiStreamPair *self, guint card_id, ALSARawmidiStreamPairInfoFlag access_modes, gint open_flag, GError **error); +void alsarawmidi_stream_pair_get_protocol_version(ALSARawmidiStreamPair *self, + const guint16 *proto_ver_triplet[3], + GError **error); + void alsarawmidi_stream_pair_get_substream_info(ALSARawmidiStreamPair *self, ALSARawmidiStreamDirection direction, ALSARawmidiSubstreamInfo **substream_info, diff --git a/tests/alsarawmidi-stream-pair b/tests/alsarawmidi-stream-pair index b75d427..175b50e 100644 --- a/tests/alsarawmidi-stream-pair +++ b/tests/alsarawmidi-stream-pair @@ -16,6 +16,7 @@ props = ( methods = ( 'new', 'open', + 'get_protocol_version', 'get_substream_info', 'set_substream_params', 'get_substream_status', -- 2.47.3