Audio muto su Cuffie scollegato?


10

Esiste un modo per silenziare l'audio dal mio computer ogni volta che scollego le cuffie (come fa un telefono) per interrompere l'audio e poi riprodurlo dagli altoparlanti?




Ho pubblicato una risposta senza usare infiniti loop qui - askubuntu.com/a/1005144/470017
Al.G.

Risposte:


10

Come rilevare una disconnessione

Fondamentalmente ciò che ha funzionato per me è stato:

# 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

Per me la differenza era in "Nodo 0x16" in "Valori di uscita":

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]

Quindi ho basato il rilevamento sulla differenza rilevata.

Come silenziare

Con questa conoscenza puoi avere uno script in esecuzione in background. Se scollegato, gli script disattivano l'audio dei relatori come usando amixer sset Master playback 0%(o qualsiasi altro comando).

#!/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

È possibile renderlo eseguibile con chmod +x scriptname.she inserirlo nelle applicazioni di avvio. Dovrai regolare il rilevamento della disconnessione trovando la tua differenza in /proc/asound/card0/codec#0(forse anche cambiare i numeri qui per più schede audio.

Link correlati:

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

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

Come modificare automaticamente il livello del volume quando si scollegano / si collegano le cuffie?


Funziona perfettamente su Mint 17.3. Grazie!
Briscoooe,

4
Avere uno script con un whileciclo infinito (senza nemmeno una piccola istruzione di sonno) in esecuzione continuamente in background è tutt'altro che una soluzione ideale; è una soluzione brutta e burrascosa, oltre ad essere un cpu e un killer della batteria. L'ho provato e sono passato da una normale situazione di utilizzo costante del 5% della CPU (con browser, spotify, terminale, IDE, Telegram e altre app aperte) al 45% di utilizzo costante della CPU.
LeartS

Questa soluzione è un cittadino orribilmente cattivo, come sottolinea @LearlS. Per favore, non farlo mai. Per una soluzione di buon cittadino, utilizzare acpi_listen, come suggerito in uno dei collegamenti in questa risposta.
Don Hatch,


0

Per ubuntu-16.10 ho apportato poche modifiche a questa risposta .

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

Sia questa risposta che la risposta da essa provengono sono cattivi cittadini. Sembrano funzionare, ma limitano le risorse di sistema che non si ridimensionano: eseguono alcuni programmi come questo contemporaneamente e rovinano il sistema. Per favore, non farlo mai. Puoi invece utilizzare una delle soluzioni che coinvolgono acpi_listen o simili.
Don Hatch,

0

Se riscontri problemi con gli eventi in corso, /etc/acpi/handler.shconsulta la mia risposta . È anche senza codici dispositivo come Node 0x16.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.