O que eu quero é o seguinte:
- Quando conecto meus fones de ouvido, quero que o som fique sem som e definido para um nível de volume específico.
- Quando desconecto os fones de ouvido, quero que o som fique mudo (ou definido para um nível de volume específico).
Definir os níveis de volume não é o problema, mas de alguma forma eu preciso fazer isso ao desconectar / conectar os fones de ouvido, então estou procurando uma maneira de ser notificado sobre esses eventos.
Eu rapidamente descobri /proc/asound/card0/codec#0
que os fones de ouvido estão conectados ou não, então tentei monitorá-lo usando inotifywait
e alterando o nível do volume com base nas notificações modificadas . Infelizmente inotifywait
falhei porque proc não é um sistema de arquivos comum.
Existem outras maneiras de fazer isso (talvez via 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, não no meu.
- A ideia de StephenPaulger falha devido à falta de um canal 'Speaker'.
- Motivado por aking1012, eu fiz o trabalho invadindo o código do kernel (depois de encontrar o código do sensor de tomada do codec), mas essa é uma solução bastante complicada.
Então, ainda estou procurando uma maneira fácil de fazer isso.
fonte
Respostas:
Para definir o nível do volume no console, use o comando amixer. Por exemplo:
Definirá seu nível para 0%
Não sei como mudar isso quando você conecta seus fones de ouvido ... mas talvez alguém possa ajudá-lo com isso
fonte
Durante o UDS para Oneiric, houve uma sessão sobre detecção de jack. Veja o blueprint para detalhes. Parece que isso fará exatamente o que estou procurando: níveis de volume diferentes para dispositivos diferentes - mas não em todos os hardwares:
Atualização para 11.10
Isso agora deve estar funcionando em Oneiric - infelizmente, o meu ThinkPad T510 parece ser um dos sistemas atualmente não suportados.
Outro acompanhamento de David Henningsson:
Mais aqui .
Atualização para 12.04
Agora ele está trabalhando com o meu ThinkPad T510 (e muitos outros modelos) no Ubuntu 12.04 (versão de desenvolvimento).
fonte
O Ear Candy possui algumas funcionalidades para lidar com a inserção / remoção de fones de ouvido.
fonte
Não sei quanta experiência de codificação você tem, mas você mencionou,
inotifywait
portanto, assumirei que você se sinta ao menos confortável com scripts de shell. O programa C a seguir, com base neste artigo , deve detectar os fones de ouvido conectados ou desconectados, após o qual você pode executar as ações que desejar.O programa usa um argumento, que deve ser o caminho para o dispositivo de evento de entrada para seus fones de ouvido. Isso é
/dev/input/event7
para mim, mas você pode precisar 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.fonte
event.value
é realmente alternado ... mas aread
operação só retorna quando o valor muda ... talvez você saiba como fazê-lo não bloquear? obrigado mesmo assim!O_NONBLOCK
quando abre o dispositivo e verifica o valor de retorno doread
. Se for negativo, a leitura teria bloqueado ou ocorreu algum outro erro. Existem outras maneiras mais complicadas de fazer isso sem pesquisar, se você estiver incorporando isso a um programa maior.Verifique o dmesg e outros arquivos de log. Provavelmente, conectar / desconectar aciona algumas mensagens específicas.
Em seguida, você pode 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 :)
fonte
Se você fizer
o volume do alto-falante ficará mudo, mas os fones de ouvido continuarão funcionando. Desconectar os fones de ouvido significa que não há som. Que é quase o que você quer ...
No entanto ...
Se você alterar o controle de volume, a configuração de volume do 'Alto-falante' será configurada novamente. Isso ocorre porque o pulseaudio tenta ser inteligente ao definir volumes (consulte http://pulseaudio.org/wiki/PulseAudioStoleMyVolumes para obter mais informações). No entanto, podemos impedir que mexa nos volumes.
Abra /etc/pulse/default.pa
e encontre a linha
e mude para
Reinicie o pulseaudio.
Agora, se você silenciar o volume do alto-falante, a alteração do volume principal não o afetará. Portanto, os fones de ouvido funcionarão, mas o alto-falante permanecerá silencioso.
fonte
Verifique se há alterações no soquete ACPID, isso pode ser feito com a ajuda de python ou C ou shell script ( código Python para controlar a reprodução do plug-in do fone de ouvido e pausar no rhythmbox). Verifique as alterações na tensão do ACPID para detectar o plug-in e o plug-in do fone de ouvido. Um atraso de segundos pode ser esperado.
fonte
O Pulseaudio possui um módulo enviado por padrão, projetado para obter exatamente isso:
http://pulseaudio.org/wiki/Modules#module-device-restore
fonte
Eu acho que você pode conseguir o que precisa usando isso: https://bbs.archlinux.org/viewtopic.php?pid=1105458#p1105458
fonte