1use std::time::Duration;
2
3use crate::{audio::AudioFrame, config::SessionConfig, error::Result, frame::CaptureEvent};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6pub enum BackendPreference {
7 Auto,
8 LinuxWaylandPortal,
9 LinuxX11,
10 MacScreenCaptureKit,
11 WindowsDxgi,
12 WindowsWgc,
13}
14
15#[derive(Debug, Clone, Copy, PartialEq, Eq)]
16pub enum BackendKind {
17 LinuxWaylandPortal,
18 LinuxX11,
19 MacScreenCaptureKit,
20 WindowsDxgi,
21 WindowsWgc,
22}
23
24#[derive(Debug, Clone, PartialEq, Eq)]
25pub struct BackendInfo {
26 pub kind: BackendKind,
27 pub supports_audio: bool,
28 pub zero_copy: bool,
29 pub notes: &'static str,
30}
31
32pub trait VideoBackend: Send {
33 fn info(&self) -> BackendInfo;
34 fn start(&mut self) -> Result<()>;
35 fn stop(&mut self) -> Result<()>;
36 fn next_event(&mut self, timeout: Option<Duration>) -> Result<CaptureEvent>;
37}
38
39pub trait AudioBackend: Send {
40 fn info(&self) -> BackendInfo;
41 fn start(&mut self) -> Result<()>;
42 fn stop(&mut self) -> Result<()>;
43 fn next_audio(&mut self, timeout: Option<Duration>) -> Result<AudioFrame>;
44}
45
46pub struct BackendBundle {
47 pub info: BackendInfo,
48 pub video: Option<Box<dyn VideoBackend>>,
49 pub audio: Option<Box<dyn AudioBackend>>,
50}
51
52pub trait BackendResolver {
53 fn resolve(&self, config: &SessionConfig) -> Result<BackendBundle>;
54}