Skip to content
Draft
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
13 changes: 12 additions & 1 deletion VRCFaceTracking.Core/OSC/OSCMessage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -98,9 +98,20 @@ public OscMessage(byte[] bytes, int len, ref int messageIndex)
_metaPtr = fti_osc.parse_osc(bytes, len, ref messageIndex);
if (_metaPtr != IntPtr.Zero)
{
_meta = Marshal.PtrToStructure<OscMessageMeta>(_metaPtr);
//var meta1 = Marshal.PtrToStructure<OscMessageMeta>(_metaPtr);
ParseToOscMessageMeta(_metaPtr);
}
}
private void ParseToOscMessageMeta(IntPtr ptr)
{
_meta.Address = Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(ptr));
ptr += IntPtr.Size;

_meta.ValueLength = Marshal.ReadInt32(ptr);
ptr += IntPtr.Size;

_meta.Value = Marshal.ReadIntPtr(ptr);
}

/// <summary>
/// Encodes stored osc meta into raw bytes using fti_osc lib
Expand Down
41 changes: 23 additions & 18 deletions VRCFaceTracking.Core/Services/OscRecvService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public class OscRecvService : BackgroundService
private readonly ILocalSettingsService _settingsService;

private Socket _recvSocket;
private readonly byte[] _recvBuffer = new byte[4096];
private readonly byte[] _recvBuffer = new byte[64];

private CancellationTokenSource _cts, _linkedToken;
private CancellationToken _stoppingToken;
Expand Down Expand Up @@ -108,29 +108,34 @@ protected async override Task ExecuteAsync(CancellationToken stoppingToken)
continue;
}

try
if (_recvSocket.Available > 0)
{
var bytesReceived = await _recvSocket.ReceiveAsync(_recvBuffer, _linkedToken.Token);
var offset = 0;
var newMsg = await Task.Run(() => OscMessage.TryParseOsc(_recvBuffer, bytesReceived, ref offset), stoppingToken);
if (newMsg == null)
try
{
continue;
}
var bytesReceived = await _recvSocket.ReceiveAsync(_recvBuffer, SocketFlags.None, _linkedToken.Token);
var offset = 0;
var newMsg = OscMessage.TryParseOsc(_recvBuffer, bytesReceived, ref offset);
if (newMsg == null)
{
continue;
}

OnMessageReceived(newMsg);
}
catch (Exception e)
{
// We don't care about operation cancellations as they're intentional and carefully controlled
if (e.GetType() == typeof(OperationCanceledException))
OnMessageReceived(newMsg);
}
catch (Exception e)
{
continue;
// We don't care about operation cancellations as they're intentional and carefully controlled
if (e.GetType() == typeof(OperationCanceledException))
{
continue;
}

_logger.LogError("Error encountered in OSC Receive thread: {e}", e);
SentrySdk.CaptureException(e, scope => scope.SetExtra("recvBuffer", _recvBuffer));
}

_logger.LogError("Error encountered in OSC Receive thread: {e}", e);
SentrySdk.CaptureException(e, scope => scope.SetExtra("recvBuffer", _recvBuffer));
}
else
await Task.Delay(100, _linkedToken.Token);
}
}
}