ALSA: rawmidi: Make tied_device=0 as default / unknown
authorTakashi Iwai <tiwai@suse.de>
Tue, 14 Jan 2025 10:47:01 +0000 (11:47 +0100)
committerTakashi Iwai <tiwai@suse.de>
Tue, 14 Jan 2025 15:52:07 +0000 (16:52 +0100)
In the original change, rawmidi_info.tied_device showed -1 for the
unknown or untied device.  But this would require the user-space to
check the protocol version and judge the value conditionally, which
is rather error-prone.

Instead, set the tied_device = 0 to be default as unknown, and
indicate the real device with the offset 1, for achieving more
backward compatibility.

Suggested-by: Jaroslav Kysela <perex@perex.cz>
Link: https://patch.msgid.link/20250114104711.19197-1-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
include/sound/rawmidi.h
include/uapi/sound/asound.h
sound/core/rawmidi.c
sound/core/ump.c

index 6f2e95298fc769855e6f6864c0d38dfddd2ffbd6..6916f71335977c66080f41f942d2b60f0d42f346 100644 (file)
@@ -191,4 +191,13 @@ long snd_rawmidi_kernel_read(struct snd_rawmidi_substream *substream,
 long snd_rawmidi_kernel_write(struct snd_rawmidi_substream *substream,
                              const unsigned char *buf, long count);
 
+/* set up the tied devices */
+static inline void snd_rawmidi_tie_devices(struct snd_rawmidi *r1,
+                                          struct snd_rawmidi *r2)
+{
+       /* tied_device field keeps the device+1 (so that 0 being unknown) */
+       r1->tied_device = r2->device + 1;
+       r2->tied_device = r1->device + 1;
+}
+
 #endif /* __SOUND_RAWMIDI_H */
index 000b36c0e2b9e8765c9a220d6f50a05a28f6035e..5a049eeaeccea59f690755abc7164aa23fecdded 100644 (file)
@@ -730,7 +730,7 @@ enum {
 #define SNDRV_RAWMIDI_INFO_UMP                 0x00000008
 #define SNDRV_RAWMIDI_INFO_STREAM_INACTIVE     0x00000010
 
-#define SNDRV_RAWMIDI_DEVICE_UNKNOWN           -1
+#define SNDRV_RAWMIDI_DEVICE_UNKNOWN           0
 
 struct snd_rawmidi_info {
        unsigned int device;            /* RO/WR (control): device number */
index 8a681bff4f7f61bbeeacf97d6776dc8059752cec..70a958ac1112c2a75cb5347253b94ef941012cf8 100644 (file)
@@ -1837,7 +1837,6 @@ 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));
index ff3cc2386ece98ae9f372d4e0f1db665afce3d3d..8d8681a42ca5f3361ca963acd9154ee195fdb507 100644 (file)
@@ -1382,8 +1382,7 @@ int snd_ump_attach_legacy_rawmidi(struct snd_ump_endpoint *ump,
        ump_legacy_set_rawmidi_name(ump);
        update_legacy_names(ump);
 
-       rmidi->tied_device = ump->core.device;
-       ump->core.tied_device = rmidi->device;
+       snd_rawmidi_tie_devices(rmidi, &ump->core);
 
        ump_dbg(ump, "Created a legacy rawmidi #%d (%s)\n", device, id);
        return 0;