From db36636ab23e8ca2932217a974622268b12fbfb3 Mon Sep 17 00:00:00 2001 From: Jade Rowland Date: Thu, 21 Sep 2023 23:08:30 -0400 Subject: [PATCH] play working kinda --- src-tauri/src/ablelinkbridge.rs | 121 ++++++++++++++------------------ src-tauri/src/main.rs | 12 +--- 2 files changed, 53 insertions(+), 80 deletions(-) diff --git a/src-tauri/src/ablelinkbridge.rs b/src-tauri/src/ablelinkbridge.rs index daa75ff8b..5728cc914 100644 --- a/src-tauri/src/ablelinkbridge.rs +++ b/src-tauri/src/ablelinkbridge.rs @@ -7,7 +7,7 @@ use std::thread::sleep; use crate::loggerbridge::Logger; -use tauri::{ Window, App, Manager }; +use tauri::Window; #[derive(Deserialize, Clone, serde::Serialize)] pub struct LinkMsg { @@ -26,19 +26,17 @@ impl AbeLinkToJs { } } -pub struct State2 { +pub struct AsyncInputTransmit { pub inner: Mutex>, - pub ablelink_state: Mutex, } -// #[derive(Sync)] -pub struct AbleLinkState { +pub struct State { pub link: AblLink, pub session_state: SessionState, pub running: bool, pub quantum: f64, } -impl AbleLinkState { +impl State { pub fn new() -> Self { Self { link: AblLink::new(120.0), @@ -57,27 +55,15 @@ impl AbleLinkState { } } -pub async fn init( - abelink_to_js: AbeLinkToJs, +pub fn init( _logger: Logger, + abelink_to_js: AbeLinkToJs, async_input_receiver: mpsc::Receiver, mut async_output_receiver: mpsc::Receiver, async_output_transmitter: mpsc::Sender ) { - println!("init"); tauri::async_runtime::spawn(async move { async_process_model(async_input_receiver, async_output_transmitter).await }); - let message_queue: Arc>> = Arc::new(Mutex::new(Vec::new())); - //let s = app.state::().ablelink_state.lock().await; - // tauri::async_runtime::spawn(async move { - // abelink_to_js.send(LinkMsg { play: true, bpm: 100.0 }); - - // //let mut s = a.state::().ablelink_state.lock().await; - // // s.capture_app_state(); - // }); - - // let state = unlocked_state.ablelink_state.try_lock().unwrap(); - /* ........................................................... Listen For incoming messages and add to queue ............................................................*/ @@ -92,62 +78,57 @@ pub async fn init( }); let message_queue_clone = Arc::clone(&message_queue); - // tauri::async_runtime::spawn(async move { - // let a = app.lock().await; - // let mut state = a.state::().ablelink_state.lock().await; + tauri::async_runtime::spawn(async move { + /* ........................................................... + Initialize Ableton link + ............................................................*/ + let mut state = State::new(); + state.link.enable(true); + state.link.enable_start_stop_sync(true); - // /* ........................................................... - // Initialize Ableton link - // ............................................................*/ - // //let mut state = State::new(); - // state.link.enable(true); - // state.link.enable_start_stop_sync(true); + let mut prev_is_playing = state.session_state.is_playing(); + let mut prev_bpm = state.session_state.tempo(); - // let mut prev_is_playing = state.session_state.is_playing(); - // let mut prev_bpm = state.session_state.tempo(); + /* ........................................................... + Process queued messages + ............................................................*/ - // /* ........................................................... - // Process queued messages - // ............................................................*/ + loop { + let mut message_queue = message_queue_clone.lock().await; - // loop { - // let mut message_queue = message_queue_clone.lock().await; + state.capture_app_state(); + let time_stamp = state.link.clock_micros(); + let bpm = state.session_state.tempo(); + let play = state.session_state.is_playing(); - // state.capture_app_state(); - // let time_stamp = state.link.clock_micros(); - // let bpm = state.session_state.tempo(); - // let play = state.session_state.is_playing(); - // let quantum = state.quantum; - // println!("quant: {}", quantum); + if bpm != prev_bpm || play != prev_is_playing { + //let cycle = state.session_state.time_at_beat(beat, quantum) + let payload = LinkMsg { + bpm, + play, + }; + abelink_to_js.send(payload); + prev_is_playing = play; + prev_bpm = bpm; + } - // if bpm != prev_bpm || play != prev_is_playing { - // //let cycle = state.session_state.time_at_beat(beat, quantum) - // let payload = LinkMsg { - // bpm, - // play, - // }; - // abelink_to_js.send(payload); - // prev_is_playing = play; - // prev_bpm = bpm; - // } + message_queue.retain(|message| { + let is_playing = message.play; + println!("is playing {}", is_playing); + if is_playing != prev_is_playing { + if is_playing == false { + state.session_state.set_is_playing(false, time_stamp as u64); + } else { + state.session_state.set_is_playing_and_request_beat_at_time(true, time_stamp as u64, 0.0, state.quantum); + } + state.commit_app_state(); + } + return false; + }); - // message_queue.retain(|message| { - // let is_playing = message.play; - // println!("is playing {}", is_playing); - // if is_playing != prev_is_playing { - // if is_playing == false { - // state.session_state.set_is_playing(false, time_stamp as u64); - // } else { - // state.session_state.set_is_playing_and_request_beat_at_time(true, time_stamp as u64, 0.0, quantum); - // } - // state.commit_app_state(); - // } - // return false; - // }); - - // sleep(Duration::from_millis(10)); - // } - // }); + sleep(Duration::from_millis(10)); + } + }); } pub async fn async_process_model( @@ -163,7 +144,7 @@ pub async fn async_process_model( // Called from JS #[tauri::command] -pub async fn sendabelinkmsg(linkmsg: LinkMsg, state: tauri::State<'_, State2>) -> Result<(), String> { +pub async fn sendabelinkmsg(linkmsg: LinkMsg, state: tauri::State<'_, AsyncInputTransmit>) -> Result<(), String> { println!("bpm {} play {}", linkmsg.bpm, linkmsg.play); let async_proc_input_tx = state.inner.lock().await; async_proc_input_tx.send(linkmsg).await.map_err(|e| e.to_string()) diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index c866fbdc6..ca1db1ef1 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -8,7 +8,6 @@ mod ablelinkbridge; use std::sync::Arc; use ablelinkbridge::AbeLinkToJs; -use ablelinkbridge::State2; use loggerbridge::Logger; use tauri::Manager; use tokio::sync::mpsc; @@ -34,20 +33,13 @@ fn main() { .manage(oscbridge::AsyncInputTransmit { inner: Mutex::new(async_input_transmitter_osc), }) - .manage(ablelinkbridge::State2 { + .manage(ablelinkbridge::AsyncInputTransmit { inner: Mutex::new(async_input_transmitter_abelink), - ablelink_state: Mutex::new(ablelinkbridge::AbleLinkState::new()), }) .invoke_handler(tauri::generate_handler![midibridge::sendmidi, oscbridge::sendosc, ablelinkbridge::sendabelinkmsg]) .setup(|app| { - // let mut able_link_state = Arc::new( - // Mutex::new(ablelinkbridge::State::new(Mutex::new(async_input_transmitter_abelink))) - // ); - // app.manage(able_link_state.clone()); let window = Arc::new(app.get_window("main").unwrap()); let logger = Logger { window: window.clone() }; - // let state_mutex = app.state::>(); - // state_mutex.lock(); midibridge::init( logger.clone(), @@ -63,8 +55,8 @@ fn main() { ); ablelinkbridge::init( - AbeLinkToJs { window }, logger.clone(), + AbeLinkToJs { window }, async_input_receiver_abelink, async_output_receiver_abelink, async_output_transmitter_abelink