Re: [Call for testing] sound: Implement /dev/dsp as a router device

From: Jakob Alvermark <jakob_at_alvermark.net>
Date: Tue, 08 Apr 2025 16:21:55 UTC
On 2025-04-08 00:23, Christos Margiolis wrote:
> Hello Jakob,
>
> Jakob Alvermark wrote:
>> Hi,
>>
>>
>> This is cool.
>>
>> I did some quick testing.
>>
>> Playing some audio and plugging in my USB-C headset the audio switches over
>> to the headset and continues playing in the headset.
>>
>> However, unplugging the headset does not seem to work fully. If I play
>> something in chromium (a Youtube video for example), it stops.
> See what I write below, it could be a similar issue. Also, does this
> happen on other browsers, say, firefox?

Interestingly, with firefox, the audio does not switch over to the headset.

I tried this:

- Start playing audio in firefox and start playing some audio in chromium.

- Plug in USB-C headphones.

- The audio from firefox still plays through the laptop speaker, but the 
chromium audio switches over to the headphones.

- Unplug headphones.

- Firefox audio still plays through laptop speakers as if nothing 
happened, chromium audio stops.

>> I tried playing an mp3 file using audio/mpg123, and when unplugging the
>> headset I get this error:
>>
>> [src/libout123/libout123.c:out123_play():746] error: Error in writing audio,
>> wrote only -1 of 2304 (Invalid argument?)!
>> main: [src/mpg123.c:play_frame():857] error: Deep trouble! Cannot flush to
>> my output anymore!
> I am not familiar with audio/mpg123, but the error message suggests that
> the program exits upon a write() error. That is not really an issue of
> sound(4), but that audio/mpg123 exits on the first write() error. mpv
> for example, or mplayer as you said, do not have this problem.
>
> My first guess would be that the error is generated during the
> hot-unpluging, because in the time window between the device detach and
> the switch to the new default device, write() will have failed since the
> device stopped doing IO at this point. That is not wrong behavior on
> sound(4)'s side though.
>
>> On the other hand, multimedia/mplayer does work, switching seamlessly
>> between the laptop speaker and headset.
> Just to make sure, the switching is successful even during IO, right?
Yes, with mplayer, switching works fine, both plugging and unplugging, 
while playing an mp3 file.
>> Jakob
>>
>> On 2025-04-06 21:08, Christos Margiolis wrote:
>>> I've been working on a patch [1] to re-implement /dev/dsp as a
>>> router/virtual device. The commit message in the review explains all the
>>> high-level details and reasons behind the patch. This is the first of a
>>> series of patches I'm working on.
>>>
>>> For regular users, the main functional difference is that with this
>>> patch, /dev/dsp is an actual router device (like when using
>>> virtual_oss), which means that we have hot-swapping (i.e., changing the
>>> default device and routing audio to it during IO without needing to
>>> close and re-open /dev/dsp) built into sound(4).
>>>
>>> Feel free to test the patch and please let me know if there's anything
>>> that breaks or could be improved. You can play around with it just by
>>> recording/playing audio as you always do, try some hot-swaps,
>>> hot-(un)plugs, and anything that can stress test it. Just make sure you
>>> open /dev/dsp, which should be the default for most applications anyway.
>>>
>>> Christos
>>>
>>> [1] https://reviews.freebsd.org/D49216
> Christos