From d7fe491c840f8d908ab5dc7c9a780576768a9eac Mon Sep 17 00:00:00 2001 From: Jade Rowland Date: Fri, 22 Sep 2023 14:27:03 -0400 Subject: [PATCH] play stop working --- src-tauri/src/ablelinkbridge.rs | 31 ++++++++++++++++++++----------- src-tauri/src/main.rs | 11 ++++++++--- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src-tauri/src/ablelinkbridge.rs b/src-tauri/src/ablelinkbridge.rs index 5728cc914..e035709cf 100644 --- a/src-tauri/src/ablelinkbridge.rs +++ b/src-tauri/src/ablelinkbridge.rs @@ -28,15 +28,16 @@ impl AbeLinkToJs { pub struct AsyncInputTransmit { pub inner: Mutex>, + pub abelink: Arc>, } -pub struct State { +pub struct AbeLinkState { pub link: AblLink, pub session_state: SessionState, pub running: bool, pub quantum: f64, } -impl State { +impl AbeLinkState { pub fn new() -> Self { Self { link: AblLink::new(120.0), @@ -58,6 +59,7 @@ impl State { pub fn init( _logger: Logger, abelink_to_js: AbeLinkToJs, + abelink: Arc>, async_input_receiver: mpsc::Receiver, mut async_output_receiver: mpsc::Receiver, async_output_transmitter: mpsc::Sender @@ -82,24 +84,28 @@ pub fn init( /* ........................................................... Initialize Ableton link ............................................................*/ - let mut state = State::new(); - state.link.enable(true); - state.link.enable_start_stop_sync(true); + //let mut state = AbeLinkState::new(); - let mut prev_is_playing = state.session_state.is_playing(); - let mut prev_bpm = state.session_state.tempo(); + let mut prev_is_playing = false; + let mut prev_bpm = 120.0; /* ........................................................... Process queued messages ............................................................*/ loop { - let mut message_queue = message_queue_clone.lock().await; + let mut state = abelink.lock().await; + if state.link.is_enabled() == false { + state.link.enable(true); + state.link.enable_start_stop_sync(true); + } - state.capture_app_state(); + let mut message_queue = message_queue_clone.lock().await; let time_stamp = state.link.clock_micros(); let bpm = state.session_state.tempo(); let play = state.session_state.is_playing(); + let quantum = state.quantum; + state.capture_app_state(); if bpm != prev_bpm || play != prev_is_playing { //let cycle = state.session_state.time_at_beat(beat, quantum) @@ -119,13 +125,13 @@ pub fn init( 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.session_state.set_is_playing_and_request_beat_at_time(true, time_stamp as u64, 0.0, quantum); } state.commit_app_state(); } return false; }); - + drop(state); sleep(Duration::from_millis(10)); } }); @@ -147,5 +153,8 @@ pub async fn async_process_model( 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; + // let abelink = state.abelink.lock().await; + // drop(abelink); + 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 ca1db1ef1..aa3e7a12f 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -7,6 +7,7 @@ mod loggerbridge; mod ablelinkbridge; use std::sync::Arc; +use ablelinkbridge::AbeLinkState; use ablelinkbridge::AbeLinkToJs; use loggerbridge::Logger; use tauri::Manager; @@ -33,14 +34,17 @@ fn main() { .manage(oscbridge::AsyncInputTransmit { inner: Mutex::new(async_input_transmitter_osc), }) - .manage(ablelinkbridge::AsyncInputTransmit { - inner: Mutex::new(async_input_transmitter_abelink), - }) .invoke_handler(tauri::generate_handler![midibridge::sendmidi, oscbridge::sendosc, ablelinkbridge::sendabelinkmsg]) .setup(|app| { let window = Arc::new(app.get_window("main").unwrap()); let logger = Logger { window: window.clone() }; + let abelink = Arc::new(Mutex::new(AbeLinkState::new())); + app.manage(ablelinkbridge::AsyncInputTransmit { + inner: Mutex::new(async_input_transmitter_abelink), + abelink: abelink.clone(), + }); + midibridge::init( logger.clone(), async_input_receiver_midi, @@ -57,6 +61,7 @@ fn main() { ablelinkbridge::init( logger.clone(), AbeLinkToJs { window }, + abelink, async_input_receiver_abelink, async_output_receiver_abelink, async_output_transmitter_abelink