+ let mut kiss = self.kiss_buffer.lock().unwrap();
+ let rem = kiss.buf_remaining();
+ let sz = buf.len().max(rem.len());
+ rem[0..sz].copy_from_slice(&buf[0..sz]);
+ if let Some(frame) = kiss.next_frame() {
+ if Ok(KissCommand::DataFrame) == frame.command() && frame.port() == Ok(PORT_STREAM) {
+ let mut payload = [0u8; 30];
+ if let Ok(len) = frame.decode_payload(&mut payload) {
+ if len == 30 {
+ let lsf = LsfFrame(payload);
+ let mut to_voice = self.rf_to_voice.lock().unwrap();
+ match &mut *to_voice {
+ Some(to_voice) => to_voice.process_lsf(lsf),
+ None => *to_voice = Some(RfToVoice::new(lsf)),
+ }
+ } else if len == 26 {
+ let frame_num_part = u16::from_be_bytes([payload[6], payload[7]]);
+ let frame = StreamFrame {
+ lich_idx: payload[5] >> 5,
+ lich_part: payload[0..5].try_into().unwrap(),
+ frame_number: frame_num_part & 0x7fff,
+ end_of_stream: frame_num_part & 0x8000 > 0,
+ stream_data: payload[8..24].try_into().unwrap(),
+ };
+ let to_voice = self.rf_to_voice.lock().unwrap();
+ if let Some(to_voice) = &*to_voice {
+ let voice = to_voice.process_stream(&frame);
+ if let Some(tx) = self.event_tx.lock().unwrap().as_ref() {
+ let _ = tx.send(TncEvent::TransmitVoice(voice));
+ }
+ }
+ }
+ };
+ }
+ }
+ Ok(sz)