From: Thomas Karpiniec Date: Sat, 1 Feb 2025 06:51:02 +0000 (+1100) Subject: Make Input RRC creation fallible and read samples upfront X-Git-Url: https://code.octet-stream.net/m17rt/commitdiff_plain/e1d6e76ab13e3bf753c747f80bbe09612f38b245 Make Input RRC creation fallible and read samples upfront --- diff --git a/m17app/src/error.rs b/m17app/src/error.rs index acbf397..c1bcac1 100644 --- a/m17app/src/error.rs +++ b/m17app/src/error.rs @@ -1,3 +1,5 @@ +use std::path::PathBuf; + use thiserror::Error; #[derive(Debug, Error, PartialEq, Eq, Clone)] @@ -21,4 +23,10 @@ pub enum M17Error { "provided packet payload is too large: provided {provided} bytes, capacity {capacity}" )] PacketTooLarge { provided: usize, capacity: usize }, + + #[error("provided path to RRC file could not be opened: {0}")] + InvalidRrcPath(PathBuf), + + #[error("failed to read from RRC file: {0}")] + RrcReadFailed(PathBuf), } diff --git a/m17app/src/soundmodem.rs b/m17app/src/soundmodem.rs index 391bfad..16bb976 100644 --- a/m17app/src/soundmodem.rs +++ b/m17app/src/soundmodem.rs @@ -1,3 +1,4 @@ +use crate::error::M17Error; use crate::tnc::{Tnc, TncError}; use log::debug; use m17core::kiss::MAX_FRAME_LEN; @@ -240,29 +241,28 @@ pub trait InputSource: Send + Sync + 'static { } pub struct InputRrcFile { - path: PathBuf, + baseband: Arc<[u8]>, end_tx: Mutex>>, } impl InputRrcFile { - pub fn new(path: PathBuf) -> Self { - Self { - path, + pub fn new(path: PathBuf) -> Result { + let mut file = File::open(&path).map_err(|_| M17Error::InvalidRrcPath(path.clone()))?; + let mut baseband = vec![]; + file.read_to_end(&mut baseband) + .map_err(|_| M17Error::RrcReadFailed(path))?; + Ok(Self { + baseband: baseband.into(), end_tx: Mutex::new(None), - } + }) } } impl InputSource for InputRrcFile { fn start(&self, samples: SyncSender) { let (end_tx, end_rx) = channel(); - let path = self.path.clone(); + let baseband = self.baseband.clone(); std::thread::spawn(move || { - // TODO: error handling - let mut file = File::open(path).unwrap(); - let mut baseband = vec![]; - file.read_to_end(&mut baseband).unwrap(); - // assuming 48 kHz for now const TICK: Duration = Duration::from_millis(25); const SAMPLES_PER_TICK: usize = 1200;