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

36

O que eu quero é o seguinte:

  • Quando eu conecto meus fones de ouvido, quero que o som seja desativado e definido para um nível de volume específico.
  • Quando eu desconectar meus fones de ouvido, quero que o som seja silenciado (ou definido para um nível de volume específico).

A configuração dos níveis de volume não é o problema, mas de alguma forma eu preciso fazer isso quando desabo / conecto os fones de ouvido, então estou procurando uma maneira de ser notificado sobre esses eventos.

Eu encontrei rapidamente /proc/asound/card0/codec#0 para indicar se os fones de ouvido estão conectados ou não, então tentei monitorá-lo usando inotifywait e alterar o nível de volume com base nas notificações modificadas . Infelizmente inotifywait falhou porque proc não é um sistema de arquivos comum.

Existem outras maneiras de fazer isso (talvez através do PulseAudio)?

Dispositivo de áudio: Intel HDA , codec de áudio: Conexant CX20585 .

Para resumir o que tentei até agora:

  • Ear Candy: não funcionou no meu sistema. Parece ser um projeto abandonado?
  • O código postado por Karl Bielefeldt pode funcionar em algum hardware, ele não funciona no meu.
  • A ideia de StephenPaulger falha devido à falta de um canal 'Speaker'.
  • Motivado por aking1012 Eu fiz o trabalho hacking no código do kernel (depois de encontrar o código de detecção do jack do codec), mas essa é uma solução bastante complicada.

Ainda estou procurando uma maneira fácil de fazer isso.

    
por htorque 27.01.2011 / 13:16

9 respostas

3

Durante o UDS para Oneiric, houve uma sessão sobre detecção de jack. Consulte o blueprint para obter detalhes. Parece que isso fará exatamente o que estou procurando: diferentes níveis de volume para diferentes dispositivos - não apenas em todos os hardwares:

% bl0ck_qu0te%

Atualização para 11,10

Isso agora deve ser trabalhando na Oneiric - infelizmente meu ThinkPad T510 parece ser um dos sistemas atualmente não suportados.

Outro acompanhamento de David Henningsson:

% bl0ck_qu0te%

Mais aqui .

Atualização para 12.04

Agora está trabalhando com o meu ThinkPad T510 (e muitos outros modelos) no Ubuntu 12.04 (versão de desenvolvimento).

    
por htorque 11.05.2011 / 17:42
3

Para definir o nível de volume no console, use o comando amixer. Por exemplo:

% bl0ck_qu0te%

irá definir o seu nível para 0%

Eu não sei como mudar isso quando você conecta seus fones de ouvido ... mas talvez alguém possa ajudá-lo com isso

    
por Luciano Facchinelli 27.01.2011 / 15:30
2

Ear Candy tem algumas funcionalidades para lidar com a inserção / remoção de fones de ouvido.

    
por zacharyliu 28.01.2011 / 01:08
2

Eu não sei quanta experiência de codificação você tem, mas você mencionou inotifywait , então eu vou assumir que você está, pelo menos, confortável com scripts de shell. O seguinte programa em C, baseado neste artigo , deve ser capaz de detectar que seus fones de ouvido estão conectados ou desconectados, após o que você pode execute as ações desejadas.

#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;
}

O programa recebe um argumento, que deve ser um caminho para o dispositivo de evento de entrada para seus fones de ouvido. Isso é /dev/input/event7 para mim, mas você pode ter que tentar alguns para descobrir qual é o seu sistema. Você precisará de permissões de leitura nesse dispositivo. O programa imprimirá o nome do dispositivo e o tipo, código e valor do primeiro evento antes de sair.

    
por Karl Bielefeldt 03.02.2011 / 20:18
1

Verifique o dmesg e outros arquivos de log. Provavelmente ligar / desligar aciona algumas mensagens em particular.

Em seguida, você poderia usar um daemon para analisar esse arquivo de log e detectar os eventos. Eu acho que você sabe o que fazer a partir deste ponto:)

    
por Pedro Loureiro 03.02.2011 / 16:59
1

Se você fizer

amixer sset 'Speaker' playback 0%

o volume do alto-falante será silenciado, mas os fones de ouvido continuarão funcionando. Desconectar os fones de ouvido significa que não há som. Qual é quase o que você quer ...

No entanto ...

Se você alterar o controle de volume, a configuração de volume 'Speaker' será configurada novamente. Isso ocorre porque o pulseaudio tenta ser inteligente com os volumes de configuração (consulte link para obter mais informações). Podemos impedi-lo de mexer com os volumes embora.

Abra o /etc/pulse/default.pa

e encontre a linha

load-module module-udev-detect

e mude para

load-module module-udev-detect ignore_dB=1

Reinicie o pulseaudio.

killall pulseaudio

Agora, se você silenciar o volume do alto-falante, a alteração do volume principal não afetará o volume. Então, os fones de ouvido funcionarão, mas o alto-falante permanecerá em silêncio.

    
por StephenPaulger 04.02.2011 / 12:23
1

Verifique se há mudanças no soquete ACPID, isso pode ser feito com a ajuda de python ou script C ou shell, ( código Python para controlar o plug-in do fone de ouvido e pausar no rhythmbox). Verifique as alterações na voltagem do ACPID para detectar o plug-in do fone de ouvido e o plug-out do fone de ouvido. Entretanto, um atraso de segundos pode ser esperado.

    
por t3pleni9 05.01.2015 / 06:33
0

O Pulseaudio tem um módulo enviado por padrão que é projetado para alcançar exatamente isso:

link

    
por towolf 08.02.2011 / 22:10
0

Acho que você pode conseguir o que precisa usando: link

    
por Zilmar 05.06.2013 / 03:07