From 9d46cb761948621572b33e4bc1c0f0bde4ede3b5 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Wed, 3 Jul 2024 21:18:39 +0300 Subject: [PATCH] bye DynamicDevice; now to reenable playback... --- src/core.rs | 16 +++++++++- src/core/device.rs | 77 --------------------------------------------- src/model/looper.rs | 30 +++--------------- src/model/mixer.rs | 42 ++++++++++++------------- 4 files changed, 40 insertions(+), 125 deletions(-) delete mode 100644 src/core/device.rs diff --git a/src/core.rs b/src/core.rs index 459f0869..6bfec915 100644 --- a/src/core.rs +++ b/src/core.rs @@ -15,10 +15,24 @@ pub use crossterm::event::{Event, KeyEvent, KeyCode, KeyModifiers}; macro_rules! submod { ($($name:ident)*) => { $(mod $name; pub use self::$name::*;)* }; } -submod!( device handle jack keymap midi port render run time ); +submod!( handle jack keymap midi port render run time ); pub type Usually = Result>; +pub trait Component: Render + Handle {} + +impl Component for T {} + +/// A UI component that may have presence on the JACK grap. +pub trait Device: Render + Handle + Ports + Send + Sync { + fn boxed (self) -> Box where Self: Sized + 'static { + Box::new(self) + } +} + +/// All things that implement the required traits can be treated as `Device`. +impl Device for T {} + // Reexport macros: pub use crate::{ render, diff --git a/src/core/device.rs b/src/core/device.rs deleted file mode 100644 index 1663a64e..00000000 --- a/src/core/device.rs +++ /dev/null @@ -1,77 +0,0 @@ -use crate::core::*; - -pub trait Component: Render + Handle {} - -impl Component for T {} - -/// A UI component that may have presence on the JACK grap. -pub trait Device: Render + Handle + Ports + Send + Sync { - fn boxed (self) -> Box where Self: Sized + 'static { - Box::new(self) - } -} - -/// All things that implement the required traits can be treated as `Device`. -impl Device for T {} - -/// A device dynamicammy composed of state and handlers. -pub struct DynamicDevice { - pub state: Arc>, - pub render: MutexUsually + Send>>, - pub handle: ArcUsually + Send>>>, - pub process: ArcControl + Send>>>, - pub client: Option -} - -impl Handle for DynamicDevice { - fn handle (&mut self, event: &AppEvent) -> Usually { - self.handle.lock().unwrap()(&mut *self.state.lock().unwrap(), event) - } -} - -impl Render for DynamicDevice { - fn render (&self, buf: &mut Buffer, area: Rect) -> Usually { - self.render.lock().unwrap()(&*self.state.lock().unwrap(), buf, area) - } -} - -impl Ports for DynamicDevice {} - -impl DynamicDevice { - pub fn new <'a, R, H, P> (render: R, handle: H, process: P, state: T) -> Self where - R: FnMut(&T, &mut Buffer, Rect) -> Usually + Send + 'static, - H: FnMut(&mut T, &AppEvent) -> Usually + Send + 'static, - P: FnMut(&mut T, &Client, &ProcessScope) -> Control + Send + 'static, - { - Self { - state: Arc::new(Mutex::new(state)), - render: Mutex::new(Box::new(render)), - handle: Arc::new(Mutex::new(Box::new(handle))), - process: Arc::new(Mutex::new(Box::new(process))), - client: None, - } - } - pub fn state (&self) -> std::sync::MutexGuard<'_, T> { - self.state.lock().unwrap() - } - pub fn activate (mut self, client: Client) -> Usually { - self.client = Some(client.activate_async(Notifications(Box::new({ - let state = self.state.clone(); - let handle = self.handle.clone(); - move|event|{ - let mut state = state.lock().unwrap(); - let mut handle = handle.lock().unwrap(); - handle(&mut state, &event).unwrap(); - } - }) as Box), ClosureProcessHandler::new(Box::new({ - let state = self.state.clone(); - let process = self.process.clone(); - move|client: &Client, scope: &ProcessScope|{ - let mut state = state.lock().unwrap(); - let mut process = process.lock().unwrap(); - (process)(&mut state, client, scope) - } - }) as BoxedProcessHandler))?); - Ok(self) - } -} diff --git a/src/model/looper.rs b/src/model/looper.rs index 9f4a60d6..0e2e1756 100644 --- a/src/model/looper.rs +++ b/src/model/looper.rs @@ -1,29 +1,9 @@ use crate::core::*; pub struct Looper { - name: String + pub name: String } - -impl Looper { - pub fn new (name: &str) -> Result, Box> { - Ok(DynamicDevice::new(render, handle, process, Self { - name: name.into(), - })) - } -} - -pub fn process (_: &mut Looper, _: &Client, _: &ProcessScope) -> Control { - Control::Continue -} - -pub fn render (_: &Looper, _: &mut Buffer, _: Rect) -> Usually { - Ok(Rect::default()) -} - -pub fn handle (_: &mut Looper, _: &AppEvent) -> Usually { - Ok(false) -} - -pub const ACTIONS: [(&'static str, &'static str);1] = [ - ("Ins/Del", "Add/remove loop"), -]; +render!(Looper); +handle!(Looper); +process!(Looper); +ports!(Looper); diff --git a/src/model/mixer.rs b/src/model/mixer.rs index 2a5571e1..aa306ec8 100644 --- a/src/model/mixer.rs +++ b/src/model/mixer.rs @@ -6,30 +6,28 @@ pub struct Mixer { pub selected_track: usize, pub selected_column: usize, } +render!(Mixer = crate::view::mixer::render); +handle!(Mixer = crate::control::mixer::handle); +process!(Mixer = process); impl Mixer { - pub fn new (name: &str) -> Result, Box> { + pub fn new (name: &str) -> Usually { let (client, _status) = Client::new(name, ClientOptions::NO_START_SERVER)?; - Ok(DynamicDevice::new( - crate::view::mixer::render, - crate::control::mixer::handle, - process, - Self { - name: name.into(), - selected_column: 0, - selected_track: 1, - tracks: vec![ - MixerTrack::new(&client, 1, "Mono 1")?, - MixerTrack::new(&client, 1, "Mono 2")?, - MixerTrack::new(&client, 2, "Stereo 1")?, - MixerTrack::new(&client, 2, "Stereo 2")?, - MixerTrack::new(&client, 2, "Stereo 3")?, - MixerTrack::new(&client, 2, "Bus 1")?, - MixerTrack::new(&client, 2, "Bus 2")?, - MixerTrack::new(&client, 2, "Mix")?, - ], - } - )) + Ok(Self { + name: name.into(), + selected_column: 0, + selected_track: 1, + tracks: vec![ + MixerTrack::new(&client, 1, "Mono 1")?, + MixerTrack::new(&client, 1, "Mono 2")?, + MixerTrack::new(&client, 2, "Stereo 1")?, + MixerTrack::new(&client, 2, "Stereo 2")?, + MixerTrack::new(&client, 2, "Stereo 3")?, + MixerTrack::new(&client, 2, "Bus 1")?, + MixerTrack::new(&client, 2, "Bus 2")?, + MixerTrack::new(&client, 2, "Mix")?, + ], + }) } } @@ -59,7 +57,7 @@ pub struct MixerTrack { } impl MixerTrack { - pub fn new (jack: &Client, channels: u8, name: &str) -> Result> { + pub fn new (jack: &Client, channels: u8, name: &str) -> Usually { let mut input_ports = vec![]; let mut insert_ports = vec![]; let mut return_ports = vec![];