The sndio library allows user processes to access midi(4) hardware and sndiod(8) MIDI thru boxes and
control ports in a uniform way.
OpeningandclosingaMIDIstream
First the application must call the mio_open() function to obtain a handle representing the newly created
stream; later it will be passed as the hdl argument of most other functions. The name parameter gives
the device string discussed in sndio(7). If the program is using a single device and is providing no
device chooser, it should be set to MIO_PORTANY to allow the user to select it using the MIDIDEVICE
environment variable.
The mode parameter gives the direction of the stream. The following are supported:
MIO_OUT The stream is output-only; data written to the stream will be sent to the hardware or
other programs.
MIO_IN The stream is input-only; received data from the hardware or other programs must be
read from the stream.
MIO_IN | MIO_OUT The stream sends and receives data. This mode should be used rather than calling
mio_open() twice.
If the nbio_flag argument is true (i.e. non-zero), then the mio_read() and mio_write() functions (see
below) will be non-blocking.
The mio_close() function closes the stream and frees all allocated resources associated with the libsndio
handle.
Sendingandreceivingdata
When input mode is selected, the mio_read() function must be called to retrieve received data; it must be
called often enough to ensure that internal buffers will not overrun. It will store at most nbytes bytes
at the addr location. Unless the nbio_flag flag is set, it will block until data becomes available and
will return zero only on error.
When output mode is selected, the mio_write() function can be called to provide data to transmit. Unless
the nbio_flag is set, mio_write() will block until the requested amount of data is written.
Non-blockingmodeoperation
If the nbio_flag is set on mio_open(), then the mio_read() and mio_write() functions will never block; if
no data is available, they will return zero immediately.
To avoid busy loops when non-blocking mode is used, the poll(2) system call can be used to check if data
can be read from or written to the stream. The mio_pollfd() function prepares the array pfd of pollfd
structures for use with poll(2). The optimal size of the pfd array, which the caller must pre-allocate,
is provided by the mio_nfds() function.
poll(2) will sleep until any of the events requested with mio_pollfd() have occurred. Events are
represented as a bit-mask of POLLIN and POLLOUT constants. The events which woke up poll(2) can be
obtained with the mio_revents() function. If POLLIN is set, mio_read() can be called without blocking.
If POLLOUT is set, mio_write() can be called without blocking. POLLHUP may be set if an error occurs,
even if it is not requested with mio_pollfd().
Errorhandling
Errors related to the MIDI subsystem (like hardware errors or dropped connections) and programming errors
(such as a call to mio_read() on a play-only stream) are considered fatal. Once an error occurs, all
functions which take a mio_hdl argument, except mio_close() and mio_eof(), stop working (i.e. always
return 0).