Skip to main content

sim_lib_stream_host/
audio_provider.rs

1//! Modeled audio device provider for the shared device catalog.
2
3use sim_kernel::{Error, Result, Symbol};
4
5use crate::eval_site::{DeviceProvider, StreamEvalSite};
6use crate::placement::{AudioDeviceCard, AudioSiteKey, DeviceRecord, Placement};
7
8/// Deterministic audio provider used by default validation.
9pub struct ModeledAudioProvider {
10    records: Vec<DeviceRecord>,
11}
12
13impl Default for ModeledAudioProvider {
14    fn default() -> Self {
15        let card = AudioDeviceCard::modeled(
16            AudioSiteKey::new("audio/model/stereo-0"),
17            "Modeled Audio Stereo 0",
18        );
19        Self {
20            records: vec![DeviceRecord::modeled_audio_from_card(&card)],
21        }
22    }
23}
24
25impl DeviceProvider for ModeledAudioProvider {
26    fn enumerate(&self) -> Result<Vec<DeviceRecord>> {
27        Ok(self.records.clone())
28    }
29
30    fn open(&self, id: &Symbol) -> Result<Box<dyn StreamEvalSite>> {
31        let record = self
32            .records
33            .iter()
34            .find(|record| &record.id == id)
35            .ok_or_else(|| Error::Eval(format!("ModeledAudioProvider: unknown id '{id}'")))?
36            .clone();
37        Ok(Box::new(ModeledAudioEvalSite { record }))
38    }
39}
40
41struct ModeledAudioEvalSite {
42    record: DeviceRecord,
43}
44
45impl StreamEvalSite for ModeledAudioEvalSite {
46    fn placement(&self) -> &Placement {
47        &self.record.placement
48    }
49
50    fn device_record(&self) -> &DeviceRecord {
51        &self.record
52    }
53
54    fn close(self: Box<Self>) -> Result<()> {
55        Ok(())
56    }
57}