sndiod: Unify "midithru/N" and "midi/N" ports

Alexandre Ratchov <[email protected]>
Newsgroups gmane.os.openbsd.tech
Message-ID <[email protected]>
This diff adds the new -p option, which is the same as -s, but for
MIDI: Basically, "-p foo" will register a MIDI port that programs can
access as "midi/foo"; it has the same functionnality as the
"midithru/N" ports. The new default MIDI port becomes "midi/default",
which is automatically created (similarly to the default audio
device).

This is simpler and reduces the differences between audio and MIDI
handling.

The "midithru/N" ports are left as an useless complication that can go
away, so we can drop support for them. To make upgrades smoother,
device names like "midithru/0" will continue to work during the next
few releases.

OK?

Index: lib/libsndio/mio.c
===================================================================
RCS file: /cvs/src/lib/libsndio/mio.c,v
diff -u -p -r1.23 mio.c
--- lib/libsndio/mio.c	29 Jun 2019 06:05:26 -0000	1.23
+++ lib/libsndio/mio.c	12 Aug 2026 11:55:46 -0000
@@ -48,7 +48,7 @@ mio_open(const char *str, unsigned int m
 			str = portany;
 	}
 	if (strcmp(str, portany) == 0) {
-		hdl = _mio_aucat_open("midithru/0", mode, nbio);
+		hdl = _mio_aucat_open("midi/default", mode, nbio);
 		if (hdl != NULL)
 			return hdl;
 		return _mio_rmidi_open("rmidi/0", mode, nbio);
Index: lib/libsndio/sndio.7
===================================================================
RCS file: /cvs/src/lib/libsndio/sndio.7,v
diff -u -p -r1.27 sndio.7
--- lib/libsndio/sndio.7	1 Nov 2021 14:43:24 -0000	1.27
+++ lib/libsndio/sndio.7	12 Aug 2026 11:55:46 -0000
@@ -77,13 +77,10 @@ how to access the audio device or MIDI p
 The type of the audio device or MIDI port.
 Possible values are:
 .Pp
-.Bl -tag -width "midithru" -offset 3n -compact
+.Bl -tag -width "rmidi" -offset 3n -compact
 .It Cm snd
 Audio device exposed by
 .Xr sndiod 8 .
-.It Cm midithru
-MIDI thru port created with
-.Xr sndiod 8 .
 .It Cm midi
 MIDI port exposed by
 .Xr sndiod 8 .
@@ -112,8 +109,10 @@ option on the
 .Xr sndiod 8
 command line.
 .It Ar option
-Corresponds to the sub-device string registered using the
+Corresponds to the string registered using the
 .Fl s
+or
+.Fl p
 option of
 .Xr sndiod 8 .
 .El
@@ -159,7 +158,7 @@ the program uses the one specified in th
 .Ev MIDIDEVICE
 environment variable.
 If it is not set, the program first tries to connect to
-.Li midithru/0 .
+.Li midi/default .
 If that fails, it then tries to use
 .Li rmidi/0 .
 As long as
@@ -215,7 +214,7 @@ Raw audio devices.
 Raw MIDI ports.
 .El
 .Sh EXAMPLES
-.Bl -tag -width "midithru/0" -compact
+.Bl -tag -width "midi/synth" -compact
 .It Li snd/0
 Audio device referred to by the first
 .Fl f
@@ -224,9 +223,9 @@ option of
 .It Li snd/rear
 Sub-device registered with
 .Dq -s rear .
-.It Li midithru/0
-First MIDI thru port created with
-.Xr sndiod 8 .
+.It Li midi/synth
+MIDI thru port registered with
+.Dq -p synth .
 .It Li default
 Default audio or MIDI device.
 .It Li rsnd/0
Index: usr.bin/sndiod/sndiod.8
===================================================================
RCS file: /cvs/src/usr.bin/sndiod/sndiod.8,v
diff -u -p -r1.22 sndiod.8
--- usr.bin/sndiod/sndiod.8	22 Jun 2026 14:15:26 -0000	1.22
+++ usr.bin/sndiod/sndiod.8	12 Aug 2026 11:55:46 -0000
@@ -34,6 +34,7 @@
 .Op Fl j Ar flag
 .Op Fl L Ar addr
 .Op Fl m Ar mode
+.Op Fl p Ar name
 .Op Fl q Ar port
 .Op Fl r Ar rate
 .Op Fl s Ar name
@@ -262,6 +263,19 @@ Multiple modes can be specified, separat
 The default is
 .Ar play , Ns Ar rec
 (i.e. full-duplex).
+.It Fl p Ar name
+Add
+.Ar name
+to the list of MIDI thru ports to expose.
+This allows clients to send MIDI messages to each other or to
+hardware MIDI ports.
+The given
+.Ar name
+corresponds to the
+.Dq option
+part of the
+.Xr sndio 7
+MIDI port name string.
 .It Fl q Ar port
 Expose the given MIDI port.
 This allows multiple programs to share the port.
Index: usr.bin/sndiod/sndiod.c
===================================================================
RCS file: /cvs/src/usr.bin/sndiod/sndiod.c,v
diff -u -p -r1.61 sndiod.c
--- usr.bin/sndiod/sndiod.c	12 Aug 2026 11:01:26 -0000	1.61
+++ usr.bin/sndiod/sndiod.c	12 Aug 2026 11:55:46 -0000
@@ -522,7 +522,7 @@ main(int argc, char **argv)
 	p = NULL;
 
 	while ((c = getopt(argc, argv,
-	    "a:b:c:C:de:F:f:j:L:m:Q:q:r:s:t:U:v:w:x:z:")) != -1) {
+	    "a:b:c:C:de:F:f:j:L:m:Q:p:q:r:s:t:U:v:w:x:z:")) != -1) {
 		switch (c) {
 		case 'd':
 			log_level++;
@@ -578,6 +578,11 @@ main(int argc, char **argv)
 				mode, vol, mmc, dup) == NULL)
 				return 1;
 			break;
+		case 'p':
+			if (!ckname(optarg))
+				return 1;
+			midithru_new(optarg);
+			break;
 		case 'q':
 		case 'Q':
 			p = mkport(optarg, hold);
@@ -666,6 +671,9 @@ main(int argc, char **argv)
 		if (o == NULL)
 			return 1;
 	}
+
+	if (!midithru_byname("default"))
+		midithru_new("default");
 
 	/*
 	 * For each device create an anonymous sub-device using
Index: usr.bin/sndiod/sock.c
===================================================================
RCS file: /cvs/src/usr.bin/sndiod/sock.c,v
diff -u -p -r1.69 sock.c
--- usr.bin/sndiod/sock.c	12 Aug 2026 10:58:19 -0000	1.69
+++ usr.bin/sndiod/sock.c	12 Aug 2026 11:55:46 -0000
@@ -759,6 +759,12 @@ sock_hello(struct sock *f)
 			return 0;
 		break;
 	case AMSG_TYPE_MIDITHRU:
+		/*
+		 * Make legacy "midithru/0" an alias to "midi/default"
+		 */
+		if (strcmp("default-0", name) == 0)
+			strlcpy(name, "default", sizeof(name));
+		/* FALLTHROUGH */
 	case AMSG_TYPE_MIDI:
 		midithru = midithru_byname(name);
 		if (midithru == NULL)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.