Skip to main content

sim_lib_stream_host/
site.rs

1//! Audio site abstraction for placement-routed host streams.
2
3use std::sync::Arc;
4
5use sim_kernel::Result;
6
7use crate::placement::{AudioDeviceCard, AudioSiteKey};
8use crate::{HostBackend, HostOpenStream, HostStreamConfigRequest};
9
10/// Runtime-openable audio placement target.
11///
12/// An audio site owns stable descriptive metadata and delegates stream opening
13/// to the backend implementation selected for that site.
14pub trait AudioSite: Send + Sync {
15    /// Returns the stable key used to register and route this site.
16    fn key(&self) -> &AudioSiteKey;
17
18    /// Returns the browseable device card for this site.
19    fn card(&self) -> &AudioDeviceCard;
20
21    /// Opens a host stream for this site using the supplied stream request.
22    fn open(&self, request: HostStreamConfigRequest) -> Result<HostOpenStream>;
23}
24
25/// Modeled audio site backed by an existing host backend.
26pub struct ModeledAudioSite {
27    card: AudioDeviceCard,
28    backend: Arc<dyn HostBackend>,
29}
30
31impl ModeledAudioSite {
32    /// Builds a modeled site from a device card and host backend.
33    pub fn new(card: AudioDeviceCard, backend: Arc<dyn HostBackend>) -> Self {
34        Self { card, backend }
35    }
36}
37
38impl AudioSite for ModeledAudioSite {
39    fn key(&self) -> &AudioSiteKey {
40        &self.card.key
41    }
42
43    fn card(&self) -> &AudioDeviceCard {
44        &self.card
45    }
46
47    fn open(&self, request: HostStreamConfigRequest) -> Result<HostOpenStream> {
48        self.backend.open(request)
49    }
50}