Capture audio à clé unique sous Linux (économiser sur la libération des clés)

9

Je voudrais exécuter un programme qui enregistre l'audio uniquement lorsque la touche de contrôle droite est maintenue enfoncée. Lors de la libération du clavier, le résultat serait écrit sur le disque comme, par exemple yy-mm-dd hh:mm.ogg. Comment pourrais-je faire ça?

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

Le contrôle de droite est capturé comme suit par xev pour les événements clé en bas et clé en haut:

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, mon bureau actuel est Xfce. Une piste que je suis: http://www.thinkwiki.org/wiki/How_to_get_special_keys_to_work#bypassing_Xorg

Rob Moore
la source
Et qu'est-ce qui ne fonctionne pas exactement? Si vous parvenez à halevttravailler, il vous suffit de démarrer votre enregistrement en appuyant sur une touche et de le tuer lors de la libération de la touche (pas avec SIGKILL, bien sûr).
peterph
Exécuter quelque chose en tant que root (par exemple en utilisant sudo) serait-il un problème? Je ne sais pas comment capturer tous les événements dans un environnement X, mais je sais comment capturer des événements à partir d'un périphérique / dev / input / event (pour lequel vous aurez besoin des privilèges root)
brm

Réponses:

1

Pour piéger les événements, je le recommande xbindkeys, cela fonctionne indépendamment de votre environnement de bureau. De là, vous pouvez déclencher un script shell qui fait tout. L'astuce est de faire cette logique de presse / relâchement. Une façon consiste xbindkeysà déclencher une application qui, par elle-même, écoute la sortie, mais les événements xorg ne sont pas fiables et il peut ne jamais se terminer (sans mentionner que vous devez coder pour xlib).

Il est préférable que le script commence simplement l'enregistrement (avec la longueur maximale "de sécurité" définie) et écrive l'id du processus (PID) quelque part dans le système de fichiers. L'événement de libération lit simplement ce PID et utilise killpour arrêter l'enregistrement. Ceci est sûr car arecordest conçu pour arrêter l'enregistrement de manière sensible sur le signal de mise à mort.

Un croquis approximatif:

  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"

Vous pouvez exécuter une sortie d'enregistrement directement sur lameou sur d'autres périphériques de codage pour éviter les fichiers volumineux. Ou convertissez après l'envoi de l'événement du bouton de libération. Le code de version pourrait être

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

Si vous encodez à la sortie, vous devez obtenir le nom de fichier quelque part, peut-être à partir d'un autre fichier temporaire.

orion
la source
7 lignes de code, même si je pense que cela vaut la peine de l'apprendre
Xsi
0

Je ne sais pas si Xfce prend en charge le déclenchement de commandes à la pression et au relâchement des boutons, mais je semble me rappeler que FVWM2 le prend en charge. L'utilisation d'un script pour démarrer l'enregistrement et d'un autre script pour l'arrêter devrait être tout à fait possible. arecordou parecorddevrait être en mesure de faire l'enregistrement réel.

Alexandre
la source