Commit bdf46443 authored by Takashi Iwai's avatar Takashi Iwai
Browse files

ALSA: rawmidi: Expose the tied device number in info ioctl



The UMP legacy rawmidi is derived from the UMP rawmidi, but currently
there is no way to know which device is involved in other side.

This patch extends the rawmidi info ioctl to show the tied device
number.  As default it stores -1, indicating that no tied device.

Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
Link: https://patch.msgid.link/20250110155943.31578-2-tiwai@suse.de
parent 75797909
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -293,6 +293,11 @@ Rawmidi API Extensions
  status 0x05).  When UMP core receives such a message, it updates the
  UMP EP info and the corresponding sequencer clients as well.

* The legacy rawmidi device number is found in the new `tied_device`
  field of the rawmidi info.
  On the other hand, the UMP rawmidi device number is found in
  `tied_device` field of the legacy rawmidi info, too.


Control API Extensions
======================
+1 −0
Original line number Diff line number Diff line
@@ -118,6 +118,7 @@ struct snd_rawmidi {
	struct list_head list;
	unsigned int device;		/* device number */
	unsigned int info_flags;	/* SNDRV_RAWMIDI_INFO_XXXX */
	unsigned int tied_device;
	char id[64];
	char name[80];

+4 −1
Original line number Diff line number Diff line
@@ -729,6 +729,8 @@ enum {
#define SNDRV_RAWMIDI_INFO_DUPLEX		0x00000004
#define SNDRV_RAWMIDI_INFO_UMP			0x00000008

#define SNDRV_RAWMIDI_DEVICE_UNKNOWN		-1

struct snd_rawmidi_info {
	unsigned int device;		/* RO/WR (control): device number */
	unsigned int subdevice;		/* RO/WR (control): subdevice number */
@@ -740,7 +742,8 @@ struct snd_rawmidi_info {
	unsigned char subname[32];	/* name of active or selected subdevice */
	unsigned int subdevices_count;
	unsigned int subdevices_avail;
	unsigned char reserved[64];	/* reserved for future use */
	int tied_device;		/* R: tied rawmidi device (UMP/legacy) */
	unsigned char reserved[60];	/* reserved for future use */
};

#define SNDRV_RAWMIDI_MODE_FRAMING_MASK		(7<<0)
+2 −0
Original line number Diff line number Diff line
@@ -635,6 +635,7 @@ static int snd_rawmidi_info(struct snd_rawmidi_substream *substream,
	info->subdevices_count = substream->pstr->substream_count;
	info->subdevices_avail = (substream->pstr->substream_count -
				  substream->pstr->substream_opened);
	info->tied_device = rmidi->tied_device;
	return 0;
}

@@ -1834,6 +1835,7 @@ int snd_rawmidi_init(struct snd_rawmidi *rmidi,
	INIT_LIST_HEAD(&rmidi->streams[SNDRV_RAWMIDI_STREAM_INPUT].substreams);
	INIT_LIST_HEAD(&rmidi->streams[SNDRV_RAWMIDI_STREAM_OUTPUT].substreams);
	rmidi->info_flags = info_flags;
	rmidi->tied_device = SNDRV_RAWMIDI_DEVICE_UNKNOWN;

	if (id != NULL)
		strscpy(rmidi->id, id, sizeof(rmidi->id));
+3 −0
Original line number Diff line number Diff line
@@ -1314,6 +1314,9 @@ int snd_ump_attach_legacy_rawmidi(struct snd_ump_endpoint *ump,
	ump->legacy_rmidi = rmidi;
	update_legacy_names(ump);

	rmidi->tied_device = ump->core.device;
	ump->core.tied_device = rmidi->device;

	ump_dbg(ump, "Created a legacy rawmidi #%d (%s)\n", device, id);
	return 0;
}