From 2bc6aaca218a690ced37d9fe613c2e7d2a31b255 Mon Sep 17 00:00:00 2001 From: Josh Hansen Date: Tue, 30 May 2023 20:41:15 -0700 Subject: [PATCH] Theoretically support media keys --- src/main.rs | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/src/main.rs b/src/main.rs index f361e2a..b4d6984 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,7 +6,7 @@ use clap::Parser; use cpal::traits::{DeviceTrait, StreamTrait}; use cpal::{self, traits::HostTrait}; use cpal::{OutputCallbackInfo, Stream, StreamConfig}; -use crossterm::event::{Event, KeyCode, KeyModifiers}; +use crossterm::event::{Event, KeyCode, KeyModifiers, MediaKeyCode}; use crossterm::terminal::{disable_raw_mode, enable_raw_mode}; use minimp3::{Decoder, Frame}; use rand::{seq::SliceRandom, thread_rng}; @@ -42,7 +42,9 @@ enum Command { // AnnotateYesNow, // AnnotateNoNow, NextFile, + Play, Pause, + PlayPause, Quit, } @@ -58,7 +60,19 @@ impl TryFrom for Command { 'M' => Ok(Self::AnnotateEntireFile(Class::Music)), 'S' => Ok(Self::AnnotateEntireFile(Class::Speech)), 'q' => Ok(Self::Quit), - ' ' => Ok(Self::Pause), + ' ' => Ok(Self::PlayPause), + _ => Err(()), + } + } +} + +impl TryFrom for Command { + type Error = (); + fn try_from(m: MediaKeyCode) -> Result { + match m { + MediaKeyCode::Play => Ok(Command::Play), + MediaKeyCode::Pause => Ok(Command::Pause), + MediaKeyCode::PlayPause => Ok(Command::PlayPause), _ => Err(()), } } @@ -107,7 +121,12 @@ fn main() -> Result<(), magic::MagicError> { input_tx.send(cmd).unwrap(); } } - KeyCode::Pause => input_tx.send(Command::Pause).unwrap(), + KeyCode::Media(media) => { + if let Ok(cmd) = Command::try_from(media) { + input_tx.send(cmd).unwrap(); + } + } + KeyCode::Pause => input_tx.send(Command::PlayPause).unwrap(), _ => {} }, _ => {} @@ -246,7 +265,15 @@ fn main() -> Result<(), magic::MagicError> { idx.lock().unwrap() ); } + Command::Play => { + stream.as_ref().unwrap().play().unwrap(); + paused = false; + } Command::Pause => { + stream.as_ref().unwrap().pause().unwrap(); + paused = true; + } + Command::PlayPause => { if paused { stream.as_ref().unwrap().play().unwrap(); paused = false;