sndiod: Allow alternative devices to support different modes.
authoredd <edd@openbsd.org>
Tue, 2 Mar 2021 12:15:46 +0000 (12:15 +0000)
committeredd <edd@openbsd.org>
Tue, 2 Mar 2021 12:15:46 +0000 (12:15 +0000)
commitbd94a039ec3b27b9a9eea5cc11621af303bb0350
treebe0188f5aa83c0308b1555bf8f1d954aebdf193c
parentae968ffd159a87bf1d6a452172c6c5cf1b154f48
sndiod: Allow alternative devices to support different modes.

Currently sndiod does not allow you to use alternative devices (-F
devices) which support only a subset of the modes of the main (-f)
device.

For example, if you do `sndiod -f rsnd/0 -F rsnd/1` and:
 - rsnd/0 is full-duplex (rec + play).
 - rsnd/1 is play-only.

Then you will be unable to use rsnd/1 as sndiod deems it incompatible
and refuses to use it (similarly if rsnd/1 is record-only).

This is annoying. It means if you want to use a record-only or play-only
device, you will either have to kill sndiod and restart it specifying
only that device (`sndiod -f rsnd/1` for the above example), or failing
that, downgrade the functionality of the main device (`-m play`).

This diff (a joint effort between ratchov@ and myself) makes mixing
devices with different modes possible. It does this by making both
recording and playing available for all devices, even if the underlying
hardware doesn't support both modes.

For example, if I try to record from a play-only device, then recording
will succeed, but the captured PCM data will be pure silence. Similarly,
if I try to play to a record-only device, then the audio stream will
disappear into the ether.

This is mostly a no-op for sndiod in the default configuration (except
that play-only devices now accept recording clients). If you use
alternative devices (-F), then it's possible for a record-only device to
be found first, which may be confusing if you just want to hear sound.
We can only assume that if you deviate from defaults, then you know what
you are doing.

With guidance from, and OK ratchov@, thanks!
usr.bin/sndiod/dev.c
usr.bin/sndiod/siofile.c