Skip to content

Hook-based volume setter scripts run concurrently and potentially out-of-order #274

Description

@christianglodt

It seems the hook-based volume setting command is sometimes not run.

In my setup, I run sendspin in a systemd unit via uvx:

uvx sendspin@7.5.0 daemon --audio-device=mydevice --hook-set-volume /usr/local/bin/set-alsa-volume.sh --name "myname" --id myid --disable-mpris --port 12345

My set-alsa-volume.sh script looks like this:

#!/bin/sh
exec systemd-cat -t "sendspin-triggered-amixer" amixer -D "$ALSA_DEVICE" sset "$ALSA_MIXER_CTL" "$1"%

(Note: The systemd-cat command ensures the output of the amixer command is sent to the journal of the sendspin systemd unit.)

Here's an example I managed to log where an expected call of the script does not occur:

Aug 04 14:36:10 server uvx[3235267]: INFO:sendspin.daemon.daemon:Server set player volume: 43%
Aug 04 14:36:10 server sendspin-triggered-amixer[294409]: Simple mixer control 'Master',0
Aug 04 14:36:10 server sendspin-triggered-amixer[294409]:   Capabilities: volume cswitch
Aug 04 14:36:10 server sendspin-triggered-amixer[294409]:   Playback channels: Front Left - Front Right
Aug 04 14:36:10 server sendspin-triggered-amixer[294409]:   Capture channels: Front Left - Front Right
Aug 04 14:36:10 server sendspin-triggered-amixer[294409]:   Limits: -50 - 100
Aug 04 14:36:10 server sendspin-triggered-amixer[294409]:   Front Left: 14 [43%] [-25.80dB] Capture [on]
Aug 04 14:36:10 server sendspin-triggered-amixer[294409]:   Front Right: 14 [43%] [-25.80dB] Capture [on]
Aug 04 14:36:11 server uvx[3235267]: INFO:sendspin.daemon.daemon:Server set player volume: 46%
Aug 04 14:36:11 server sendspin-triggered-amixer[294411]: Simple mixer control 'Master',0
Aug 04 14:36:11 server sendspin-triggered-amixer[294411]:   Capabilities: volume cswitch
Aug 04 14:36:11 server sendspin-triggered-amixer[294411]:   Playback channels: Front Left - Front Right
Aug 04 14:36:11 server sendspin-triggered-amixer[294411]:   Capture channels: Front Left - Front Right
Aug 04 14:36:11 server sendspin-triggered-amixer[294411]:   Limits: -50 - 100
Aug 04 14:36:11 server sendspin-triggered-amixer[294411]:   Front Left: 19 [46%] [-24.30dB] Capture [on]
Aug 04 14:36:11 server sendspin-triggered-amixer[294411]:   Front Right: 19 [46%] [-24.30dB] Capture [on]
Aug 04 14:36:14 server uvx[3235267]: INFO:sendspin.daemon.daemon:Server set player volume: 78%
Aug 04 14:36:14 server sendspin-triggered-amixer[294526]: Simple mixer control 'Master',0
Aug 04 14:36:14 server sendspin-triggered-amixer[294526]:   Capabilities: volume cswitch
Aug 04 14:36:14 server sendspin-triggered-amixer[294526]:   Playback channels: Front Left - Front Right
Aug 04 14:36:14 server sendspin-triggered-amixer[294526]:   Capture channels: Front Left - Front Right
Aug 04 14:36:14 server sendspin-triggered-amixer[294526]:   Limits: -50 - 100
Aug 04 14:36:14 server sendspin-triggered-amixer[294526]:   Front Left: 67 [78%] [-9.90dB] Capture [on]
Aug 04 14:36:14 server sendspin-triggered-amixer[294526]:   Front Right: 67 [78%] [-9.90dB] Capture [on]
Aug 04 14:36:16 server uvx[3235267]: INFO:sendspin.daemon.daemon:Server set player volume: 68%
<expected call of set-alsa-volume.sh does not occur here>

The example was produced by quickly changing the volume many times in the Music-Assistant web UI using the volume slider. The last setting (68%) does not result in a corresponding call of the volume setter hook.

Could the problem be a race condition between some internal state that represents the current volume and some check that decides whether to call the script?

EDIT: I've changed the title of the issue to better reflect the findings in my additional comment below.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions