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

36

Lo que quiero es lo siguiente:

  • Cuando conecto mis auriculares, quiero que el sonido no sea silenciado y esté configurado en un nivel de volumen específico.
  • Cuando desconecto mis auriculares, quiero que el sonido se silencie (o se ajuste a un nivel de volumen específico).

Establecer los niveles de volumen no es el problema, pero de alguna manera necesito hacer esto al desconectar / enchufar los auriculares, así que estoy buscando una manera de recibir notificaciones de esos eventos.

Rápidamente descubrí /proc/asound/card0/codec#0que indica si los auriculares están enchufados o no, así que intenté monitorearlo usando inotifywaity cambiar el nivel de volumen en función de las notificaciones modificadas . Desafortunadamente inotifywaitfalló porque proc no es un sistema de archivos ordinario.

¿Hay otras formas de hacer esto (tal vez a través de PulseAudio)?

Dispositivo de audio: Intel HDA , códec de audio: Conexant CX20585 .


Para resumir lo que he intentado hasta ahora:

  • Ear Candy: no se ejecutó en absoluto en mi sistema. Parece ser un proyecto abandonado?
  • El código publicado por Karl Bielefeldt podría funcionar en algún hardware, no en el mío.
  • La idea de StephenPaulger falla debido a la falta de un canal 'Speaker'.
  • Motivado por aking1012, lo hice funcionar al piratear el código del núcleo (después de encontrar el código de detección de jack del códec), pero esa es una solución bastante engorrosa.

Entonces, todavía estoy buscando una manera fácil de hacer esto.

htorque
fuente
Excelente pregunta, ¡yo también quiero hacer esto!
Stephen Paulger
agradable ... pero creo que un parche para alsa será necesario para la respuesta "instantánea" deseada al conectar / desconectar. de lo contrario funcionaría o parecería funcionar, pero bajo carga u otras condiciones, la respuesta podría retrasarse. cree que tiene que interponerse entre el evento de conexión y la palanca de salida. probablemente posible, pero no vale la pena un parche individual a menos que un desarrollador de alsa diga que se comprometerá con el enlace troncal.
RobotHumans
un enfoque sería cargar el módulo en gdb, esperar a que se detengan los eventos de sonido "normales", usar la opción de grabación, enchufar y desconectar los auriculares y ver qué sucedió en la grabación de depuración.
RobotHumans
¿con cuánto retraso te sientes cómodo?
RobotHumans

Respuestas:

3

Para establecer el nivel de volumen desde la consola, use el comando amixer. Por ejemplo:

amixer sset Reproducción maestra 0%

Establecerá tu nivel en 0%

No sé cómo cambiar esto cuando conectas los auriculares ... pero tal vez alguien pueda ayudarte con eso

Luciano Facchinelli
fuente
3

Durante el UDS para Oneiric ha habido una sesión sobre detección de jack. Vea el plano para más detalles. Parece que esto hará exactamente lo que estoy buscando: diferentes niveles de volumen para diferentes dispositivos, pero no en cada hardware:

<htorque> algo que tengo curiosidad: ¿podré tener diferentes niveles de volumen para diferentes dispositivos (p. ej., sonido interno silenciado, auriculares 75%) pronto?

<coling> esto será compatible (en algunos h / w) sí. Las escalas de tiempo son "pronto": p
<coling> (también esperaría que se muestre OSD (con el volumen actual) cuando las tomas están conectadas / desconectadas)

Actualización para 11.10

Esto debería funcionar ahora en Oneiric ; desafortunadamente, mi ThinkPad T510 parece ser uno de los sistemas que actualmente no es compatible.

Otro seguimiento de David Henningsson:

En pocas palabras, es una característica deseable, y nos estamos moviendo en esa dirección, pero lentamente, ya que la característica es más compleja de lo que parece a primera vista.

La buena noticia: en el próximo Ubuntu Oneiric (11.10), esto realmente está funcionando. La mala noticia: no está funcionando para todos.

Más aquí .

Actualización para 12.04

Ahora funciona con mi ThinkPad T510 (y muchos otros modelos) en Ubuntu 12.04 (versión de desarrollo).

htorque
fuente
¿Hay algo que rastree qué hardware es compatible actualmente, o algo por el estilo?
Mu Mind
2

Ear Candy tiene alguna funcionalidad para lidiar con la inserción / extracción de auriculares.

zacharyliu
fuente
1
Parece que esto es solo para auriculares USB ... ¿es correcto?
Mu Mind
2

No sé cuánta experiencia en codificación tiene, pero lo mencionó, inotifywaitasí que voy a suponer que al menos se siente cómodo con los scripts de shell. El siguiente programa C, basado en este artículo , debería ser capaz de detectar que sus auriculares estén enchufados o desenchufados, después de lo cual puede realizar las acciones que desee.

#include <linux/input.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>

int main(int argc, char* argv[])
{
    int fd = -1;
    char name[256]= "Unknown";
    struct input_event event;

    if ((fd = open(argv[1], O_RDONLY)) < 0) {
        perror("evdev open");
        exit(1);
    }

    if(ioctl(fd, EVIOCGNAME(sizeof(name)), name) < 0) {
        perror("evdev ioctl");
    }

    printf("The device on %s says its name is %s\n",
            argv[1], name);

    read(fd, &event, sizeof(struct input_event));
    printf("Event type is %d\n", event.type);
    printf("Event code is %d\n", event.code);
    printf("Event value is %d\n", event.value);

    close(fd);
    return 0;
}

El programa toma un argumento, que debería ser una ruta al dispositivo de evento de entrada para sus auriculares. Esto es /dev/input/event7para mí, pero es posible que tenga que probar algunos para encontrar cuál está en su sistema. Necesitará permisos de lectura en ese dispositivo. El programa imprimirá el nombre del dispositivo y el tipo, código y valor del primer evento antes de salir.

Karl Bielefeldt
fuente
Lamentablemente, ninguno de los eventos * resultó estar conectado a mis auriculares. De todos modos, +1: tal vez sea de ayuda para otros usuarios.
htorque
+1, funciona para mí, de event.valuehecho está cambiado ... pero la readoperación solo vuelve cuando el valor cambia ... ¿tal vez sabes cómo hacer que no se bloquee? ¡gracias de cualquier manera!
Kevin
Agrega O_NONBLOCKcuando abre el dispositivo y verifica el valor de retorno de read. Si es negativo, la lectura se habría bloqueado o se habría producido algún otro error. Hay otras formas más complicadas de hacerlo sin sondeo si está incorporando esto en un programa más grande.
Karl Bielefeldt
1

Verifique dmesg y otros archivos de registro. Probablemente enchufar / desconectar dispara algunos mensajes particulares.

Luego, podría usar un demonio para analizar ese archivo de registro y detectar los eventos. Creo que sabes qué hacer desde este punto :)

Pedro Loureiro
fuente
1

Si lo haces

amixer sset 'Speaker' playback 0%

el volumen del altavoz se silenciará pero los auriculares seguirán funcionando. Desenchufar los auriculares significa que no hay sonido. Que es casi lo que quieres ...

Sin embargo ...

Si modifica el control de volumen, la configuración de volumen 'Altavoz' se configurará nuevamente. Esto se debe a que pulseaudio intenta ser inteligente con la configuración de volúmenes (consulte http://pulseaudio.org/wiki/PulseAudioStoleMyVolumes para obtener más información). Sin embargo, podemos evitar que se meta con los volúmenes.

Abra /etc/pulse/default.pa

y encuentra la línea

load-module module-udev-detect

y cambiarlo a

load-module module-udev-detect ignore_dB=1

Reinicie pulseaudio.

killall pulseaudio

Ahora, si silencia el volumen del altavoz, cambiar el volumen maestro no lo afectará. Entonces los auriculares funcionarán pero el altavoz permanecerá en silencio.

StephenPaulger
fuente
Sería un enfoque diferente, pero desafortunadamente no tengo un canal de volumen de altavoces, solo Master y PCM.
htorque
1

Verifique los cambios en el socket ACPID, se puede hacer con la ayuda de Python o C o script de shell ( código de Python para controlar la reproducción y pausa del complemento de auriculares en rhythmbox). Verifique los cambios en el voltaje ACPID para detectar el enchufe del auricular y el enchufe del auricular. Sin embargo, se puede esperar una demora de segundos.

t3pleni9
fuente