pocketstation 1.0.0

Source-aware desktop audio Session SDK
use core::mem::size_of;

pub const PKS_SESSION_ABI_MAJOR: u16 = 1;
pub const PKS_SESSION_ABI_MINOR: u16 = 1;

#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct PksSessionAbiVersion {
    pub struct_size_bytes: u32,
    pub abi_major: u16,
    pub abi_minor: u16,
}

impl PksSessionAbiVersion {
    pub const fn current() -> Self {
        Self {
            struct_size_bytes: size_of::<Self>() as u32,
            abi_major: PKS_SESSION_ABI_MAJOR,
            abi_minor: PKS_SESSION_ABI_MINOR,
        }
    }
}

#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct PksSessionHandle {
    pub kind: PksSessionHandleKind,
    pub slot_index: u32,
    pub generation: u64,
    pub scope_id: u64,
}

impl PksSessionHandle {
    #[cfg(test)]
    pub const fn invalid() -> Self {
        Self {
            kind: PksSessionHandleKind::Invalid,
            slot_index: u32::MAX,
            generation: 0,
            scope_id: 0,
        }
    }
}

#[repr(u32)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum PksSessionHandleKind {
    Invalid = 0,
    Engine = 1,
    Session = 2,
    AudioBatch = 3,
}

#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct PksSessionStatus {
    pub code: u32,
    pub detail: u32,
}

impl PksSessionStatus {
    pub const fn ok() -> Self {
        Self {
            code: PksSessionStatusCode::Ok as u32,
            detail: 0,
        }
    }

    pub const fn new(code: PksSessionStatusCode, detail: u32) -> Self {
        Self {
            code: code as u32,
            detail,
        }
    }
}

#[repr(u32)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum PksSessionStatusCode {
    Ok = 0,
    NullArgument = 1,
    UnsupportedAbiMajor = 3,
    InvalidStructSize = 4,
    InvalidHandle = 5,
    StaleHandle = 6,
    NoCapacity = 7,
    InternalPanic = 8,
    MisalignedPointer = 9,
    InvalidArgument = 10,
    ForeignHandle = 11,
    InvalidLifecycleState = 12,
    WouldBlock = 13,
    BackendFailure = 14,
    Cancelled = 15,
    IndexOutOfRange = 16,
    UnsupportedAbiMinor = 17,
}

#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct PksSessionUtf8 {
    pub data: *const u8,
    pub len_bytes: u32,
}

#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct PksSessionEngineConfig {
    pub struct_size_bytes: u32,
    pub abi_major: u16,
    pub abi_minor: u16,
    pub source_queue_capacity_frames: u32,
    pub capture_frame_capacity_frames: u32,
    pub capture_runtime_event_capacity_count: u32,
    pub runtime_work_budget_frames: u32,
    pub runtime_idle_poll_ms: u64,
    pub runtime_ready_timeout_ms: u64,
    pub session_event_capacity_count: u32,
    pub audio_queue_capacity_frames: u32,
    pub audio_max_batch_frames: u32,
    pub audio_max_outstanding_leases: u32,
}

impl Default for PksSessionEngineConfig {
    fn default() -> Self {
        Self {
            struct_size_bytes: size_of::<Self>() as u32,
            abi_major: PKS_SESSION_ABI_MAJOR,
            abi_minor: PKS_SESSION_ABI_MINOR,
            source_queue_capacity_frames: 32,
            capture_frame_capacity_frames: 32,
            capture_runtime_event_capacity_count: 8,
            runtime_work_budget_frames: 64,
            runtime_idle_poll_ms: 1,
            runtime_ready_timeout_ms: 1_000,
            session_event_capacity_count: 32,
            audio_queue_capacity_frames: 32,
            audio_max_batch_frames: 8,
            audio_max_outstanding_leases: 4,
        }
    }
}

#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct PksSessionAppMicDeclaration {
    pub struct_size_bytes: u32,
    pub abi_major: u16,
    pub abi_minor: u16,
    pub application_name: PksSessionUtf8,
}

impl PksSessionAppMicDeclaration {
    #[cfg(test)]
    pub const fn new(application_name: PksSessionUtf8) -> Self {
        Self {
            struct_size_bytes: size_of::<Self>() as u32,
            abi_major: PKS_SESSION_ABI_MAJOR,
            abi_minor: PKS_SESSION_ABI_MINOR,
            application_name,
        }
    }
}

#[repr(u32)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum PksSessionLifecycleState {
    Draft = 0,
    Compiled = 1,
    Running = 2,
    Stopped = 3,
    Failed = 4,
    Starting = 5,
    Stopping = 6,
}

#[repr(u32)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum PksSessionEventKind {
    Lifecycle = 0,
    SourceFailure = 1,
    EndpointFailure = 2,
    RollbackFailure = 3,
    FinalizationFailure = 4,
    Terminal = 5,
}

#[repr(u32)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum PksSessionSampleFormat {
    F32Interleaved = 1,
}

#[repr(u32)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum PksSessionEndpointObservationStage {
    Unavailable = 0,
    Live = 1,
    Finalized = 2,
}

#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct PksSessionEvent {
    pub struct_size_bytes: u32,
    pub abi_major: u16,
    pub abi_minor: u16,
    pub kind: u32,
    pub lifecycle_state: u32,
    pub reserved: u32,
    pub session_id: u64,
    pub stem_id: u64,
    pub endpoint_id: u64,
    pub route_id: u64,
    pub failures_total: u64,
}

#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct PksSessionMetricsSnapshot {
    pub struct_size_bytes: u32,
    pub abi_major: u16,
    pub abi_minor: u16,
    pub reserved: u32,
    pub event_capacity_count: u64,
    pub event_depth_count: u64,
    pub event_peak_depth_count: u64,
    pub events_enqueued_total: u64,
    pub events_dropped_total: u64,
    pub event_receiver_closed_total: u64,
    pub audio_queue_capacity_frames: u64,
    pub audio_queue_depth_frames: u64,
    pub audio_queue_peak_frames: u64,
    pub audio_frames_received_total: u64,
    pub audio_frames_delivered_total: u64,
    pub audio_queue_full_drops_total: u64,
    pub audio_invalid_ownership_drops_total: u64,
    pub audio_lease_capacity_count: u64,
    pub audio_outstanding_leases_count: u64,
    pub audio_lease_exhausted_total: u64,
    pub audio_batches_polled_total: u64,
    pub audio_frames_polled_total: u64,
}

#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct PksSessionSourceMetrics {
    pub struct_size_bytes: u32,
    pub abi_major: u16,
    pub abi_minor: u16,
    pub stem_id: u64,
    pub capture_callback_buffers_total: u64,
    pub capture_frames_enqueued_total: u64,
    pub capture_pool_exhausted_total: u64,
    pub capture_dispatch_queue_full_total: u64,
    pub capture_invalid_buffer_total: u64,
    pub capture_oversized_buffer_total: u64,
    pub capture_stream_errors_total: u64,
    pub capture_timestamp_epoch_clamps_total: u64,
    pub capture_stream_delivered_frames_total: u64,
    pub capture_stream_dropped_newest_frames_total: u64,
    pub capture_runtime_events_enqueued_total: u64,
    pub capture_runtime_events_dropped_total: u64,
    pub ingress_queue_capacity_frames: u64,
    pub ingress_queue_depth_frames: u64,
    pub ingress_queue_peak_frames: u64,
    pub ingress_frames_enqueued_total: u64,
    pub ingress_frames_delivered_total: u64,
    pub ingress_frames_rejected_full_total: u64,
    pub ingress_frames_rejected_cancelled_total: u64,
    pub ingress_frames_discarded_total: u64,
}

#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct PksSessionRouteMetrics {
    pub struct_size_bytes: u32,
    pub abi_major: u16,
    pub abi_minor: u16,
    pub route_id: u64,
    pub endpoint_id: u64,
    pub edge_queue_capacity_frames: u64,
    pub edge_queue_depth_frames: u64,
    pub edge_queue_peak_frames: u64,
    pub edge_frames_enqueued_total: u64,
    pub edge_frames_delivered_total: u64,
    pub edge_frames_dropped_total: u64,
    pub edge_overruns_total: u64,
    pub edge_receiver_unavailable_drops_total: u64,
    pub edge_queue_full_drops_total: u64,
    pub edge_shared_reference_exhausted_drops_total: u64,
    pub edge_branch_pool_exhausted_drops_total: u64,
    pub edge_invalid_copy_policy_drops_total: u64,
    pub edge_freeze_failed_drops_total: u64,
    pub edge_discontinuities_total: u64,
    pub edge_source_identity_discontinuities_total: u64,
    pub edge_sequence_discontinuities_total: u64,
    pub edge_timestamp_discontinuities_total: u64,
    pub edge_lineage_epoch_discontinuities_total: u64,
    pub edge_manually_reported_discontinuities_total: u64,
    pub edge_enqueue_to_receive_samples_total: u64,
    pub edge_enqueue_to_receive_invalid_order_total: u64,
    pub edge_enqueue_to_receive_p50_ns: u64,
    pub edge_enqueue_to_receive_p95_ns: u64,
    pub edge_enqueue_to_receive_p99_ns: u64,
    pub edge_enqueue_to_receive_max_ns: u64,
    pub edge_source_timestamp_to_receive_samples_total: u64,
    pub edge_source_timestamp_to_receive_missing_total: u64,
    pub edge_source_timestamp_to_receive_future_total: u64,
    pub edge_source_timestamp_to_receive_p50_ns: u64,
    pub edge_source_timestamp_to_receive_p95_ns: u64,
    pub edge_source_timestamp_to_receive_p99_ns: u64,
    pub edge_source_timestamp_to_receive_max_ns: u64,
    pub edge_worker_failures_total: u64,
    pub edge_shutdown_discarded_total: u64,
    pub endpoint_frames_received_total: u64,
    pub endpoint_frames_delivered_total: u64,
    pub endpoint_frames_dropped_total: u64,
    pub endpoint_discontinuities_total: u64,
    pub endpoint_failures_total: u64,
    pub endpoint_observation_stage: u32,
    pub reserved: u32,
    pub endpoint_finalization_failures_total: u64,
}

#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct PksSessionAudioBatch {
    pub struct_size_bytes: u32,
    pub abi_major: u16,
    pub abi_minor: u16,
    pub frame_count: u32,
    pub reserved: u32,
    pub handle: PksSessionHandle,
}

#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct PksSessionAudioFrame {
    pub struct_size_bytes: u32,
    pub abi_major: u16,
    pub abi_minor: u16,
    pub sample_format: PksSessionSampleFormat,
    pub sample_rate_hz: u32,
    pub channel_count: u32,
    pub reserved: u32,
    pub session_id: u64,
    pub source_id: u64,
    pub stem_id: u64,
    pub clock_id: u64,
    pub sequence_num: u64,
    pub timestamp_start_ns: u64,
    pub duration_ns: u64,
    pub source_generation: u32,
    pub discontinuity_epoch: u64,
    pub permission_epoch: u64,
    pub endpoint_id: u64,
    pub connector_id: u64,
    pub route_id: u64,
    pub samples: *const f32,
    pub sample_count: u32,
    pub reserved_tail: u32,
}