gled-core 2.32.1

The engine of gled without a user interface: inputs, timing, rendering, Art-Net/DMX output and storage
Documentation
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);
    }
}