Captura de audio de clave única en Linux (guardar en la liberación de clave)

9

Me gustaría ejecutar un programa que grabe audio solo cuando se mantenga presionada la tecla Control derecho. En el lanzamiento del teclado, el resultado escribiría en el disco como, por ejemplo yy-mm-dd hh:mm.ogg. ¿Cómo podría hacer eso?

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

Control derecho es capturado de la siguiente manera por xev para los eventos de tecla abajo y tecla arriba:

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, mi escritorio actual es Xfce. Una pista que estoy siguiendo: http://www.thinkwiki.org/wiki/How_to_get_special_keys_to_work#bypassing_Xorg

Rob Moore
fuente
¿Y qué no funciona exactamente? Si logras halevttrabajar, solo debes comenzar tu grabación al presionar una tecla y matarla al soltar la tecla (no con SIGKILL, por supuesto).
Peter
¿Sería un problema ejecutar algo como root (por ejemplo, usar sudo)? No sé cómo capturar todos los eventos en un entorno X, pero sí sé cómo capturar eventos desde un dispositivo / dev / input / event (para el cual necesitará privilegios de root)
brm

Respuestas:

1

Para atrapar los eventos, recomiendo xbindkeys, funciona independientemente de su entorno de escritorio. A partir de ahí, puede activar un script de shell que hace todo. El truco es hacer esta lógica de prensa / liberación. Una forma es xbindkeysdesencadenar una aplicación que luego escucha por sí sola el lanzamiento, pero los eventos xorg no son confiables y es posible que nunca se cierre (sin mencionar que necesita codificar para xlib).

Es mucho mejor que el script solo comience a grabar (con la longitud máxima "segura" establecida) y escriba la identificación del producto (PID) en algún lugar del sistema de archivos. El evento de lanzamiento solo lee este PID y lo utiliza killpara detener la grabación. Esto es seguro porque arecordestá diseñado para detener la grabación de manera sensata en la señal de apagado.

Un bosquejo 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"

Puede ejecutar una salida de registro directamente a lameotros dispositivos de codificación para evitar archivos grandes. O convierta después de que se envíe el evento del botón de liberación. El código de lanzamiento podría ser

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

Si va a codificar en el lanzamiento, debe obtener el nombre del archivo en algún lugar, posiblemente de otro archivo temporal.

Orión
fuente
7 líneas de código, aunque creo que vale la pena aprenderlo
Xsi
0

No sé si Xfce admite comandos de activación al presionar y soltar botones, pero parece recordar que FVWM2 lo admite. Usando un script para comenzar la grabación y otro script para detenerlo, esto debería ser completamente posible. arecordo parecorddebería poder hacer la grabación real.

Alejandro
fuente