#![allow(unsafe_code)]
use crate::CaptureError;
use crate::desktop::{
DesktopAudioCapture, DesktopAudioCaptureConfig, DesktopAudioSource, ProcessTreeScope,
};
use crate::windows_audio::{
WasapiCaptureConfig, WasapiProcessTreeScope, WasapiSource, WindowsWasapiCapture,
};
use mediaway_common::{AudioFrame, StreamInfo};
fn to_wasapi_source(source: &DesktopAudioSource) -> WasapiSource {
match source {
DesktopAudioSource::Loopback { select } => WasapiSource::Loopback {
select: select.clone(),
},
DesktopAudioSource::ProcessLoopback {
process_id,
tree_scope,
} => {
let tree_scope = match tree_scope {
ProcessTreeScope::ProcessOnly => WasapiProcessTreeScope::ProcessOnly,
ProcessTreeScope::IncludeChildren => WasapiProcessTreeScope::IncludeChildren,
};
WasapiSource::ProcessLoopback {
process_id: *process_id,
tree_scope,
}
}
}
}
pub struct WindowsDesktopAudioCapture(WindowsWasapiCapture);
impl WindowsDesktopAudioCapture {
pub fn open(config: &DesktopAudioCaptureConfig) -> Result<Self, CaptureError> {
let source = to_wasapi_source(&config.source);
let inner = WindowsWasapiCapture::open(&WasapiCaptureConfig {
source,
time_base: config.time_base,
sample_format: config.sample_format,
})?;
Ok(Self(inner))
}
}
impl DesktopAudioCapture for WindowsDesktopAudioCapture {
fn stream_info(&self) -> &StreamInfo {
self.0.stream_info()
}
fn poll_frame(&mut self) -> Result<Option<AudioFrame>, CaptureError> {
self.0.poll_frame()
}
fn close(&mut self) -> Result<(), CaptureError> {
self.0.close()
}
}