]>
code.octet-stream.net Git - m17rt/blob - m17app/src/rtlsdr.rs
7829f96220357a644fb6934ec4cd00104753047c
3 process
::{Child
, Command
, Stdio
},
4 sync
::{mpsc
::SyncSender
, Mutex
},
8 error
::{M17Error
, SoundmodemError
},
9 soundmodem
::{InputSource
, SoundmodemEvent
},
15 rtlfm
: Mutex
<Option
<Child
>>,
19 pub fn new(device_index
: usize, frequency_mhz
: f32) -> Result
<Self, M17Error
> {
23 rtlfm
: Mutex
::new(None
),
28 impl InputSource
for RtlSdr
{
29 fn start(&self, tx
: SyncSender
<SoundmodemEvent
>) -> Result
<(), SoundmodemError
> {
30 let mut cmd
= Command
::new("rtl_fm")
35 &format
!("{:.6}M", self.freq
uency
_mhz
),
37 &self.device_index
.to_string(),
41 .stdout(Stdio
::piped())
43 let mut stdout
= cmd
.stdout
.take().unwrap
();
44 let mut buf
= [0u8; 1024];
45 let mut leftover
: Option
<u8> = None
;
46 std
::thread
::spawn(move || {
47 while let Ok(n
) = stdout
.read(&mut buf
) {
48 let mut start_idx
= 0;
49 let mut samples
= vec
![];
50 if let Some(left
) = leftover
{
52 samples
.push(i16::from_le_bytes([left
, buf
[0]]));
57 for sample
in buf
[start_idx
..n
].chunks(2) {
58 if sample
.len() == 2 {
59 samples
.push(i16::from_le_bytes([sample
[0], sample
[1]]))
61 leftover
= Some(sample
[0]);
65 .send(SoundmodemEvent
::BasebandInput(samples
.into
()))
72 *self.rtlfm
.lock().unwrap
() = Some(cmd
);
76 fn close(&self) -> Result
<(), SoundmodemError
> {
77 if let Some(mut process
) = self.rtlfm
.lock().unwrap
().take() {
78 let _
= process
.kill();