open_sound_control/
receiver.rs1use std::net::UdpSocket;
2use crate::helpers::{self, OscParseError};
3use crate::message::OscMessage;
4use crate::bundle::OscBundle;
5
6pub struct OscReceiver {
8 socket: UdpSocket
9}
10
11pub enum OscPacket {
13 Message(OscMessage),
14 Bundle(OscBundle)
15}
16
17#[derive(Debug, PartialEq)]
18pub enum OscNetworkError {
19 CouldNotBindToSocket
20}
21
22impl OscReceiver {
23
24 pub fn new(port: u32) -> Result<Self, OscNetworkError> {
26 let addr = format!("0.0.0.0:{}", port);
27 let socket = UdpSocket::bind(addr);
28 if socket.is_err() {
29 return Err(OscNetworkError::CouldNotBindToSocket);
30 }
31 Ok (OscReceiver { socket: socket.unwrap() })
32 }
33
34 pub fn get_messages(&self) -> Result<OscPacket, OscParseError> {
36
37 let mut buf = [0u8; 2048];
38
39 match self.socket.recv_from(&mut buf) {
40 Ok((number_of_bytes, _source_address)) => {
41 let bytes = &mut buf[..number_of_bytes];
42 if helpers::is_bundle(&bytes) {
43 let bundle = OscBundle::from_bytes(&bytes)?;
44 return Ok(OscPacket::Bundle(bundle));
45 } else {
46 let message = OscMessage::from_bytes(&bytes)?;
47 return Ok(OscPacket::Message(message));
48 }
49 },
50 Err(_) => return Err(OscParseError::NotEnoughData),
51 }
52 }
53}