Skip to main content

interstice_sdk_core/host_calls/
audio.rs

1use crate::host_calls::{host_call, unpack};
2use interstice_abi::{AudioCall, AudioResponse, AudioStreamConfig, HostCall};
3
4pub fn open_output_stream(config: AudioStreamConfig) -> Result<u64, String> {
5    let pack = host_call(HostCall::Audio(AudioCall::OpenOutputStream(config)));
6    let response: AudioResponse = unpack(pack);
7    match response {
8        AudioResponse::StreamOpened { stream_id } => Ok(stream_id),
9        AudioResponse::Err(err) => Err(err),
10        other => Err(format!("Unexpected audio response: {:?}", other)),
11    }
12}
13
14pub fn open_input_stream(config: AudioStreamConfig) -> Result<u64, String> {
15    let pack = host_call(HostCall::Audio(AudioCall::OpenInputStream(config)));
16    let response: AudioResponse = unpack(pack);
17    match response {
18        AudioResponse::StreamOpened { stream_id } => Ok(stream_id),
19        AudioResponse::Err(err) => Err(err),
20        other => Err(format!("Unexpected audio response: {:?}", other)),
21    }
22}
23
24pub fn close_stream(stream_id: u64) -> Result<(), String> {
25    let pack = host_call(HostCall::Audio(AudioCall::CloseStream { stream_id }));
26    let response: AudioResponse = unpack(pack);
27    match response {
28        AudioResponse::Ok => Ok(()),
29        AudioResponse::Err(err) => Err(err),
30        other => Err(format!("Unexpected audio response: {:?}", other)),
31    }
32}
33
34pub fn write_frames_f32_planar(
35    stream_id: u64,
36    frames: u32,
37    channels: u16,
38    data: Vec<Vec<f32>>,
39) -> Result<(), String> {
40    let pack = host_call(HostCall::Audio(AudioCall::WriteFramesF32Planar {
41        stream_id,
42        frames,
43        channels,
44        data,
45    }));
46    let response: AudioResponse = unpack(pack);
47    match response {
48        AudioResponse::Ok => Ok(()),
49        AudioResponse::Err(err) => Err(err),
50        other => Err(format!("Unexpected audio response: {:?}", other)),
51    }
52}
53
54pub struct Audio;
55
56impl Audio {
57    pub fn open_output_stream(&self, config: AudioStreamConfig) -> Result<u64, String> {
58        open_output_stream(config)
59    }
60
61    pub fn close_stream(&self, stream_id: u64) -> Result<(), String> {
62        close_stream(stream_id)
63    }
64
65    pub fn open_input_stream(&self, config: AudioStreamConfig) -> Result<u64, String> {
66        open_input_stream(config)
67    }
68
69    pub fn write_frames_f32_planar(
70        &self,
71        stream_id: u64,
72        frames: u32,
73        channels: u16,
74        data: Vec<Vec<f32>>,
75    ) -> Result<(), String> {
76        write_frames_f32_planar(stream_id, frames, channels, data)
77    }
78}