styx 0.1.0

Sync-first, zero-copy capture→decode→process→encode media stack.
Documentation
use std::thread;
use std::time::Duration;

use styx_capture::CaptureSource;
use styx_capture::virtual_backend::VirtualCapture;
use styx_core::prelude::*;

use crate::BackendKind;
use crate::capture_api::handle::{ControlPlane, WorkerHandle};
use crate::capture_api::{CaptureDescriptor, CaptureError, CaptureHandle};
use crate::metrics::StageMetrics;
use crate::prelude::{Interval, Mode};

pub(super) fn start_virtual(
    mode: Mode,
    interval: Option<Interval>,
    descriptor: CaptureDescriptor,
) -> Result<CaptureHandle, CaptureError> {
    let (pool_min, pool_bytes, pool_spare) = crate::capture_api::capture_pool_limits(4, 1 << 20, 8);
    let pool = BufferPool::with_limits(pool_min, pool_bytes, pool_spare);
    let capture = VirtualCapture::new(mode.clone(), pool, 3);
    let queue_depth = crate::capture_api::capture_queue_depth();
    let (tx, rx) = bounded(queue_depth);
    let worker = thread::spawn(move || {
        loop {
            if let Some(frame) = capture.next_frame() {
                if matches!(tx.send(frame), SendOutcome::Closed) {
                    break;
                }
            } else {
                thread::sleep(Duration::from_millis(10));
            }
        }
    });
    Ok(CaptureHandle {
        backend: BackendKind::Virtual,
        control: ControlPlane::Virtual,
        descriptor,
        mode,
        interval,
        rx,
        stop_tx: None,
        worker: Some(WorkerHandle::Thread(worker)),
        metrics: StageMetrics::default(),
    })
}