Eu quero pausar a reprodução depois que os fones de ouvido foram desconectados e, em seguida, retomar depois que eles foram conectados novamente.
Minha solução atual usa ACPI para detectar plug / unplug, como mostrado aqui . Para reproduzir / pausar a reprodução, eu uso xdotool key XF86AudioPlay
.
Esta solução funciona bem no caso básico:
- a música está tocando, os fones de ouvido estão conectados
- fones de ouvido estão desconectados - > pausas musicais
- fones de ouvido estão conectados novamente - > a música continua tocando.
No entanto, eu não quero retomar a reprodução se ela não estiver ativa quando os fones de ouvido estiverem desconectados.
Imagine este cenário:
- inicie o PC com fones de ouvido,
- tocar música,
- pausar música,
- desconecte os fones de ouvido
- conecte os fones de ouvido de volta.
O último ponto é onde está o problema - a reprodução continuaria depois que os fones de ouvido fossem conectados novamente, embora não estivessem ativos no momento em que foram desconectados.
Além disso, xdotool key XF86AudioPlay
simplesmente alterna a reprodução, enquanto xdotool key XF86AudioPause
não faz nada. Isso torna as coisas ainda piores:
- inicie o PC com fones de ouvido,
- tocar música,
- pausar música,
- desconecte os fones de ouvido (MUSIC STARTS PLAYING!) .
Então, o que preciso é que detecte a reprodução / pausa / interrompa eventos , bem como conecte / desconecte eventos, para poder executar corretamente reagir em todos os cenários possíveis.
Esta máquina de estado descreve a operação desejada:
A única ideia que me veio à mente é voltar a ligar os atalhos de teclado para reproduzir / pausar / parar para adicionar a lógica da máquina de estado. Isso tem a desvantagem de que a reprodução sempre deve ser controlada usando esses atalhos de teclado, em vez de, por exemplo. Botões Rhythmbox, o que é um pouco impraticável.
Além disso, se eu fechar o Rhythmbox enquanto estiver jogando, a máquina de estado permanecerá no estado playing
. É claro que eu poderia ter um 'daemon' que esperaria até o Rhythmbox ser fechado e então definir o estado para stopped
. Mas e se não for o Rhythmbox que toca a música, e se for por exemplo o VLC, etc.? Essa abordagem é feia e não confiável, então eu gostaria de evitar isso.
Minha pergunta: Como detectar quando a reprodução de mídia foi pausada / retomada / interrompida?