Captura de áudio de chave única no Linux (economize no lançamento da chave)

9

Eu gostaria de executar um programa que grave áudio apenas quando a tecla Right Control for pressionada. Na liberação do teclado, o resultado gravaria no disco como, por exemplo yy-mm-dd hh:mm.ogg. Como eu posso fazer isso?

$ xmodmap -pke |grep -e Record
keycode 175 = XF86AudioRecord NoSymbol XF86AudioRecord

O Right Control é capturado da seguinte forma pelo xev para eventos de pressionamento e pressionamento de tecla:

KeyPress event, serial 43, synthetic NO, window 0x1800001,
    root 0x7f, subw 0x0, time 27689430, (-145,169), root:(476,366),
    state 0x10, keycode 105 (keysym 0xffe4, Control_R), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 46, synthetic NO, window 0x1800001,
    root 0x7f, subw 0x0, time 27689540, (-145,169), root:(476,366),
    state 0x14, keycode 105 (keysym 0xffe4, Control_R), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

ClientMessage event, serial 46, synthetic YES, window 0x1800001,
    message_type 0x112 (WM_PROTOCOLS), format 32, message 0x110 (WM_DELETE_WINDOW)

FWIW, minha área de trabalho atual é Xfce. Uma dica que estou seguindo: http://www.thinkwiki.org/wiki/How_to_get_special_keys_to_work#bypassing_Xorg

Rob Moore
fonte
E o que exatamente não funciona? Se você conseguir halevttrabalhar, basta iniciar a gravação com o pressionamento de teclas e matá-lo com o lançamento das teclas (não com SIGKILL, é claro).
Peterph
Executar algo como root (por exemplo, usando o sudo) seria um problema? Eu não sei como capturar todos os eventos em um ambiente X, mas eu sei como capturar eventos de um dispositivo / dev / input / evento (para o qual você vai precisar de privilégios de root)
brm

Respostas:

1

Para capturar os eventos, eu recomendo xbindkeys, ele funciona independentemente do seu ambiente de área de trabalho. A partir daí, você pode acionar um script de shell que faz tudo. O mais complicado é fazer essa lógica de imprensa / liberação. Uma maneira é xbindkeysacionar um aplicativo que, por si só, escuta a liberação, mas os eventos do xorg não são confiáveis ​​e podem nunca sair (sem mencionar que você precisa codificar para xlib).

É muito melhor para o script iniciar a gravação (com o comprimento máximo "de segurança" definido) e escrever o ID do processo (PID) em algum lugar do sistema de arquivos. O evento de lançamento apenas lê este PID e usa killpara parar a gravação. Isso é seguro porque arecordfoi projetado para parar a gravação de forma sensata no sinal de interrupção.

Um esboço aproximado:

  if [ ! -f "~/.recordpid" ]; then
    echo "already running" >&2
    exit 1
  fi
  file="$(date '+recording-%m-%d-%H:%M:%S.wav')"
  nohup arecord -f cd --duration=3600 "~/clips/$file" &> /dev/null &
  echo "$!" > "~/.recordpid"

Você pode executar uma saída de um registro diretamente para lameou outros dispositivos de codificação para evitar arquivos grandes. Ou converta após o envio do evento do botão de liberação. O código de liberação pode ser

  if [ ! -f "~/.recordpid" ]; then
    pid="$(cat "~/.recordpid")"
    kill -l SIGTERM -- "$pid" &>/dev/null
    rm -f "~/.recordpid"
  fi

Se você codificar na liberação, precisará obter o nome do arquivo em algum lugar, possivelmente de outro arquivo temporário.

orion
fonte
7 linhas de código, embora eu acho que vale a pena aprendê-la
Xsi
0

Não sei se o Xfce suporta o acionamento de comandos ao pressionar e liberar botões, mas me lembro que o FVWM2 suporta isso. Usando um script para iniciar a gravação e outro para interrompê-lo, isso deve ser totalmente possível. arecordou parecorddeve poder fazer a gravação real.

Alexander
fonte