+#![doc = include_str!("../README.md")]
+
use codec2::{Codec2, Codec2Mode};
use cpal::traits::DeviceTrait;
use cpal::traits::HostTrait;
use m17app::app::TxHandle;
use m17app::link_setup::LinkSetup;
use m17app::link_setup::M17Address;
-use m17core::address::Address;
-use m17core::address::Callsign;
-use m17core::protocol::LsfFrame;
-use m17core::protocol::StreamFrame;
+use m17app::StreamFrame;
use std::collections::VecDeque;
use std::fs::File;
use std::io::Write;
all_samples
}
+/// Subscribes to M17 streams and attempts to play the decoded Codec2
pub struct Codec2Adapter {
state: Arc<Mutex<AdapterState>>,
// TODO: make this configurable
}
}
+impl Default for Codec2Adapter {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
struct AdapterState {
tx: Option<TxHandle>,
/// Circular buffer of output samples for playback
fn tnc_closed(&self) {}
- fn stream_began(&self, _lsf: LsfFrame) {
+ fn stream_began(&self, _link_setup: LinkSetup) {
// for now we will assume:
// - unencrypted
// - data type is Voice (Codec2 3200), not Voice+Data
// it seems concrete impls of Stream have a Drop implementation that will handle termination
}
+/// Transmits a wave file as an M17 stream
pub struct WavePlayer;
impl WavePlayer {
+ /// Plays a wave file (blocking).
+ ///
+ /// * `path`: wave file to transmit, must be 8 kHz mono and 16-bit LE
+ /// * `tx`: a `TxHandle` obtained from an `M17App`
+ /// * `source`: address of transmission source
+ /// * `destination`: address of transmission destination
+ /// * `channel_access_number`: from 0 to 15, usually 0
pub fn play(
path: PathBuf,
tx: TxHandle,
loop {
let mut last_one = false;
- for mut out in out_buf.chunks_mut(8) {
- for i in 0..160 {
+ for out in out_buf.chunks_mut(8) {
+ for i in in_buf.iter_mut() {
let sample = match samples.next() {
Some(Ok(sample)) => sample,
_ => {
0
}
};
- in_buf[i] = sample;
+ *i = sample;
}
- codec.encode(&mut out, &in_buf);
+ codec.encode(out, &in_buf);
}
tx.transmit_stream_next(&StreamFrame {
lich_idx: lsf_chunk as u8,
lich_part: setup.lich_part(lsf_chunk as u8),
frame_number,
end_of_stream: last_one,
- stream_data: out_buf.clone(),
+ stream_data: out_buf,
});
frame_number += 1;
lsf_chunk = (lsf_chunk + 1) % 6;