[Development report #16] Audio Stack Improvements

From: Christos Margiolis <christos_at_freebsd.org>
Date: Tue, 02 Jul 2024 19:09:38 UTC
Work done since last report:

Most of my time was spent implementing audio(3):
- Some time was wasted because I accidentally deleted all my WIP at some
  point (no comment...) before I pushed it to GitHub, so I had to
  re-write the whole library from scratch.
- Not sure whether this will be the final design, but after research and
  studying of other sound libraries, I decided to go with a simple
  libsndio-like approach, meaning the library provides only a handful of
  simple functions, instead of a full-blown complicated API:
	- audio_open(), audio_close()
	- audio_read(), audio_write(): Support blocking, non-blocking
	  and (soon) memory-mapped IO.
	- audio_set_vol(), audio_get_vol(): VPC functionality.
	- midi_open(), midi_close()
	- midi_read(), midi_write(): Support blocking and non-blocking
	  IO.
- Still considering whether we need a few more functions.
- Added syslog(3) logging for all failure points in the library.
- Doing some test re-writes of MPV and other programs to make sure the
  library can adapt to multiple different workflows.
- Still experimening with different approaches regarding buffer size
  assignments. Also discussing this with Florian.
- We need better kernel MIDI support in order to provide more
  MIDI-related functionality through audio(3). Many MIDI OSSv4 IOCTLs
  are not supported at all. An idea I have is to convert midi/ to
  function as a generic layer for MIDI device drivers (e.g umidi),
  similar to pcm/. This way we can register a device to /dev/sndstat and
  call OSS IOCTLs on it and expose all devices in a uniform way to /dev.
  However, this requires careful planning and I am still not sure
  whether this can fit within the scope of the project.

Commits/reviews:
- snd_hda: Add Lenovo X1 Carbon Gen11 support
  https://cgit.freebsd.org/src/commit/?id=ef659a2d041c01b747ae4605160c24156cae081b
- snd_uaudio: Remove unused sc_sndstat sbuf
  https://reviews.freebsd.org/D45771
- sound: Simplify getchns()
  https://reviews.freebsd.org/D45775
- sound: Make DSP_FIXUP_ERROR() regular code:
  https://reviews.freebsd.org/D45776
- sound: Remove dead code in pcm_register()
  https://reviews.freebsd.org/D45831
- sound: Improve simplex handling in dsp_open()
  https://reviews.freebsd.org/D45835
- sound: Get rid of snd_sb16 workaround in vchan_create()
  https://reviews.freebsd.org/D45662
- sound: Fix min/max sample rate assignment for VCHANs
  https://reviews.freebsd.org/D45664
- sound: SNDCTL_AUDIOINFO: Do not skip physical channels if VCHANs are
  disabled
  https://reviews.freebsd.org/D45722
- On-and-off debugging a (seemingly harmless) lock order reversal in
  chn_syncstart().
- sound: Support oss_audioinfo->cmd
  https://cgit.freebsd.org/src/commit/?id=8e36d212594b542cb0c57d549e0b57fd0f7e307c
- sound: Fix oss_audioinfo's card_number, port_number and legacy_device
  https://cgit.freebsd.org/src/commit/?id=0f878cdfc5a46cc0dc198e12758f12558dfb1bf6
- sound: Remove outdated comment in dsp_oss_engineinfo()
  https://cgit.freebsd.org/src/commit/?id=914c2b3314e8f6e31833e33cfdcc4843f88fe31b
- sound: Include sound(4) channel information in sndstat nvlist
  https://cgit.freebsd.org/src/commit/?id=bbca3a75bb412f7106a569b82c616404103be084
- sound: Fix lock order reversals in mseq_open()
  https://reviews.freebsd.org/D45770
- sound: Remove *MINOR from midi/
  https://reviews.freebsd.org/D45772
- sound: Remove MIDI_TYPE
  https://reviews.freebsd.org/D45773
- Status/2024Q2/audio.adoc: Add report
  https://cgit.freebsd.org/doc/commit/?id=9f0942d1d52b8dff42a2822ef4f3bf27279f06eb

Also submitted EuroBSDCon abstract related to the project but was rejected.

This work is sponsored by the FreeBSD Foundation.