audiofox 1.0.2

Cross platform audio capture made easy!
Documentation
// SPDX-License-Identifier: GPL-2.0-or-later WITH Classpath-exception-2.0
// Audiofox, the audio capturer!
// Copyright (c) 2026 foxberries

use log::error;
use uuid::Uuid;

use crate::common::audiofox::Audiofox;
use crate::common::callback::AudioCallbackFn;
use crate::common::result::Result;
use crate::common::source::{AudioSource, AudioSources};
use crate::platform::mac::list::list;
use crate::platform::mac::stream::{StreamState, start_stream, stop_stream};

/// Implementation of [`AudioManager`](crate::AudioManager) for Core Audio.
pub struct PlatformManager;

/// Implementation of [`LinkHandle`](crate::LinkHandle) for Core Audio.
pub struct PlatformHandle(StreamState);

/// Implementation of [`Audiofox`] for Core Audio.
impl Audiofox for PlatformManager {
    type LinkHandle = PlatformHandle;

    fn start() -> Result<Self> {
        Ok(Self)
    }

    fn list(&self) -> Result<AudioSources> {
        list()
    }

    fn link<F>(&self, uuid: Uuid, sources: &[AudioSource], callback: F) -> Result<Self::LinkHandle>
    where
        F: AudioCallbackFn,
    {
        Ok(PlatformHandle(start_stream(uuid, sources, callback.into())?))
    }
}

impl Drop for PlatformHandle {
    fn drop(&mut self) {
        if let Err(e) = stop_stream(&self.0) {
            error!("cleanup failed: {e}");
        }
    }
}