mirror of
https://codeberg.org/uzu/strudel
synced 2026-08-01 21:37:42 -04:00
play working kinda
This commit is contained in:
@@ -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<mpsc::Sender<LinkMsg>>,
|
||||
pub ablelink_state: Mutex<AbleLinkState>,
|
||||
}
|
||||
// #[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<LinkMsg>,
|
||||
mut async_output_receiver: mpsc::Receiver<LinkMsg>,
|
||||
async_output_transmitter: mpsc::Sender<LinkMsg>
|
||||
) {
|
||||
println!("init");
|
||||
tauri::async_runtime::spawn(async move { async_process_model(async_input_receiver, async_output_transmitter).await });
|
||||
|
||||
let message_queue: Arc<Mutex<Vec<LinkMsg>>> = Arc::new(Mutex::new(Vec::new()));
|
||||
//let s = app.state::<State2>().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::<State2>().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::<State2>().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())
|
||||
|
||||
+2
-10
@@ -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::<Mutex<oscbridge::AsyncInputTransmit>>();
|
||||
// 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
|
||||
|
||||
Reference in New Issue
Block a user