Je m’y connais pas en bash, mais connaissant des langages.
Tu peux changer:
cat /proc/asound/modules | tail -1
par
tail -n1 /proc/asound/modules
Sache que dans le début du résultat de cet commande tu as (Normalement) un espace " 1…", donc "1 … " == $toto, ne donnera pas résultat, ajoute un espace devant 1 (ou 0 dans d’autres cas).
Pour faire un “/etc/init.d/alsa-utils restart” il me semble que tu dois posséder les droits root, du coup en utilisateur normal sa finalisera pas la tâche voulu.
Il devrait y avoir une manière de faire fonctionner en utilisateur, n’ayant eu jamais besoin je sais pas comment, mais une idée me dit de faire un exécutable comme les programmes normale et pour cela un piste serait un fichier bin (/usr/bin/tonprogramme) (l’idée semble bonne mais pas sûr s’il fonctionnera ou pas ou si c’est une bonne méthode).
Sinon faire une fonction “redemarrage” n’est pas vraiment nécessaire pour un petit script et tu gagneras plus en performance bien que presque invisible.
Faire un script est une bonne idée, ces derniers jours c’est populaire les sujets sur le son et sa risque de durer.
Un script plus évolué et simple d’utilisateur aurait permis de résoudre tous ces sujets si facilement, dommage que je suis fainéant…
Root te le permet.
Sudo te le permet, si tu le fais permettre.
Essaye dans les deux cas et tu verras bien.
Ne connaissant pas trop sudo, sudo te permet d’exécuté en droit de root: un application ou plusieurs applications ou tous les applications pour un seul utilisateur ou plusieurs utilisateurs ou tous les utilisateurs. Donc à toi de voir comment tu veux faire.
Alors, un ami m’a un peu plus expliqué comment améliorer mon script et voici le résultat, avec la présence de quelque débug:
#!/bin/bash
toto=$(tail -n1 /proc/asound/modules);
echo $toto;
if [ " 1 snd_usb_audio" = "$toto" ]; then
echo "casque branché";
if [ -f /home/leknopppix/.asoundrc_bak ]; then
echo "Renommage du bak en rien";
mv /home/leknoppix/.asoundrc_bak /home/leknoppix/.asoundrc && /etc/init.d/alsa-utils restart
else
echo "simple redemarrage";
/etc/init.d/alsa-utils restart
fi
elif [ " 0 snd_hda_intel" = "$toto" ]; then
echo "Casque débranché";
if [ -f /home/leknopppix/.asoundrc ]; then
echo "Renommage du rien en bak";
mv /home/leknoppix/.asoundrc /home/leknoppix/.asoundrc_bak && /etc/init.d/alsa-utils restart
else
/etc/init.d/alsa-utils restart
fi
fi
Le seul hic, c’est que je rentre pas dans les bonnes boucles if.
Je m’explique, j’ai mon casque branché, le fichier .asoundrc_bak de brancher, mais impossible de rentrer dans le premiere condition de if [ -f /home/leknopppix/.asoundrc_bak ].
Allo ?! Allo ? Tu m’entends ?! T’es une variable et tu t’appelle « toto » ! Non, mais allo ? Allo, quoi ?!
Plus sérieusement, tu compare avec = au lieu de ==. Évidement une variable qui s’appelle totot ce n’est pas très propre et les chemins de fichiers complets non plus. Tu peut aussi simplifier le programme (quoi qu’il arrive tu redémarre alsa-utils) et je ne connais pas assez /proc/asound/modules pour faire confiance à un tail -n1, avec awk c’est un peu plus sûr. J’ai repris le fonctionnement que tu semblais vouloir mais à mon avis, il vaudrait mieux faire comme dans le second script :
if [[ “$state” == “1” ]]; then
echo "casque branché : Création du asoundrc"
cat >> “${HOME}/.asoundrc” <<EOF
defaults.ctl.card 1
defaults.pcm.card 1
defaults.pcm.device 0
EOF
else
echo "Casque débranché : Suppression de asoundrc"
rm "${HOME}/.asoundrc"
fi
/etc/init.d/alsa-utils restart[/code]
Comme ça tu n’a plus besoin de fichier extérieur.
L’étape supplémentaire c’est de regarder du coté de udev pour lancer ton script au branchement et débranchement de ton casque de manière automatique. Je te laisse commencé à chercher dans ce sens et n’hésite pas à venir poser des questions si tu es en galère
/etc/init.d/alsa-utils restart
Shutting down ALSA…warning: ‘alsactl store’ failed with error message ‘alsactl: save_state:1532: Cannot open /var/lib/alsa/asound.state for writing: Permission denied’…failed.
Setting up ALSA…done.[/code]
Et instruction avec le casque renvoie 1, sinon rien.
D’après ce que j’ai compris, j’ai récupéré le numéro de serie de mon casque:
Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 002: ID 045e:070f Microsoft Corp.
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 064e:a103 Suyin Corp. Acer/HP Integrated Webcam [CN0314]
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Voici ma règle udev si j’ai compris comment elle fonctionnait:
Ouep. D’une manière général les dossiers machin.d sont des dossiers de configuration. Tu y crée autant de fichiers que tu veux qui contiennent un bout de configuration. L’avantage c’est de pouvoir découper ta configuration en plusieurs partie, l’autre énorme avantage c’est qu’ajouter ou retirer les bouts de conf se fait sans risque de problème pour le reste et la mise à jour d’udev (en l’occurrence ne pose pas de problème).
Mes règles fonctionnent sans aucun soucis. Le seul truc qu’il ne faut pas que j’oublie, c’est que si le son passe par le navigateur, il faut que je le referme et le redémarre, tout comme avec vlc ou lecteur audio.