extern crate rosc;
use clap::Args;
use log::*;
use rosc::OscPacket;
use std::net::UdpSocket;
#[derive(Args, Default)]
pub struct ReceiveOptions {
#[arg(long = "host", default_value_t = String::from("0.0.0.0"))]
pub host: String,
#[arg(long = "port", default_value_t = 12345)]
pub port: usize,
}
pub fn receive_osc(options: &ReceiveOptions) {
let receive_url = format!("{}:{}", options.host, options.port);
info!("Will listen at {}", &receive_url);
let socket = UdpSocket::bind(&receive_url).expect("Error binding udp socket");
let mut receive_buffer = [0u8; rosc::decoder::MTU];
loop {
match socket.recv_from(&mut receive_buffer) {
Ok((size, addr)) => {
debug!("Received packet (length {}) from: {}", size, addr);
let packet =
rosc::decoder::decode(&receive_buffer[..size]).expect("Error decoding packet");
handle_packet(packet);
}
Err(e) => {
error!("Error receiving from socket: {}", e);
break;
}
}
}
}
fn handle_packet(packet: OscPacket) {
match packet {
OscPacket::Message(msg) => {
let arg_list = match msg.args {
Some(args) => format!("{:?}", args),
None => String::from("zero"),
};
println!("RCV OSC {} :: {}", msg.addr, arg_list);
}
OscPacket::Bundle(bundle) => {
println!("OSC Bundle: {:?}", bundle);
}
}
}