mirror of
https://github.com/eliasstepanik/strudel-docker.git
synced 2026-01-24 20:18:34 +00:00
add sleep timer + improve message iterating
This commit is contained in:
parent
defcacb59b
commit
192adccb10
@ -1,11 +1,11 @@
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
use std::time::Duration;
|
||||||
use midir::MidiOutput;
|
use midir::MidiOutput;
|
||||||
use tokio::sync::mpsc;
|
use tokio::sync::{ mpsc, Mutex };
|
||||||
use tokio::sync::Mutex;
|
|
||||||
use tokio::time::Instant;
|
use tokio::time::Instant;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
|
use std::thread::sleep;
|
||||||
pub struct MidiMessage {
|
pub struct MidiMessage {
|
||||||
pub message: Vec<u8>,
|
pub message: Vec<u8>,
|
||||||
pub instant: Instant,
|
pub instant: Instant,
|
||||||
@ -24,7 +24,6 @@ pub fn init(
|
|||||||
) {
|
) {
|
||||||
tauri::async_runtime::spawn(async move { async_process_model(async_input_receiver, async_output_transmitter).await });
|
tauri::async_runtime::spawn(async move { async_process_model(async_input_receiver, async_output_transmitter).await });
|
||||||
let message_queue: Arc<Mutex<Vec<MidiMessage>>> = Arc::new(Mutex::new(Vec::new()));
|
let message_queue: Arc<Mutex<Vec<MidiMessage>>> = Arc::new(Mutex::new(Vec::new()));
|
||||||
|
|
||||||
/* ...........................................................
|
/* ...........................................................
|
||||||
Listen For incoming messages and add to queue
|
Listen For incoming messages and add to queue
|
||||||
............................................................*/
|
............................................................*/
|
||||||
@ -72,19 +71,14 @@ pub fn init(
|
|||||||
/* ...........................................................
|
/* ...........................................................
|
||||||
Process queued messages
|
Process queued messages
|
||||||
............................................................*/
|
............................................................*/
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let mut message_queue = message_queue_clone.lock().await;
|
let mut message_queue = message_queue_clone.lock().await;
|
||||||
|
|
||||||
for i in 0..=message_queue.len().saturating_sub(1) {
|
//iterate over each message, play and remove messages when they are ready
|
||||||
let m = message_queue.get(i);
|
message_queue.retain(|message| {
|
||||||
if m.is_none() {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
let message = m.unwrap();
|
|
||||||
|
|
||||||
// dont play the message if its offset time has not elapsed
|
|
||||||
if message.instant.elapsed().as_millis() < message.offset.into() {
|
if message.instant.elapsed().as_millis() < message.offset.into() {
|
||||||
continue;
|
return true;
|
||||||
}
|
}
|
||||||
let mut out_con = output_connections.get_mut(&message.requestedport);
|
let mut out_con = output_connections.get_mut(&message.requestedport);
|
||||||
|
|
||||||
@ -107,10 +101,10 @@ pub fn init(
|
|||||||
} else {
|
} else {
|
||||||
println!("failed to find midi device: {}", message.requestedport);
|
println!("failed to find midi device: {}", message.requestedport);
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
// the message has been processed, so remove it from the queue
|
sleep(Duration::from_millis(1));
|
||||||
message_queue.remove(i);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user