sim_lib_sound_render/
runtime.rs1use 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
9pub 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
36pub 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}