add sleep timer + improve message iterating

This commit is contained in:
Jade Rowland 2023-09-02 20:59:00 -04:00
parent defcacb59b
commit 192adccb10

View File

@ -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);
}
} }
}); });
} }