¿Silenciar el sonido en los auriculares?


10

¿Hay alguna forma de silenciar el sonido de mi computadora cada vez que desconecto mis auriculares (como lo hace un teléfono) para detener el sonido y luego reproducirlo en mis altavoces?




Respuestas:


10

Cómo detectar una desconexión

Básicamente lo que funcionó para mí fue:

# 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 mí, la diferencia estaba en 'Nodo 0x16' en 'Valles de salida de amplificador':

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]

Así que basé la detección en la diferencia encontrada.

Cómo silenciar

Con este conocimiento, puede tener un script ejecutándose en segundo plano. Si está desconectado, los scripts silencian sus altavoces como si estuvieran usando amixer sset Master playback 0%(o cualquier otro 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

Puede hacerlo ejecutable chmod +x scriptname.shy ponerlo en las aplicaciones de inicio. Sin embargo, tendrá que ajustar la detección de desconexión encontrando su propia diferencia /proc/asound/card0/codec#0(quizás incluso cambie los números aquí para varias tarjetas de sonido.

Enlaces relacionados:

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

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

¿Cómo cambiar automáticamente el nivel de volumen al desconectar / enchufar los auriculares?


Esto funciona perfectamente en Mint 17.3. ¡Gracias!
Briscoooe

44
Tener una secuencia de comandos con un whilebucle infinito (sin siquiera una pequeña instrucción de suspensión) ejecutándose continuamente en segundo plano está lejos de ser una solución ideal; Es una solución fea y hacky, además de ser una CPU y un asesino de la batería. Lo probé y pasé de una situación normal de uso constante de CPU del 5% (con navegador, spotify, terminal, IDE, Telegram y otras aplicaciones abiertas) a un uso constante de CPU del 45%.
LeartS

Esta solución es un ciudadano terriblemente malo, como señala @LearlS. Por favor, nunca hagas esto. Para una solución de buen ciudadano, use acpi_listen, como se sugiere en uno de los enlaces de esta respuesta.
Don Hatch


0

Para ubuntu-16.10 hice pocos cambios en esta respuesta .

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 esta respuesta como la respuesta de la que provienen son malos ciudadanos. Parecen funcionar, pero acaparan los recursos del sistema que no se escalan: ejecutan algunos programas como este al mismo tiempo y arruinan el sistema. Por favor, nunca hagas esto. Puede utilizar una de las soluciones que involucran acpi_listen o similar en su lugar.
Don Hatch

0

Si tiene problemas con los eventos de captura de /etc/acpi/handler.shver a mi respuesta . También es sin códigos de dispositivo como Node 0x16.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.