record-player 0.2.0

Shared Bitneedle transport, record physics, and acoustic scratch engine
Documentation
use crate::{DeckId, SurfaceRegion};
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum HostCommand {
    SetMotor {
        deck: DeckId,
        running: bool,
    },
    SetPacketGain {
        deck: DeckId,
        gain: f32,
        ramp_ms: u32,
    },
    StartPacketPlayback {
        deck: DeckId,
        offset_seconds: f64,
        rate: f32,
        platter_handoff: bool,
    },
    StopPacketPlayback {
        deck: DeckId,
        platter_handoff: bool,
    },
    SeekPacketPlayback {
        deck: DeckId,
        offset_seconds: f64,
    },
    SetScratchTransport {
        deck: DeckId,
        hand_contact: bool,
        motor_rate: f32,
        grip: f32,
        output_frame: u64,
    },
    SetScratchTarget {
        deck: DeckId,
        position_frames: f64,
        rate: f32,
        impulse: f32,
        output_frame: u64,
    },
    SetScratchPosition {
        deck: DeckId,
        position_frames: f64,
        impulse: f32,
    },
    StartSurfaceRegion {
        region: SurfaceRegion,
        duration_seconds: f64,
    },
    StopSurfaceRegion {
        region: SurfaceRegion,
    },
    StopClipLoop,
    SetMixerTrackGain {
        track: u8,
        gain: f32,
        ramp_ms: u32,
    },
    CaptureScratchStart {
        deck: DeckId,
        start_seconds: f64,
        rotation_degrees: f64,
        output_frame: u64,
    },
    CaptureScratchFinish {
        deck: DeckId,
        end_seconds: f64,
        rotation_degrees: f64,
        save_sample: bool,
        output_frame: u64,
    },
    PublishTransportIntent,
    RefreshView,
}