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    ///
23    /// This is site-level dispatch for an already checked placement. Public
24    /// placement opens should use
25    /// [`AudioRouter::open_placement_checked`](crate::AudioRouter::open_placement_checked).
26    fn open(&self, request: HostStreamConfigRequest) -> Result<HostOpenStream>;
27}
28
29/// Modeled audio site backed by an existing host backend.
30pub struct ModeledAudioSite {
31    card: AudioDeviceCard,
32    backend: Arc<dyn HostBackend>,
33}
34
35impl ModeledAudioSite {
36    /// Builds a modeled site from a device card and host backend.
37    pub fn new(card: AudioDeviceCard, backend: Arc<dyn HostBackend>) -> Self {
38        Self { card, backend }
39    }
40}
41
42impl AudioSite for ModeledAudioSite {
43    fn key(&self) -> &AudioSiteKey {
44        &self.card.key
45    }
46
47    fn card(&self) -> &AudioDeviceCard {
48        &self.card
49    }
50
51    fn open(&self, request: HostStreamConfigRequest) -> Result<HostOpenStream> {
52        self.backend.open(request)
53    }
54}