Parametres son d'alsa non restaurés

Salut
Le service alsa-restore.service utilise /run qui est en tmpfs donc volatile
Pour pouvoir sauvegarder les paramètres alsa au stop et les restaurer au démarrage j’ai modifié ainsi pour utiliser /var/lib/alsa

cat /lib/systemd/system/alsa-restore.service

#
# Note that two different ALSA card state management schemes exist and they
# can be switched using a file exist check - /etc/alsa/state-daemon.conf .
#

[Unit]
Description=Save/Restore Sound Card State
Documentation=man:alsactl(1)
ConditionPathExists=!/etc/alsa/state-daemon.conf
ConditionPathExistsGlob=/dev/snd/control*
After=alsa-state.service

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=-/usr/sbin/alsactl -E HOME=/var/lib/alsa restore
ExecStop=-/usr/sbin/alsactl -E HOME=/var/lib/alsa store

Apparement c’est bon`:slight_smile:

systemctl status alsa-restore.service
● alsa-restore.service - Save/Restore Sound Card State
   Loaded: loaded (/lib/systemd/system/alsa-restore.service; static; vendor preset: enabled)
   Active: active (exited) since Thu 2017-08-17 20:37:36 CEST; 1min 24s ago
     Docs: man:alsactl(1)
  Process: 578 ExecStart=/usr/sbin/alsactl -E HOME=/var/lib/alsa restore (code=exited, status=0/SUCCESS)
 Main PID: 578 (code=exited, status=0/SUCCESS)
    Tasks: 0 (limit: 4915)
   CGroup: /system.slice/alsa-restore.service

août 17 20:37:36 debian systemd[1]: Starting Save/Restore Sound Card State...
août 17 20:37:36 debian systemd[1]: Started Save/Restore Sound Card State.

Avant le premier reboot generer une sauvegarde

sudo /usr/sbin/alsactl -E HOME=/var/lib/alsa store

Si je comprends bien, le paquet alsa-utils aurait besoin d’un petit changement pour buster.

je ne comprends pas tout car il y a celui là aussi

systemctl status alsa-state.service
● alsa-state.service - Manage Sound Card State (restore and store)
   Loaded: loaded (/lib/systemd/system/alsa-state.service; static; vendor preset: enabled)
   Active: inactive (dead)
Condition: start condition failed at Thu 2017-08-17 21:07:31 CEST; 19min ago
           └─ ConditionPathExists=/etc/alsa/state-daemon.conf was not met
     Docs: man:alsactl(1)

ça manque vraiment de mode d’emploi
qui est sensé generer

 ls -alrt /etc/alsa/state-daemon.conf
ls: impossible d'accéder à '/etc/alsa/state-daemon.conf': Aucun fichier ou dossier de ce type

Le fichier /lib/udev/rules.d/90-alsa-restore.rules est-il encore là ?

EDIT

Il est bien dit qu’il y a deux schémas possibles :

oui

cat  /lib/udev/rules.d/90-alsa-restore.rules
ACTION=="add", SUBSYSTEM=="sound", KERNEL=="controlC*", KERNELS!="card*", TEST=="/usr/sbin", TEST=="/usr/share/alsa", GOTO="alsa_restore_go"
GOTO="alsa_restore_end"

LABEL="alsa_restore_go"
TEST!="/etc/alsa/state-daemon.conf", TEST=="/usr/sbin/alsactl", RUN+="/usr/sbin/alsactl -E HOME=/run/alsa restore $attr{device/number}"
TEST=="/etc/alsa/state-daemon.conf", TEST=="/usr/sbin/alsactl", RUN+="/usr/sbin/alsactl -E HOME=/run/alsa nrestore $attr{device/number}"

LABEL="alsa_restore_end"

ce qui est certain c’est qu’avant ma modif le volume était toujours a fond au démarrage maintenant je retrouve la position d’avant l’arret

Ça a dû changer avec stretch ; voilà la version jessie :

ACTION=="add", SUBSYSTEM=="sound", KERNEL=="controlC*", KERNELS!="card*", TEST=="/usr/sbin", TEST=="/usr/share/alsa", GOTO="alsa_restore_go"
GOTO="alsa_restore_end"

LABEL="alsa_restore_go"
TEST!="/etc/alsa/state-daemon.conf", RUN+="/usr/sbin/alsactl -E HOME=/var/run/alsa restore $attr{device/number}"
TEST=="/etc/alsa/state-daemon.conf", RUN+="/usr/sbin/alsactl -E HOME=/var/run/alsa nrestore $attr{device/number}"

LABEL="alsa_restore_end"

ok
/var c’est mieux que /run en tmpfs

Si je lis bien, ça devrait encore être /var/run mais bon… je ne sais pas

http://sources.debian.net/src/alsa-utils/1.1.3-1/debian/patches/alsactl_home.patch/

En y réfléchissant pour un PC familial sauver au stop et restaurer au boot c’est suffisant
Pour un serveur de M.A.O qui n’est jamais redémarré, par exemple, il vaut peut-être mieux un mode daemon pour suivre les changements de réglages son en temps réel

Le patch de jessie à ça que le patch de stretch n’a pas

Index: alsa-utils-1.0.28/alsactl/alsa-store.service.in
===================================================================
--- alsa-utils-1.0.28.orig/alsactl/alsa-store.service.in
+++ alsa-utils-1.0.28/alsactl/alsa-store.service.in
@@ -11,5 +11,5 @@ Before=shutdown.target
 
 [Service]
 Type=oneshot
-ExecStart=@sbindir@/alsactl store
+ExecStart=@sbindir@/alsactl -E HOME=@alsactlhome@ store
 StandardOutput=syslog

Si j’ai bien compris, il y a eu bascule sur le schéma alsa-state au lieu de alsa-store dans stretch.

Le fichier alsactl/alsa-store.service.in n’existe plus dans stretch.

Ça n’explique pas le /run VS /var/run pour la règle udev…

effectivement je me tape ça aussi

journalctl -a | grep alsa

août 17 21:07:25 debian systemd-udevd[263]: Process '/usr/sbin/alsactl -E HOME=/run/alsa restore 1' failed with exit code 19.
août 17 21:08:36 debian pulseaudio[1371]: [pulseaudio] module-alsa-card.c: Card '1' doesn't exist: Aucun fichier ou dossier de ce type
août 17 21:08:36 debian pulseaudio[1371]: [pulseaudio] module.c: Failed to load module "module-alsa-card" (argument: "device_id="1" name="pci-0000_02_00.1" card_name="alsa_card.pci-0000_02_00.1" namereg_fail=false tsched=yes fixed_latency_range=no ignore_dB=no deferred_volume=yes use_ucm=yes card_properties="module-udev-detect.discovered=1""): initialization failed.

je vais sevir aussi dans les règles udev :grinning:

il y a un autre problème dans tout ça: ça fait réference à la carte 1 alors que je n’ai que la carte 0

aplay --list-device
**** Liste des Périphériques Matériels PLAYBACK ****
carte 0: SB [HDA ATI SB], périphérique 0: 92HD81B1X5 Analog [92HD81B1X5 Analog]
  Sous-périphériques: 0/1
  Sous-périphérique #0: subdevice #0

si je passe les règles à la main

root@debian:/var/run/alsa# /usr/sbin/alsactl -E HOME=/var/run/alsa restore 1
/usr/sbin/alsactl: load_state:1763: Cannot find soundcard '1'...
root@debian:/var/run/alsa# /usr/sbin/alsactl -E HOME=/var/run/alsa restore 0
root@debian:/var/run/alsa# 

j’ai donc modifié à la fois le dossier et le parametre pour le numero de carte pour etre coherent

 cat  /lib/udev/rules.d/90-alsa-restore.rules
ACTION=="add", SUBSYSTEM=="sound", KERNEL=="controlC*", KERNELS!="card*", TEST=="/usr/sbin", TEST=="/usr/share/alsa", GOTO="alsa_restore_go"
GOTO="alsa_restore_end"

LABEL="alsa_restore_go"
TEST!="/etc/alsa/state-daemon.conf", TEST=="/usr/sbin/alsactl", RUN+="/usr/sbin/alsactl -E HOME=/var/lib/alsa restore 0"
TEST=="/etc/alsa/state-daemon.conf", TEST=="/usr/sbin/alsactl", RUN+="/usr/sbin/alsactl -E HOME=/var/lib/alsa nrestore 0"

LABEL="alsa_restore_end"
    1. Comme la règle udev et le service systemd sont redondant et que je ne maitrise pas udev j’ai supprimé la règle udev
    1. j’ai temporisé le service pour que la restauration soit faite quand tout est initialisé.

cat /lib/systemd/system/alsa-restore.service

#
# Note that two different ALSA card state management schemes exist and they
# can be switched using a file exist check - /etc/alsa/state-daemon.conf .
#

[Unit]
Description=Save/Restore Sound Card State
Documentation=man:alsactl(1)
ConditionPathExists=!/etc/alsa/state-daemon.conf
ConditionPathExistsGlob=/dev/snd/control*
After=alsa-state.service

[Service]
Type=oneshot
RemainAfterExit=true
ExecStartPre=/bin/sleep 60
ExecStart=-/usr/sbin/alsactl -f /var/lib/alsa/save.asound.state restore
ExecStop=-/usr/sbin/alsactl  -f /var/lib/alsa/save.asound.state store
systemctl status alsa-restore.service
● alsa-restore.service - Save/Restore Sound Card State
   Loaded: loaded (/lib/systemd/system/alsa-restore.service; static; vendor preset: enabled)
   Active: active (exited) since Sat 2017-08-19 16:55:11 CEST; 46min ago
     Docs: man:alsactl(1)
  Process: 1598 ExecStart=/usr/sbin/alsactl -f /var/lib/alsa/save.asound.state restore (code=exited, status=0/SUCCESS)
  Process: 567 ExecStartPre=/bin/sleep 60 (code=exited, status=0/SUCCESS)
 Main PID: 1598 (code=exited, status=0/SUCCESS)
    Tasks: 0 (limit: 4915)
   CGroup: /system.slice/alsa-restore.service

août 19 16:54:10 debian systemd[1]: Starting Save/Restore Sound Card State...
août 19 16:55:11 debian systemd[1]: Started Save/Restore Sound Card State.

journalctl -b|grep -i -e alsa -e sound -e snd
août 18 17:47:13 debian kernel: snd_hda_intel 0000:02:00.1: Refused to change power state, currently in D3
août 18 17:47:13 debian kernel: snd_hda_intel 0000:02:00.1: Handle vga_switcheroo audio client
août 18 17:47:13 debian kernel: snd_hda_intel 0000:02:00.1: VGA controller is disabled
août 18 17:47:13 debian kernel: snd_hda_intel 0000:02:00.1: Delaying initialization
août 18 17:47:13 debian kernel: snd_hda_codec_idt hdaudioC0D0: autoconfig for 92HD81B1X5: line_outs=1 (0xd/0x0/0x0/0x0/0x0) type:speaker
août 18 17:47:13 debian kernel: snd_hda_codec_idt hdaudioC0D0:    speaker_outs=0 (0x0/0x0/0x0/0x0/0x0)
août 18 17:47:13 debian kernel: snd_hda_codec_idt hdaudioC0D0:    hp_outs=1 (0xb/0x0/0x0/0x0/0x0)
août 18 17:47:13 debian kernel: snd_hda_codec_idt hdaudioC0D0:    mono: mono_out=0x0
août 18 17:47:13 debian kernel: snd_hda_codec_idt hdaudioC0D0:    inputs:
août 18 17:47:13 debian kernel: snd_hda_codec_idt hdaudioC0D0:      Internal Mic=0x11
août 18 17:47:13 debian kernel: snd_hda_codec_idt hdaudioC0D0:      Mic=0xa
août 18 17:47:13 debian kernel: input: HDA Digital PCBeep as /devices/pci0000:00/0000:00:14.2/sound/card0/input12
août 18 17:47:13 debian kernel: input: HDA ATI SB Mic as /devices/pci0000:00/0000:00:14.2/sound/card0/input13
août 18 17:47:13 debian kernel: input: HDA ATI SB Front Headphone as /devices/pci0000:00/0000:00:14.2/sound/card0/input14
août 18 17:47:15 debian systemd[1]: Reached target Sound Card.
août 18 17:47:23 debian systemd[1]: Starting Save/Restore Sound Card State...
août 18 17:47:46 debian kernel: snd_hda_intel 0000:02:00.1: Start delayed initialization
août 18 17:47:46 debian kernel: snd_hda_intel 0000:02:00.1: CORB reset timeout#2, CORBRP = 65535
août 18 17:47:46 debian kernel: snd_hda_intel 0000:02:00.1: no codecs initialized
août 18 17:47:46 debian kernel: snd_hda_intel 0000:02:00.1: initialization error
août 18 17:48:23 debian systemd[1]: Started Save/Restore Sound Card State.
    1. Ainsi tous les niveaux sont bien restaurés alors qu’avant Headphone revenait en MM et Speaker et PCM revenaient au max.

Deux petites pastilles pour gérer au mieux la carte son sans être pollué par le hdmi

root@debian:/etc/modprobe.d# cat snd_hda_intel.conf
options snd_hda_intel model=auto
options snd_hda_intel enable=1,0

root@debian:/etc/modprobe.d# lspci -nnk | grep -i audio -A2
00:14.2 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] SBx00 Azalia (Intel HDA) [1002:4383] (rev 40)
	Subsystem: Hewlett-Packard Company SBx00 Azalia (Intel HDA) [103c:1443]
	Kernel driver in use: snd_hda_intel
--
02:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Cedar HDMI Audio [Radeon HD 5400/6300/7300 Series] [1002:aa68] (rev ff)
	Kernel modules: snd_hda_intel


L’efficacité n’est pas de 100%.
Si j’ouvre la session tardivement, après que la tempo de 60 s ait claquée, je m’aperçois que les niveaux Speaker et PCM sont remis au max
Il y a donc quelque chose qui touche au niveau alsa pendant l’ouverture de session

pulseaudio ?

Possible.
quand je fais
systemctl status user*

je vois du
─1369 /usr/bin/pulseaudio --start --log-target=syslog
├─1453 /usr/lib/gnome-settings-daemon/gsd-sound

j'ai fait une infâme bidouille avec un lanceur dans $home/.config/autostart pour lancer une copie du binaire alsactl que j'ai mise dans mon $home/bin
 ça me permets de restaurer les niveaux alsamixer en fin d'ouverture de session