Skip to main content

sim_lib_sound_render/
runtime.rs

1use sim_kernel::{
2    AbiVersion, Cx, Export, ExportKind, ExportRecord, ExportState, Lib, LibManifest, LibTarget,
3    Linker, Result, RuntimeId, Symbol, Version,
4};
5
6const SOUND_RENDER_LIB_ID: &str = "sound-render";
7const RENDER_EXPORT_KIND: &str = "Renderer";
8
9/// Host-registered lib exporting the PCM renderer card.
10pub struct SoundRenderLib;
11
12impl Lib for SoundRenderLib {
13    fn manifest(&self) -> LibManifest {
14        LibManifest {
15            id: Symbol::new(SOUND_RENDER_LIB_ID),
16            version: Version(env!("CARGO_PKG_VERSION").to_owned()),
17            abi: AbiVersion { major: 0, minor: 1 },
18            target: LibTarget::HostRegistered,
19            requires: Vec::new(),
20            capabilities: Vec::new(),
21            exports: vec![Export::Value {
22                symbol: Symbol::qualified("sound", "PcmRenderer"),
23            }],
24        }
25    }
26
27    fn load(&self, cx: &mut sim_kernel::LoadCx, linker: &mut Linker<'_>) -> Result<()> {
28        linker.value(
29            Symbol::qualified("sound", "PcmRenderer"),
30            renderer_value(cx)?,
31        )?;
32        Ok(())
33    }
34}
35
36/// Installs the sound-render lib into `cx`, registering the PCM renderer
37/// export record (idempotent).
38pub fn install_sound_render_lib(cx: &mut Cx) -> Result<()> {
39    let lib = Symbol::new(SOUND_RENDER_LIB_ID);
40    if !sim_lib_core::install_once(cx, &SoundRenderLib)? {
41        return Ok(());
42    }
43    cx.registry_mut().append_export_record(
44        &lib,
45        ExportRecord {
46            kind: ExportKind::named(RENDER_EXPORT_KIND),
47            symbol: Symbol::qualified("sound", "PcmRenderer"),
48            state: ExportState::Resolved {
49                id: RuntimeId::Value,
50            },
51        },
52    )?;
53    Ok(())
54}
55
56fn renderer_value(cx: &mut sim_kernel::LoadCx) -> Result<sim_kernel::Value> {
57    cx.factory().table(vec![
58        (
59            Symbol::new("symbol"),
60            cx.factory()
61                .symbol(Symbol::qualified("sound", "PcmRenderer"))?,
62        ),
63        (
64            Symbol::new("layer"),
65            cx.factory().string("sound".to_owned())?,
66        ),
67        (
68            Symbol::new("kind"),
69            cx.factory().string("operation".to_owned())?,
70        ),
71        (
72            Symbol::new("shape"),
73            cx.factory()
74                .symbol(Symbol::qualified("sound", "PcmRenderer"))?,
75        ),
76        (
77            Symbol::new("dependencies"),
78            cx.factory().list(vec![
79                cx.factory().string("sound-core".to_owned())?,
80                cx.factory().string("sound-bridge".to_owned())?,
81            ])?,
82        ),
83        (Symbol::new("lossless"), cx.factory().bool(false)?),
84        (Symbol::new("capabilities"), cx.factory().list(Vec::new())?),
85    ])
86}