interstice-sdk-core 0.5.0

Core SDK utilities used by Interstice modules and macros
Documentation
use crate::host_calls::{host_call, unpack};
use interstice_abi::{AudioCall, AudioResponse, AudioStreamConfig, HostCall};

pub fn open_output_stream(config: AudioStreamConfig) -> Result<u64, String> {
    let pack = host_call(HostCall::Audio(AudioCall::OpenOutputStream(config)));
    let response: AudioResponse = unpack(pack);
    match response {
        AudioResponse::StreamOpened { stream_id } => Ok(stream_id),
        AudioResponse::Err(err) => Err(err),
        other => Err(format!("Unexpected audio response: {:?}", other)),
    }
}

pub fn open_input_stream(config: AudioStreamConfig) -> Result<u64, String> {
    let pack = host_call(HostCall::Audio(AudioCall::OpenInputStream(config)));
    let response: AudioResponse = unpack(pack);
    match response {
        AudioResponse::StreamOpened { stream_id } => Ok(stream_id),
        AudioResponse::Err(err) => Err(err),
        other => Err(format!("Unexpected audio response: {:?}", other)),
    }
}

pub fn close_stream(stream_id: u64) -> Result<(), String> {
    let pack = host_call(HostCall::Audio(AudioCall::CloseStream { stream_id }));
    let response: AudioResponse = unpack(pack);
    match response {
        AudioResponse::Ok => Ok(()),
        AudioResponse::Err(err) => Err(err),
        other => Err(format!("Unexpected audio response: {:?}", other)),
    }
}

pub fn write_frames_f32_planar(
    stream_id: u64,
    frames: u32,
    channels: u16,
    data: Vec<Vec<f32>>,
) -> Result<(), String> {
    let pack = host_call(HostCall::Audio(AudioCall::WriteFramesF32Planar {
        stream_id,
        frames,
        channels,
        data,
    }));
    let response: AudioResponse = unpack(pack);
    match response {
        AudioResponse::Ok => Ok(()),
        AudioResponse::Err(err) => Err(err),
        other => Err(format!("Unexpected audio response: {:?}", other)),
    }
}

pub struct Audio;

impl Audio {
    pub fn open_output_stream(&self, config: AudioStreamConfig) -> Result<u64, String> {
        open_output_stream(config)
    }

    pub fn close_stream(&self, stream_id: u64) -> Result<(), String> {
        close_stream(stream_id)
    }

    pub fn open_input_stream(&self, config: AudioStreamConfig) -> Result<u64, String> {
        open_input_stream(config)
    }

    pub fn write_frames_f32_planar(
        &self,
        stream_id: u64,
        frames: u32,
        channels: u16,
        data: Vec<Vec<f32>>,
    ) -> Result<(), String> {
        write_frames_f32_planar(stream_id, frames, channels, data)
    }
}