diff --git a/alsactl/90-alsa-restore.rules.in b/alsactl/90-alsa-restore.rules.in index 1a411c99..85f0b15f 100644 --- a/alsactl/90-alsa-restore.rules.in +++ b/alsactl/90-alsa-restore.rules.in @@ -1,8 +1,28 @@ -ACTION=="add", SUBSYSTEM=="sound", KERNEL=="controlC*", KERNELS!="card*", TEST=="@sbindir@", TEST=="@mydatadir@", GOTO="alsa_restore_go" +# do not edit this file, it will be overwritten on update + +ACTION=="add", SUBSYSTEM=="sound", KERNEL=="controlC*", KERNELS!="card*",@extratest@ GOTO="alsa_restore_go" GOTO="alsa_restore_end" +ENV{ALSA_CARD_NUMBER}="$attr{device/number}" + +# mark HDA analog card; HDMI/DP card does not have capture devices +DRIVERS=="snd_hda_intel", TEST=="device/pcmC$env{ALSA_CARD_NUMBER}D0p", RUN+="/bin/sh -c 'echo ALSA_CARD_HDA_ANALOG=$env{ALSA_CARD_NUMBER} >> /run/udev/alsa-hda-analog-card'" + +# check for ACP hardware +TEST=="device/device/acp3x-dmic-capture", GOTO="alsa_hda_analog" +TEST=="device/device/acp6x-dmic-capture", GOTO="alsa_hda_analog" +TEST=="device/device/acp63-dmic-capture", GOTO="alsa_hda_analog" +TEST=="device/device/acp-pdm-dmic", GOTO="alsa_hda_analog" +GOTO="alsa_restore_std" + +LABEL="alsa_hda_analog" +# restore configuration for profile with combined cards (HDA + digital mic) +TEST!="/run/udev/alsa-hda-analog-card", GOTO="alsa_restore_std" +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_go" -TEST!="@daemonswitch@", RUN+="@sbindir@/alsactl restore $devnode" -TEST=="@daemonswitch@", RUN+="@sbindir@/alsactl nrestore $devnode" +TEST!="@daemonswitch@", RUN+="@sbindir@/alsactl@args@ restore $env{ALSA_CARD_NUMBER}" +TEST=="@daemonswitch@", RUN+="@sbindir@/alsactl@args@ nrestore $env{ALSA_CARD_NUMBER}" LABEL="alsa_restore_end" diff --git a/alsactl/Makefile.am b/alsactl/Makefile.am index fb32c4f3..e7717173 100644 --- a/alsactl/Makefile.am +++ b/alsactl/Makefile.am @@ -43,10 +43,14 @@ install-data-hook: endif edit = \ + extratest=$$(echo ' $(ALSACTL_UDEV_EXTRATEST)' | sed -e 's/__/ /g' -e 's/^ $$//'); \ + args=$$(echo ' $(ALSACTL_UDEV_ARGS)' | sed -e 's/__/ /g' -e 's/^ $$//'); \ $(SED) -r -e 's,@sbindir\@,$(sbindir),g' \ -e 's,@mydatadir\@,$(mydatadir),g' \ -e 's,@daemonswitch\@,$(ALSACTL_DAEMONSWITCH),g' \ -e 's,@asoundrcfile\@,$(ASOUND_STATE_DIR)/asound.state,g' \ + -e "s;@extratest\@;$${extratest};g" \ + -e "s;@args\@;$${args};g" \ < $< > $@ || rm $@ alsa-state.service: alsa-state.service.in diff --git a/configure.ac b/configure.ac index 4156985d..1cf74d7f 100644 --- a/configure.ac +++ b/configure.ac @@ -446,6 +446,21 @@ AC_ARG_WITH([alsactl-daemonswitch], [ALSACTL_DAEMONSWITCH="/etc/alsa/state-daemon.conf"]) AC_SUBST(ALSACTL_DAEMONSWITCH) +AC_ARG_WITH([alsactl-udev-extra-test], + AS_HELP_STRING([--with-alsactl-udev-extra-test=TEST], [Extra udev tests]), + [ALSACTL_UDEV_EXTRATEST="$withval"], + [ALSACTL_UDEV_EXTRATEST="default"]) +if test "$ALSACTL_UDEV_EXTRATEST" = "default"; then + ALSACTL_UDEV_EXTRATEST="TEST==\"${sbindir}\", TEST==\"${mydatadir}\"," +fi +AC_SUBST(ALSACTL_UDEV_EXTRATEST) + +AC_ARG_WITH([alsactl-udev-args], + AS_HELP_STRING([--with-alsactl-udev-args=ARGS], [Extra alsactl arguments (udev rules)]), + [ALSACTL_UDEV_ARGS="$withval"], + [ALSACTL_UDEV_ARGS=""]) +AC_SUBST(ALSACTL_UDEV_ARGS) + dnl pre-process plugin directory AC_ARG_WITH(plugindir, AS_HELP_STRING([--with-plugindir=dir],