Skip to main content

open_sound_control/
receiver.rs

1use std::net::UdpSocket;
2use crate::helpers::{self, OscParseError};
3use crate::message::OscMessage;
4use crate::bundle::OscBundle;
5
6/// Struct for receiving OSC messages and bundles over UDP
7pub struct OscReceiver {
8  socket: UdpSocket
9}
10
11/// Represents either an OSC Message or an OSC Bundle
12pub 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  /// Constructs a new OscReceiver listening on the given port
25  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  /// Receives OSC Messages or Bundles from the UDP socket
35  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}