Desativar som do fone de ouvido?


10

Existe uma maneira de silenciar o som do meu computador toda vez que eu desconecto os fones de ouvido (como um telefone faz) para interromper o som e tocar nos alto-falantes?




Eu postei uma resposta sem usar loops infinitos aqui - askubuntu.com/a/1005144/470017
Al.G.

Respostas:


10

Como detectar uma desconexão

Basicamente, o que funcionou para mim foi:

# 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

Para mim, a diferença estava no 'Nó 0x16' em '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]

Então, baseei a detecção na diferença encontrada.

Como silenciar

Com esse conhecimento, você pode ter um script em execução em segundo plano. Se desconectados, os scripts silenciam os alto-falantes, como usar amixer sset Master playback 0%(ou qualquer outro 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

Você pode torná-lo executável chmod +x scriptname.she colocá-lo nos aplicativos de inicialização. Você precisará ajustar a detecção de desconexão, encontrando sua própria diferença /proc/asound/card0/codec#0(talvez até mude os números aqui para várias placas de som).

Links Relacionados:

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

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

Como alterar automaticamente o nível do volume ao desconectar / conectar os fones de ouvido?


Isso funciona perfeitamente no Mint 17.3. Obrigado!
Briscoooe

4
Ter um script com um whileloop infinito (sem nem um pouco de instrução para dormir) executando continuamente em segundo plano está longe de ser uma solução ideal; é uma solução feia e hacky, além de ser uma CPU e uma bateria que mata. Eu tentei e passei de uma situação normal de utilização constante de 5% da CPU (com navegador, spotify, terminal, IDE, Telegram e outros aplicativos abertos) para 45% de uso constante da CPU.
LeartS

Essa solução é um cidadão terrivelmente ruim, como o @LearlS aponta. Por favor, nunca faça isso. Para uma solução de bom cidadão, use acpi_listen, conforme sugerido em um dos links nesta resposta.
Don escotilha


0

Para o ubuntu-16.10, fiz poucas alterações nesta resposta .

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

Tanto essa resposta como a resposta de que ela veio são cidadãos ruins. Eles parecem funcionar, mas sobrecarregam os recursos do sistema que não são dimensionados - executam alguns programas como esse ao mesmo tempo e isso arruina o sistema. Por favor, nunca faça isso. Você pode usar uma das soluções que envolvem acpi_listen ou similar.
Don escotilha

0

Se você tiver problemas com a captura de eventos , /etc/acpi/handler.shveja minha resposta . Também é sem códigos de dispositivo como Node 0x16.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.