Detectar eventos de reprodução / pausa de mídia

1

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?

    
por kyrill 26.09.2017 / 23:11

0 respostas