mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-08 04:36:45 +01:00
chore: tidy
This commit is contained in:
parent
1b7892d11f
commit
f48f17e9a4
8 changed files with 66 additions and 73 deletions
134
src/device.rs
134
src/device.rs
|
|
@ -4,8 +4,6 @@ mod chain;
|
||||||
mod launcher;
|
mod launcher;
|
||||||
mod looper;
|
mod looper;
|
||||||
mod mixer;
|
mod mixer;
|
||||||
mod plugin;
|
|
||||||
mod sampler;
|
|
||||||
mod sequencer;
|
mod sequencer;
|
||||||
mod track;
|
mod track;
|
||||||
mod transport;
|
mod transport;
|
||||||
|
|
@ -13,26 +11,31 @@ mod transport;
|
||||||
pub use self::track::Track;
|
pub use self::track::Track;
|
||||||
pub use self::launcher::{Launcher, Scene};
|
pub use self::launcher::{Launcher, Scene};
|
||||||
pub use self::sequencer::{Sequencer, Phrase};
|
pub use self::sequencer::{Sequencer, Phrase};
|
||||||
pub use self::chain::Chain;
|
pub use self::chain::{Chain, Sampler, Plugin};
|
||||||
pub use self::plugin::Plugin;
|
|
||||||
|
|
||||||
pub use self::looper::Looper;
|
pub use self::looper::Looper;
|
||||||
pub use self::mixer::Mixer;
|
pub use self::mixer::Mixer;
|
||||||
pub use self::sampler::Sampler;
|
|
||||||
pub use self::transport::Transport;
|
pub use self::transport::Transport;
|
||||||
|
|
||||||
use crossterm::event;
|
use crossterm::event;
|
||||||
use ::jack::{Port, PortSpec, Client};
|
use ::jack::{Port, PortSpec, Client};
|
||||||
|
|
||||||
|
/// A UI component that may have presence on the JACK grap.
|
||||||
pub trait Device: Render + Handle + PortList + Send + Sync {
|
pub trait Device: Render + Handle + PortList + Send + Sync {
|
||||||
fn boxed (self) -> Box<dyn Device> where Self: Sized + 'static {
|
fn boxed (self) -> Box<dyn Device> where Self: Sized + 'static {
|
||||||
Box::new(self)
|
Box::new(self)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// All things that implement the required traits can be treated as `Device`.
|
||||||
|
impl<T: Render + Handle + PortList + Send + Sync> Device for T {}
|
||||||
|
|
||||||
|
/// Run a device as the root of the app.
|
||||||
pub fn run (device: impl Device + Send + Sync + 'static) -> Result<(), Box<dyn Error>> {
|
pub fn run (device: impl Device + Send + Sync + 'static) -> Result<(), Box<dyn Error>> {
|
||||||
let device = Arc::new(Mutex::new(device));
|
let device = Arc::new(Mutex::new(device));
|
||||||
let exited = Arc::new(AtomicBool::new(false));
|
let exited = Arc::new(AtomicBool::new(false));
|
||||||
|
|
||||||
|
// Spawn input (handle) thread
|
||||||
let _input_thread = {
|
let _input_thread = {
|
||||||
let poll = std::time::Duration::from_millis(100);
|
let poll = std::time::Duration::from_millis(100);
|
||||||
let exited = exited.clone();
|
let exited = exited.clone();
|
||||||
|
|
@ -60,25 +63,23 @@ pub fn run (device: impl Device + Send + Sync + 'static) -> Result<(), Box<dyn E
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Set up terminal
|
||||||
stdout().execute(EnterAlternateScreen)?;
|
stdout().execute(EnterAlternateScreen)?;
|
||||||
enable_raw_mode()?;
|
enable_raw_mode()?;
|
||||||
let mut terminal = ratatui::Terminal::new(CrosstermBackend::new(stdout()))?;
|
let mut terminal = ratatui::Terminal::new(CrosstermBackend::new(stdout()))?;
|
||||||
//better_panic::install();
|
|
||||||
|
// Set up panic hook
|
||||||
let better_panic_handler = better_panic::Settings::auto()
|
let better_panic_handler = better_panic::Settings::auto()
|
||||||
.verbosity(better_panic::Verbosity::Full)
|
.verbosity(better_panic::Verbosity::Full)
|
||||||
.create_panic_handler();
|
.create_panic_handler();
|
||||||
std::panic::set_hook(Box::new(move |info: &std::panic::PanicInfo|{
|
std::panic::set_hook(Box::new(move |info: &std::panic::PanicInfo|{
|
||||||
stdout()
|
stdout().execute(LeaveAlternateScreen).unwrap();
|
||||||
.execute(crossterm::terminal::LeaveAlternateScreen)
|
crossterm::terminal::disable_raw_mode().unwrap();
|
||||||
.unwrap();
|
|
||||||
crossterm::terminal::disable_raw_mode()
|
|
||||||
.unwrap();
|
|
||||||
better_panic_handler(info);
|
better_panic_handler(info);
|
||||||
//writeln!(std::io::stderr(), "{}", info)
|
|
||||||
//.unwrap();
|
|
||||||
//writeln!(std::io::stderr(), "{:?}", ::backtrace::Backtrace::new())
|
|
||||||
//.unwrap();
|
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
// Main (render) loop
|
||||||
let sleep = std::time::Duration::from_millis(16);
|
let sleep = std::time::Duration::from_millis(16);
|
||||||
loop {
|
loop {
|
||||||
terminal.draw(|frame|{
|
terminal.draw(|frame|{
|
||||||
|
|
@ -91,28 +92,41 @@ pub fn run (device: impl Device + Send + Sync + 'static) -> Result<(), Box<dyn E
|
||||||
}
|
}
|
||||||
std::thread::sleep(sleep);
|
std::thread::sleep(sleep);
|
||||||
};
|
};
|
||||||
//render_thread.join().expect("Failed to join render thread");
|
|
||||||
stdout()
|
// Cleanup
|
||||||
.queue(crossterm::terminal::LeaveAlternateScreen)?
|
stdout().execute(LeaveAlternateScreen)?;
|
||||||
.flush()?;
|
|
||||||
crossterm::terminal::disable_raw_mode()?;
|
crossterm::terminal::disable_raw_mode()?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Render + Handle + PortList + Send + Sync> Device for T {}
|
/// Trait for things that handle input events.
|
||||||
|
|
||||||
pub trait Named {
|
|
||||||
}
|
|
||||||
|
|
||||||
pub trait Handle {
|
pub trait Handle {
|
||||||
// Handle an input event.
|
/// Handle an input event.
|
||||||
// Returns Ok(true) if the device handled the event.
|
/// Returns Ok(true) if the device handled the event.
|
||||||
// This is the mechanism which allows nesting of components;.
|
/// This is the mechanism which allows nesting of components;.
|
||||||
fn handle (&mut self, _e: &AppEvent) -> Usually<bool> {
|
fn handle (&mut self, _e: &AppEvent) -> Usually<bool> {
|
||||||
Ok(false)
|
Ok(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum AppEvent {
|
||||||
|
/// Terminal input
|
||||||
|
Input(::crossterm::event::Event),
|
||||||
|
/// Update values but not the whole form.
|
||||||
|
Update,
|
||||||
|
/// Update the whole form.
|
||||||
|
Redraw,
|
||||||
|
/// Device gains focus
|
||||||
|
Focus,
|
||||||
|
/// Device loses focus
|
||||||
|
Blur,
|
||||||
|
/// JACK notification
|
||||||
|
Jack(JackEvent)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Trait for things that render to the display.
|
||||||
pub trait Render {
|
pub trait Render {
|
||||||
// Render something to an area of the buffer.
|
// Render something to an area of the buffer.
|
||||||
// Returns area used by component.
|
// Returns area used by component.
|
||||||
|
|
@ -122,6 +136,24 @@ pub trait Render {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Render for Box<dyn Device> {
|
||||||
|
fn render (&self, b: &mut Buffer, a: Rect) -> Usually<Rect> {
|
||||||
|
(**self).render(b, a)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl WidgetRef for &dyn Render {
|
||||||
|
fn render_ref (&self, area: Rect, buf: &mut Buffer) {
|
||||||
|
Render::render(*self, buf, area).expect("Failed to render device.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl WidgetRef for dyn Render {
|
||||||
|
fn render_ref (&self, area: Rect, buf: &mut Buffer) {
|
||||||
|
Render::render(self, buf, area).expect("Failed to render device.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub trait Blit {
|
pub trait Blit {
|
||||||
// Render something to X, Y coordinates in a buffer, ignoring width/height.
|
// Render something to X, Y coordinates in a buffer, ignoring width/height.
|
||||||
fn blit (&self, buf: &mut Buffer, x: u16, y: u16, style: Option<Style>);
|
fn blit (&self, buf: &mut Buffer, x: u16, y: u16, style: Option<Style>);
|
||||||
|
|
@ -135,6 +167,7 @@ impl<T: AsRef<str>> Blit for T {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Trait for things that may expose JACK ports.
|
||||||
pub trait PortList {
|
pub trait PortList {
|
||||||
fn audio_ins (&self) -> Usually<Vec<String>> {
|
fn audio_ins (&self) -> Usually<Vec<String>> {
|
||||||
Ok(vec![])
|
Ok(vec![])
|
||||||
|
|
@ -163,12 +196,6 @@ pub trait PortList {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Render for Box<dyn Device> {
|
|
||||||
fn render (&self, b: &mut Buffer, a: Rect) -> Usually<Rect> {
|
|
||||||
(**self).render(b, a)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct DevicePort<T: PortSpec> {
|
pub struct DevicePort<T: PortSpec> {
|
||||||
pub name: String,
|
pub name: String,
|
||||||
pub port: Port<T>,
|
pub port: Port<T>,
|
||||||
|
|
@ -189,18 +216,7 @@ impl<T: PortSpec + Default> DevicePort<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl WidgetRef for &dyn Render {
|
/// A device dynamicammy composed of state and handlers.
|
||||||
fn render_ref (&self, area: Rect, buf: &mut Buffer) {
|
|
||||||
Render::render(*self, buf, area).expect("Failed to render device.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl WidgetRef for dyn Render {
|
|
||||||
fn render_ref (&self, area: Rect, buf: &mut Buffer) {
|
|
||||||
Render::render(self, buf, area).expect("Failed to render device.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct DynamicDevice<T> {
|
pub struct DynamicDevice<T> {
|
||||||
pub state: Arc<Mutex<T>>,
|
pub state: Arc<Mutex<T>>,
|
||||||
pub render: Mutex<Box<dyn FnMut(&T, &mut Buffer, Rect)->Usually<Rect> + Send>>,
|
pub render: Mutex<Box<dyn FnMut(&T, &mut Buffer, Rect)->Usually<Rect> + Send>>,
|
||||||
|
|
@ -279,34 +295,6 @@ impl<T: Send + Sync + 'static> DynamicDevice<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub enum AppEvent {
|
|
||||||
/// Terminal input
|
|
||||||
Input(::crossterm::event::Event),
|
|
||||||
/// Update values but not the whole form.
|
|
||||||
Update,
|
|
||||||
/// Update the whole form.
|
|
||||||
Redraw,
|
|
||||||
/// Device gains focus
|
|
||||||
Focus,
|
|
||||||
/// Device loses focus
|
|
||||||
Blur,
|
|
||||||
/// JACK notification
|
|
||||||
Jack(JackEvent)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn panic_hook (info: &std::panic::PanicInfo) {
|
|
||||||
stdout()
|
|
||||||
.execute(crossterm::terminal::LeaveAlternateScreen)
|
|
||||||
.unwrap();
|
|
||||||
crossterm::terminal::disable_raw_mode()
|
|
||||||
.unwrap();
|
|
||||||
writeln!(std::io::stderr(), "{}", info)
|
|
||||||
.unwrap();
|
|
||||||
writeln!(std::io::stderr(), "{:?}", ::backtrace::Backtrace::new())
|
|
||||||
.unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum JackEvent {
|
pub enum JackEvent {
|
||||||
ThreadInit,
|
ThreadInit,
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,8 @@
|
||||||
|
mod plugin;
|
||||||
|
pub use self::plugin::*;
|
||||||
|
mod sampler;
|
||||||
|
pub use self::sampler::*;
|
||||||
|
|
||||||
use crate::prelude::*;
|
use crate::prelude::*;
|
||||||
|
|
||||||
pub struct Chain {
|
pub struct Chain {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue