use crate::{Error, SourceKind};
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Capabilities {
pub os_version: Option<OsVersion>,
pub sources: SourceCapabilities,
pub system_exclusions: SystemExclusionCapabilities,
pub process: ProcessCapabilities,
pub device_watcher: DeviceWatcherCapabilities,
pub side_effects: SideEffectCapabilities,
}
impl Capabilities {
pub fn new(
os_version: Option<OsVersion>,
sources: SourceCapabilities,
system_exclusions: SystemExclusionCapabilities,
process: ProcessCapabilities,
device_watcher: DeviceWatcherCapabilities,
side_effects: SideEffectCapabilities,
) -> Self {
Self {
os_version,
sources,
system_exclusions,
process,
device_watcher,
side_effects,
}
}
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct OsVersion {
pub major: u32,
pub minor: u32,
pub patch: Option<u32>,
pub build: Option<u32>,
}
impl OsVersion {
pub fn new(major: u32, minor: u32, patch: Option<u32>, build: Option<u32>) -> Self {
Self {
major,
minor,
patch,
build,
}
}
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SourceCapabilities {
pub mic: SourceCapability,
pub system: SourceCapability,
pub process: SourceCapability,
pub mix: SourceCapability,
}
impl SourceCapabilities {
pub fn new(
mic: SourceCapability,
system: SourceCapability,
process: SourceCapability,
mix: SourceCapability,
) -> Self {
Self {
mic,
system,
process,
mix,
}
}
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SourceCapability {
pub backend: BackendKind,
pub availability: Availability,
}
impl SourceCapability {
pub fn new(backend: BackendKind, availability: Availability) -> Self {
Self {
backend,
availability,
}
}
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum BackendKind {
Cpal,
PipeWire,
WasapiLoopback,
WasapiProcessLoopback,
CoreAudioProcessTap,
Composite,
Unsupported,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Availability {
Supported,
Unavailable {
reason: UnavailableReason,
},
Unknown {
error: Error,
},
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum UnavailableReason {
UnsupportedOs,
OsVersionTooOld {
required: OsVersion,
actual: OsVersion,
},
PipeWireUnavailable,
NotApplicable,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum PidScope {
ExactPid,
ProcessTree,
NotApplicable,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum DeviceSelectionBehavior {
Honored,
Ignored,
NotApplicable,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SystemExclusionCapabilities {
pub availability: Availability,
pub backend: BackendKind,
pub scope: PidScope,
pub max_distinct_pids: Option<u32>,
pub device_selection: DeviceSelectionBehavior,
}
impl SystemExclusionCapabilities {
pub fn new(
availability: Availability,
backend: BackendKind,
scope: PidScope,
max_distinct_pids: Option<u32>,
device_selection: DeviceSelectionBehavior,
) -> Self {
Self {
availability,
backend,
scope,
max_distinct_pids,
device_selection,
}
}
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ProcessCapabilities {
pub include_scope: PidScope,
pub exclude_scope: PidScope,
}
impl ProcessCapabilities {
pub fn new(include_scope: PidScope, exclude_scope: PidScope) -> Self {
Self {
include_scope,
exclude_scope,
}
}
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum WatcherMode {
Native,
Noop,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum WatchScope {
SystemOutputs,
DefaultSystemOutput,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DeviceWatcherCapabilities {
pub availability: Availability,
pub mode: WatcherMode,
pub scopes: Vec<WatchScope>,
}
impl DeviceWatcherCapabilities {
pub fn new(availability: Availability, mode: WatcherMode, scopes: Vec<WatchScope>) -> Self {
Self {
availability,
mode,
scopes,
}
}
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum SideEffectCondition {
SilentActiveSystemAudio,
ClassicLoopbackWithoutExclusions,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SideEffectCapability {
pub availability: Availability,
pub enabled_by_default: bool,
pub sources: Vec<SourceKind>,
pub condition: SideEffectCondition,
}
impl SideEffectCapability {
pub fn new(
availability: Availability,
enabled_by_default: bool,
sources: Vec<SourceKind>,
condition: SideEffectCondition,
) -> Self {
Self {
availability,
enabled_by_default,
sources,
condition,
}
}
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SideEffectCapabilities {
pub silence_probe: SideEffectCapability,
pub classic_loopback_keepalive: SideEffectCapability,
}
impl SideEffectCapabilities {
pub fn new(
silence_probe: SideEffectCapability,
classic_loopback_keepalive: SideEffectCapability,
) -> Self {
Self {
silence_probe,
classic_loopback_keepalive,
}
}
}