Captura de áudio de uma única tecla no Linux (exceto na liberação da chave)

9

Eu gostaria de executar um programa que grava áudio somente quando a tecla de Controle Direita está pressionada. No lançamento do teclado, o resultado gravaria no disco como, por ex. %código%. Como posso fazer isso?

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

O Controle Direito é capturado da seguinte forma por xev para os eventos key down e key up:

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 é yy-mm-dd hh:mm.ogg . Um dos leads que estou seguindo: link

    
por Rob Moore 16.05.2013 / 14:23

2 respostas

1

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

É muito melhor que o script comece a gravar (com o comprimento máximo definido como "segurança") e escreva o ID do processo (PID) em algum lugar do sistema de arquivos. O evento release apenas lê este PID e usa kill para parar a gravação. Isso é seguro porque arecord foi projetado para interromper o registro de maneira sensata no sinal de eliminação.

Um esboço:

  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 a saída do registro diretamente para lame ou 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 lançamento pode ser

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

Se você codificar no lançamento, você precisa obter o nome do arquivo em algum lugar, possivelmente de outro arquivo temporário.

    
por 04.03.2014 / 15:01
0

Eu não sei se o Xfce suporta comandos de acionamento na imprensa e liberação de botões, mas parece que me lembro que o FVWM2 suporta isso. Usando um script para iniciar a gravação e outro script para interrompê-lo, isso deve ser totalmente possível. arecord ou parecord deve ser capaz de fazer a gravação real.

    
por 28.06.2013 / 13:03