]>
code.octet-stream.net Git - m17rt/blob - m17app/src/rtlsdr.rs
3 process
::{Child
, Command
, Stdio
},
4 sync
::{mpsc
::SyncSender
, Mutex
},
9 soundmodem
::{InputSource
, SoundmodemErrorSender
, 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
>, errors
: SoundmodemErrorSender
) {
30 let mut cmd
= match Command
::new("rtl_fm")
35 &format
!("{:.6}M", self.freq
uency
_mhz
),
37 &self.device_index
.to_string(),
41 .stdout(Stdio
::piped())
50 let mut stdout
= cmd
.stdout
.take().unwrap
();
51 let mut buf
= [0u8; 1024];
52 let mut leftover
: Option
<u8> = None
;
53 std
::thread
::spawn(move || {
54 while let Ok(n
) = stdout
.read(&mut buf
) {
55 let mut start_idx
= 0;
56 let mut samples
= vec
![];
57 if let Some(left
) = leftover
{
59 samples
.push(i16::from_le_bytes([left
, buf
[0]]));
64 for sample
in buf
[start_idx
..n
].chunks(2) {
65 if sample
.len() == 2 {
66 samples
.push(i16::from_le_bytes([sample
[0], sample
[1]]))
68 leftover
= Some(sample
[0]);
72 .send(SoundmodemEvent
::BasebandInput(samples
.into
()))
79 *self.rtlfm
.lock().unwrap
() = Some(cmd
);
83 if let Some(mut process
) = self.rtlfm
.lock().unwrap
().take() {
84 let _
= process
.kill();