I was curious to know the OpenBSD Audio Subsystem, specifically all the components between user applications and hardware), after some “study” I created an ASCII graph to describe it.
We could split the subsystem into 2 layers:
- sndio implements and provides a library for the user space layer
- OpenBSD audio/midi drivers implement the kernel space layer.
The links are below.
+------+ +------+ +------+
| app1 | | app2 | .... | appN |
+------+ +------+ +------+
| | |
v v v
+-----------------------------------------------+
| sndio.h |
| sio_open(3)/mio_open(3) |
| interface to audio devices and MIDI streams |
+-----------------------------------------------+
| | |
| v |
| +-----------------------+ |
| | sndiod(8) | |
| | audio/midi server | |
| +-----------------------+ |
| | | | User
| | | | space
-------------------------------------------------
| | | | Kernel
| | | | space
v v v v
+--------------------+ +-------------+
| audio(4) | | midi(4) |
| device-independent | | raw device |
| driver layer | | independent |
+--------------------+ | interface |
| +-------------+
| |
v v
+---------------------------------+
| device dependent driver |
| (azalia(4), ac97(4), ...) |
+---------------------------------+
|
v
+--------------------------------------+
| audio or MIDI |
| |
| Hardware | +--------------------------------------+
Links:
- sndio official page
- sndio(7) interface to audio and MIDI
- sio_open(3) sndio interface to audio devices
- mio_open(3) sndio interface to MIDI streams
- sndiod(8) audio/MIDI server
- audio(4) device-independent audio driver layer
- midi(4) raw device independent interface to MIDI ports
- Some hardware-specific driver: