futuresdr 0.0.27

An Experimental Async SDR Runtime for Heterogeneous Architectures.
Documentation
use std::mem::size_of;
use wasm_bindgen::prelude::*;

use crate::anyhow::Result;
use crate::runtime::Block;
use crate::runtime::BlockMeta;
use crate::runtime::BlockMetaBuilder;
use crate::runtime::Kernel;
use crate::runtime::MessageIo;
use crate::runtime::MessageIoBuilder;
use crate::runtime::StreamIo;
use crate::runtime::StreamIoBuilder;
use crate::runtime::WorkIo;

#[wasm_bindgen]
extern "C" {
    fn put_samples(s: Vec<f32>);
}

pub struct WasmFreq;

impl WasmFreq {
    #[allow(clippy::new_ret_no_self)]
    pub fn new() -> Block {
        Block::new(
            BlockMetaBuilder::new("WasmFreq").build(),
            StreamIoBuilder::new()
                .add_input("in", size_of::<f32>())
                .build(),
            MessageIoBuilder::new().build(),
            Self,
        )
    }
}

#[doc(hidden)]
#[async_trait]
impl Kernel for WasmFreq {
    async fn work(
        &mut self,
        _io: &mut WorkIo,
        sio: &mut StreamIo,
        _mio: &mut MessageIo<Self>,
        _meta: &mut BlockMeta,
    ) -> Result<()> {
        let input = sio.input(0).slice::<f32>();
        let n = input.len() / 2048;

        for i in 0..n {
            put_samples(input[i * 2048..(i + 1) * 2048].to_vec());
        }

        sio.input(0).consume(n * 2048);

        Ok(())
    }
}