Przechwytywanie dźwięku z jednego klucza w systemie Linux (oszczędzanie przy wydaniu klucza)

9

Chciałbym uruchomić program, który nagrywa dźwięk tylko wtedy, gdy wciśnięty jest prawy klawisz Control. Po zwolnieniu klawiatury wynik zapisywałby na dysk jako np yy-mm-dd hh:mm.ogg. Jak mogę to zrobić?

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

Kontrola prawna jest przechwytywana przez xev w następujący sposób dla zdarzeń związanych z kluczowaniem i opuszczaniem:

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, mój obecny pulpit to Xfce. Jeden trop, którego śledzę: http://www.thinkwiki.org/wiki/How_to_get_special_keys_to_work#bypassing_Xorg

Rob Moore
źródło
A co dokładnie nie działa? Jeśli uda ci się zacząć halevtdziałać, powinieneś po prostu rozpocząć nagrywanie po naciśnięciu klawisza i zabić go po zwolnieniu klawisza ( SIGKILLoczywiście nie za pomocą ).
peterph
Czy uruchamianie czegoś jako root (np. Używanie sudo) byłoby problemem? Nie wiem, jak przechwytywać wszystkie zdarzenia w środowisku X, ale wiem, jak przechwytywać zdarzenia z urządzenia / dev / input / event (do którego potrzebne będą uprawnienia roota)
brm

Odpowiedzi:

1

Polecam xbindkeys, aby przechwytywać zdarzenia, działa niezależnie od środowiska pulpitu. Stamtąd możesz uruchomić skrypt powłoki, który robi wszystko. Trudnym zadaniem jest zrobienie tej logiki naciśnij / zwolnij. Jednym ze sposobów jest xbindkeysuruchomienie aplikacji, która następnie sama nasłuchuje wydania, ale zdarzenia xorg są niewiarygodne i mogą nigdy nie zostać zakończone (nie wspominając o tym, że musisz kodować Xlib).

Znacznie lepiej jest, aby skrypt po prostu zaczął nagrywać (z ustawioną maksymalną długością „bezpieczeństwa”) i zapisał identyfikator procesu (PID) gdzieś w systemie plików. Wydanie zwalnia tylko odczytuje ten PID i używa killdo zatrzymania nagrywania. Jest to bezpieczne, ponieważ arecordma na celu rozsądne zatrzymanie nagrywania po sygnale zabicia.

Szorstki szkic:

  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"

Możesz uruchomić wyjście arecord bezpośrednio na lameinnym urządzeniu do kodowania, aby uniknąć dużych plików. Lub przekonwertuj po wysłaniu zdarzenia przycisku zwolnienia. Kod wydania może być

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

Jeśli kodujesz przy wydaniu, musisz gdzieś pobrać nazwę pliku, być może z innego pliku tymczasowego.

orion
źródło
7 linii kodu, choć myślę, że warto się go nauczyć
Xsi,
0

Nie wiem, czy Xfce obsługuje wyzwalanie poleceń po naciśnięciu i zwolnieniu przycisków, ale wydaje mi się, że pamiętam, że FVWM2 to obsługuje. Korzystanie z jednego skryptu do rozpoczęcia nagrywania i drugiego skryptu do jego zatrzymania powinno być w pełni możliwe. arecordlub parecordpowinien być w stanie dokonać właściwego nagrania.

Alexander
źródło