Couper le son sur le casque débranché?

10

Existe-t-il un moyen de couper le son de mon ordinateur à chaque fois que je débranche mes écouteurs (comme le fait un téléphone) pour arrêter le son puis jouer sur mes haut-parleurs?

Dandyman
la source
1
Lien connexe: unix.stackexchange.com/questions/25776/…
con-f-use
J'ai posté une réponse sans utiliser de boucles infinies ici - askubuntu.com/a/1005144/470017
Al.G.

Réponses:

10

Comment détecter un débranchement

Fondamentalement, ce qui a fonctionné pour moi était:

# When plugged in:
cat /proc/asound/card0/codec#0 > pluggedin.txt

# When not plugged in:
cat /proc/asound/card0/codec#0 > notplugged.txt

# Then compare the differences
diff pluggedin.txt notplugged.txt

Pour moi, la différence était dans «Node 0x16» sous «Amp-Out vals»:

Node 0x16 [Pin Complex] wcaps 0x40058d: Stereo Amp-Out             Node 0x16 [PinComplex] wcaps 0x40058d: Stereo Amp-Out
  Amp-Out caps: ofs=0x00, nsteps=0x00, stepsize=0x00, mute=1         Amp-Out caps:ofs=0x00, nsteps=0x00, stepsize=0x00, mute=1
  Amp-Out vals:  [0x80 0x80]                                    |    Amp-Out vals:  [0x00 0x00]

J'ai donc basé la détection sur la différence trouvée.

Comment couper le son

Avec cette connaissance, vous pouvez avoir un script exécuté en arrière-plan. S'ils sont débranchés, les scripts mettent vos haut-parleurs en sourdine comme en utilisant amixer sset Master playback 0%(ou toute autre commande).

#!/bin/bash
# This scripts detecs unplugging headphones.

oldstatus="unrelated string"
while [ 1 ]; do
    # The following line has to be changed depending on the difference (use diff) in '/proc/asound/card0/code#0'
    status=$(grep -A 4 'Node 0x16' '/proc/asound/card0/codec#0' |  grep 'Amp-Out vals:  \[0x80 0x80\]')
    if [ "$status" != "$oldstatus" ]; then
        if [ -n "$status" ]; then
            echo "Plugged in"
             amixer sset Master playback 80% # Set volume to 80%
            oldstatus="$status"
        else
            echo "Unplugged"
            amixer sset Master playback 0%  # Mute
            oldstatus="$status"
        fi
    fi
done

Vous pouvez le rendre exécutable avec chmod +x scriptname.shet le mettre dans les applications de démarrage. Vous devrez cependant ajuster la détection de déconnexion en trouvant votre propre différence /proc/asound/card0/codec#0(peut-être même changer les numéros ici pour plusieurs cartes son.

Liens connexes:

https://wiki.ubuntu.com/Audio/PreciseJackDetectionTesting

/unix/25776/detecting-headphone-connection-disconnection-in-linux

Comment changer automatiquement le niveau de volume lors du débranchement / branchement d'un casque?

embrouiller
la source
Cela fonctionne parfaitement sur Mint 17.3. Merci!
Briscoooe
4
Avoir un script avec une whileboucle infinie (sans même une petite instruction de sommeil) s'exécutant en continu en arrière-plan est loin d'être une solution idéale; c'est une solution de contournement laide et hacky, en plus d'être un tueur de processeur et de batterie. Je l'ai essayé et je suis passé d'une situation normale d'utilisation constante de 5% du processeur (avec navigateur, spotify, terminal, IDE, télégramme et autres applications ouvertes) à 45% d'utilisation constante du processeur.
LeartS
Cette solution est un horrible citoyen, comme le souligne @LearlS. Veuillez ne jamais faire ça. Pour une solution de bon citoyen, utilisez acpi_listen, comme suggéré dans l'un des liens de cette réponse.
Don Hatch
0

Pour ubuntu-16.10, j'ai apporté peu de changements à cette réponse .

oldresult="Some Random String"

while [ 1 ]; do
        # incase of plugged out result will contain some data
        result=$(grep "EAPD 0x2: EAPD" /proc/asound/card0/codec#0)

        # checking for oldresult if not same then only go inside
        if [ "$oldresult" != "$result" ]; then
                oldresult=$result
                if [[ -z "$result" ]]; then
                        notify-send "Plugged In"
                        amixer sset Master playback 80% # Set volume to 80%
                 else
                        notify-send "Plugged Out"
                        amixer sset Master playback 0% # Set volume to 0%
                 fi
        fi
done
Abhishek
la source
Cette réponse et la réponse dont elle est issue sont de mauvais citoyens. Ils semblent fonctionner, mais ils monopolisent les ressources du système qui ne sont pas à l'échelle - exécutez quelques programmes comme celui-ci en même temps, et cela ruine le système. Veuillez ne jamais faire ça. Vous pouvez utiliser à la place l'une des solutions impliquant acpi_listen ou similaire.
Don Hatch
0

Si vous avez des problèmes avec les événements qui se produisent, /etc/acpi/handler.shconsultez ma réponse . Il est également sans codes de périphérique comme Node 0x16.

Kuzeyeu Siarhei
la source