Skip to main content

pinray_core/
backend.rs

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}