From 8a71ec4b737eb4d54b4b007d0009bdbe12278474 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Thu, 27 Nov 2025 18:17:14 +0100 Subject: [PATCH] alsactl: add systemd service to handle deferred card initialization Add alsa-card-wait@.service to handle cards in waiting state. Update udev rules to use --export and trigger the wait service when ALSA_CARD_STATE=waiting. Service runs "alsactl wrestore" for deferred card initialization. Signed-off-by: Jaroslav Kysela --- alsactl/90-alsa-restore.rules.in | 5 +++-- alsactl/Makefile.am | 7 ++++++- alsactl/alsa-card-wait@.service.in | 12 ++++++++++++ 3 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 alsactl/alsa-card-wait@.service.in diff --git a/alsactl/90-alsa-restore.rules.in b/alsactl/90-alsa-restore.rules.in index b3a80d5..6edf97a 100644 --- a/alsactl/90-alsa-restore.rules.in +++ b/alsactl/90-alsa-restore.rules.in @@ -24,7 +24,8 @@ IMPORT{program}="/usr/bin/cat /run/udev/alsa-hda-analog-card" ENV{ALSA_CARD_HDA_ANALOG}!="", ENV{ALSA_CARD_NUMBER}="$env{ALSA_CARD_HDA_ANALOG}" LABEL="alsa_restore_std" -TEST!="@daemonswitch@", RUN+="@sbindir@/alsactl@args@ restore $env{ALSA_CARD_NUMBER}" -TEST=="@daemonswitch@", RUN+="@sbindir@/alsactl@args@ nrestore $env{ALSA_CARD_NUMBER}" +TEST!="@daemonswitch@", IMPORT{program}="@sbindir@/alsactl@args@ --export restore $env{ALSA_CARD_NUMBER}" +TEST=="@daemonswitch@", IMPORT{program}="@sbindir@/alsactl@args@ --export nrestore $env{ALSA_CARD_NUMBER}" +ENV{ALSA_CARD_STATE}=="waiting", ENV{SYSTEMD_WANTS}="alsa-card-wait@$env{ALSA_CARD_NUMBER}.service" LABEL="alsa_restore_end" diff --git a/alsactl/Makefile.am b/alsactl/Makefile.am index 26d80ba..e3ba05b 100644 --- a/alsactl/Makefile.am +++ b/alsactl/Makefile.am @@ -31,7 +31,8 @@ if HAVE_SYSTEMD systemdsystemunit_DATA = \ alsa-state.service \ - alsa-restore.service + alsa-restore.service \ + alsa-card-wait@.service.in install-data-hook: $(MKDIR_P) -m 0755 \ @@ -60,6 +61,9 @@ alsa-state.service: alsa-state.service.in alsa-restore.service: alsa-restore.service.in $(edit) +alsa-card-wait@.service: alsa-card-wait@.service.in + $(edit) + 90-alsa-restore.rules: 90-alsa-restore.rules.in $(edit) @@ -71,6 +75,7 @@ EXTRA_DIST += \ CLEANFILES = \ alsa-state.service \ alsa-restore.service \ + alsa-card-wait@.service \ 90-alsa-restore.rules %.7: %.xml diff --git a/alsactl/alsa-card-wait@.service.in b/alsactl/alsa-card-wait@.service.in new file mode 100644 index 0000000..816074f --- /dev/null +++ b/alsactl/alsa-card-wait@.service.in @@ -0,0 +1,12 @@ +# +# ALSA card initialization handler for cards in waiting state +# This service is triggered by udev when ALSA_CARD_STATE=waiting +# + +[Unit] +Description=ALSA Card Initialization for card %I + +[Service] +Type=oneshot +RemainAfterExit=no +ExecStart=@sbindir@/alsactl@args@ wrestore %i -- 2.47.3