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?
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?
Respostas:
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.
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.sh
e 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?
while
loop 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.
acpi_listen
, conforme sugerido em um dos links nesta resposta.
Isso funcionou para mim no Ubuntu 14.04:
"com os fones de ouvido emudecidos. Coloque os fones de ouvido e aumente o volume. Remova os fones de ouvido e verifique se há som."
Crédito: RevDrStrangelove em https://www.reddit.com/r/LifeProTips/comments/369k76/lpt_request_automaticly_mute_laptop_after_headset/
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
Se você tiver problemas com a captura de eventos , /etc/acpi/handler.sh
veja minha resposta . Também é sem códigos de dispositivo como Node 0x16
.