sim_lib_stream_host/
audio_provider.rs1use sim_kernel::{Error, Result, Symbol};
4
5use crate::eval_site::{DeviceProvider, StreamEvalSite};
6use crate::placement::{AudioDeviceCard, AudioSiteKey, DeviceRecord, Placement};
7
8pub 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}