|
|
|
@ -2,13 +2,20 @@ use dotenv::dotenv; |
|
|
|
use rosc::{encoder, OscMessage, OscPacket, OscType}; |
|
|
|
use rosc::{encoder, OscMessage, OscPacket, OscType}; |
|
|
|
use std::env; |
|
|
|
use std::env; |
|
|
|
use std::{net::SocketAddrV4, str::FromStr}; |
|
|
|
use std::{net::SocketAddrV4, str::FromStr}; |
|
|
|
use tauri::{AppHandle, Manager}; |
|
|
|
use tauri::{AppHandle, Manager, Emitter}; |
|
|
|
use tokio::net::UdpSocket; |
|
|
|
use tokio::net::UdpSocket; |
|
|
|
use webview2_com::Microsoft::Web::WebView2::Win32::{ |
|
|
|
use webview2_com::Microsoft::Web::WebView2::Win32::{ |
|
|
|
ICoreWebView2Profile4, ICoreWebView2_13, COREWEBVIEW2_PERMISSION_KIND_MICROPHONE, |
|
|
|
ICoreWebView2Profile4, ICoreWebView2_13, COREWEBVIEW2_PERMISSION_KIND_MICROPHONE, |
|
|
|
COREWEBVIEW2_PERMISSION_STATE_DEFAULT, |
|
|
|
COREWEBVIEW2_PERMISSION_STATE_DEFAULT, |
|
|
|
}; |
|
|
|
}; |
|
|
|
use windows::core::{Interface, PCWSTR}; |
|
|
|
use windows::core::{Interface, PCWSTR}; |
|
|
|
|
|
|
|
use serde::Serialize; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#[derive(Serialize, Clone)] |
|
|
|
|
|
|
|
struct OscEvent { |
|
|
|
|
|
|
|
addr: String, |
|
|
|
|
|
|
|
args: Vec<String>, |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#[tauri::command] |
|
|
|
#[tauri::command] |
|
|
|
fn get_env(name: &str) -> String { |
|
|
|
fn get_env(name: &str) -> String { |
|
|
|
@ -97,10 +104,58 @@ pub fn run() { |
|
|
|
.build(), |
|
|
|
.build(), |
|
|
|
)?; |
|
|
|
)?; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tauri::async_runtime::spawn(setup_osc_server(app.handle().clone())); |
|
|
|
Ok(()) |
|
|
|
Ok(()) |
|
|
|
}) |
|
|
|
}) |
|
|
|
.run(tauri::generate_context!()) |
|
|
|
.run(tauri::generate_context!()) |
|
|
|
.expect("error while running tauri application"); |
|
|
|
.expect("error while running tauri application"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async fn setup_osc_server(app_handle: AppHandle) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
println!("Setting up OSC server..."); |
|
|
|
|
|
|
|
// setup osc sever
|
|
|
|
|
|
|
|
let addr = "0.0.0.0:8000"; |
|
|
|
|
|
|
|
let sock = UdpSocket::bind(addr).await.unwrap(); |
|
|
|
|
|
|
|
println!("Listening to {}", addr); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let mut buf = [0u8; rosc::decoder::MTU]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
loop { |
|
|
|
|
|
|
|
match sock.recv_from(&mut buf).await { |
|
|
|
|
|
|
|
Ok((size, addr)) => { |
|
|
|
|
|
|
|
println!("Received packet with size {} from: {}", size, addr); |
|
|
|
|
|
|
|
if let Ok((_, packet)) = rosc::decoder::decode_udp(&buf[..size]) { |
|
|
|
|
|
|
|
if let OscPacket::Message(msg) = packet { |
|
|
|
|
|
|
|
println!("OSC message: {:?}", msg); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app_handle.emit( |
|
|
|
|
|
|
|
"osc_message", |
|
|
|
|
|
|
|
OscEvent { |
|
|
|
|
|
|
|
addr: msg.addr.clone(), |
|
|
|
|
|
|
|
args: msg.args.iter().map(|arg| match arg { |
|
|
|
|
|
|
|
OscType::Int(i) => i.to_string(), |
|
|
|
|
|
|
|
OscType::Float(f) => f.to_string(), |
|
|
|
|
|
|
|
OscType::String(s) => s.clone(), |
|
|
|
|
|
|
|
OscType::Bool(b) => b.to_string(), |
|
|
|
|
|
|
|
_ => format!("{:?}", arg), |
|
|
|
|
|
|
|
}).collect(), |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
).unwrap(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
println!("Failed to decode OSC packet"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
Err(e) => { |
|
|
|
|
|
|
|
println!("Error receiving from socket: {}", e); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static mut LIGHT: Option<enttecopendmx::EnttecOpenDMX> = None; |
|
|
|
static mut LIGHT: Option<enttecopendmx::EnttecOpenDMX> = None; |
|
|
|
|