lasprs 0.14.1

Library for Acoustic Signal Processing (Rust edition, with optional Python bindings via pyo3)
use anyhow::Result;
use crossbeam::channel::{Receiver, TryRecvError, unbounded};
use lasprs::daq::{StreamDirection, StreamMgr, StreamStatus};
use lasprs::siggen::{SiggenCommand, SourceDescriptor, SweepSettings, SweepType};
use std::io;
use std::{thread, time};
// use

/// Spawns a thread and waits for a single line, pushes it to the receiver and  returns
fn stdin_channel_wait_for_return() -> Receiver<String> {
    let (tx, rx) = unbounded();
    thread::spawn(move || {
        let mut buffer = String::new();
        io::stdin().read_line(&mut buffer).unwrap();
        // Do not care whether we succeed here.
        let _ = tx.send(buffer);
    });
    rx
}
fn sleep(millis: u64) {
    let duration = time::Duration::from_millis(millis);
    thread::sleep(duration);
}
fn main() -> Result<()> {
    let mut smgr = StreamMgr::new_with_devices();

    let stdin_channel = stdin_channel_wait_for_return();

    println!("Creating signal generator...");
    // let mut siggen = Siggen::newSine(44100., 2, 432.)?;
    // Apply signal generator
    let src = SourceDescriptor::Sweep {
        settings: SweepSettings::new(10., 10000., 1., SweepType::ContinuousLog, None, None)?,
    };
    smgr.setSiggenSource(src)?;
    smgr.siggenCommand(SiggenCommand::SetAllGains {
        g: 0.1.try_into().unwrap(),
    })?;
    smgr.siggenCommand(SiggenCommand::SetMuteAllChannels { mute: false })?;

    println!("Starting stream...");
    smgr.startDefaultOutputStream()?;

    println!("Press <enter> key to quit...");
    'infy: loop {
        match stdin_channel.try_recv() {
            Ok(_key) => break 'infy,
            Err(TryRecvError::Empty) => {}
            Err(TryRecvError::Disconnected) => panic!("Channel disconnected"),
        }
        sleep(100);
        match smgr.getStatus(StreamDirection::Output) {
            StreamStatus::NotRunning {} => {
                println!("Stream is not running?");
                break 'infy;
            }
            StreamStatus::Running { .. } => {}
            StreamStatus::Error { e } => {
                println!("Stream error: {e}");
                break 'infy;
            }
        }
    }

    Ok(())
}