use std::io;
use std::net::UdpSocket;
use std::sync::Arc;
use std::sync::atomic::{AtomicBool, Ordering};
use std::time::Duration;
use crate::storage::asset::project::Project;
use crate::storage::asset::scene::grid::GridLocation;
mod feedback;
mod parse;
#[cfg(any(test, feature = "test-util"))]
pub(crate) mod samples;
pub(crate) use crate::storage::asset::project::io::OscConfig;
pub(crate) struct OSCHandler {
pub(super) socket: UdpSocket,
pub(super) running: AtomicBool,
}
#[derive(Debug, Clone)]
pub(crate) struct OscStateSnapshot {
pub(crate) project: Option<Arc<Project>>,
pub(crate) selected_scene_instance: GridLocation,
pub(crate) blackout: bool,
pub(crate) beats_per_minute: f32,
pub(crate) beat_progression: f32,
}
impl OSCHandler {
pub(crate) fn start(port: u16) -> io::Result<Arc<Self>> {
let socket = UdpSocket::bind(("0.0.0.0", port))?;
socket.set_read_timeout(Some(Duration::from_millis(10)))?;
let ret = Arc::new(Self {
socket,
running: AtomicBool::new(true),
});
feedback::start_network_loop(ret.clone());
Ok(ret)
}
pub(crate) fn stop(&self) {
self.running.store(false, Ordering::Relaxed);
}
}