Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions CoreOSC/OscBundle.cs
Original file line number Diff line number Diff line change
Expand Up @@ -97,4 +97,13 @@ public static OscBundle ParseBundle(Span<byte> msg)
var output = new OscBundle(timeTag, messages.ToArray());
return output;
}

public static bool IsBundle(ReadOnlySpan<byte> msg)
{
if (msg.Length < 8)
return false;

var bundleTag = Encoding.ASCII.GetString(msg[..8]);
return bundleTag == "#bundle\0";
}
}
30 changes: 27 additions & 3 deletions CoreOSC/OscListener.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Threading.Tasks;
Expand All @@ -7,12 +8,16 @@ namespace LucHeart.CoreOSC;

public class OscListener : IDisposable, IOscListener
{
internal Queue<OscMessage> MessageQueue;
internal readonly UdpClient UdpClient;

public bool EnableTransparentBundleToMessageConversion = false;

public OscListener(IPEndPoint listenerEndPoint)
{
UdpClient = new UdpClient(listenerEndPoint);

MessageQueue = new Queue<OscMessage>();

// Set the SIO_UDP_CONNRESET ioctl to true for this UDP socket. If this UDP socket
// ever sends a UDP packet to a remote destination that exists but there is
// no socket to receive the packet, an ICMP port unreachable message is returned
Expand All @@ -39,8 +44,27 @@ public OscListener(IPEndPoint listenerEndPoint)

public async Task<OscMessage> ReceiveMessageAsync()
{
var receiveResult = await UdpClient.ReceiveAsync();
return OscMessage.ParseMessage(receiveResult.Buffer);
if (EnableTransparentBundleToMessageConversion)
{
if (MessageQueue.Count > 0)
return MessageQueue.Dequeue();

var receiveResult = await UdpClient.ReceiveAsync();

if (!OscBundle.IsBundle(receiveResult.Buffer))
return OscMessage.ParseMessage(receiveResult.Buffer);

var bundle = OscBundle.ParseBundle(receiveResult.Buffer);
foreach (var bundleMessage in bundle.Messages)
MessageQueue.Enqueue(bundleMessage);

return MessageQueue.Dequeue();
}
else
{
var receiveResult = await UdpClient.ReceiveAsync();
return OscMessage.ParseMessage(receiveResult.Buffer);
}
}

public async Task<(OscMessage Message, IPEndPoint EndPoint)> ReceiveMessageExAsync()
Expand Down