diff --git a/VRCFaceTracking.Core/OSC/OSCMessage.cs b/VRCFaceTracking.Core/OSC/OSCMessage.cs index 92c2f47c..70753fd9 100644 --- a/VRCFaceTracking.Core/OSC/OSCMessage.cs +++ b/VRCFaceTracking.Core/OSC/OSCMessage.cs @@ -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(_metaPtr); + //var meta1 = Marshal.PtrToStructure(_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); + } /// /// Encodes stored osc meta into raw bytes using fti_osc lib diff --git a/VRCFaceTracking.Core/Services/OscRecvService.cs b/VRCFaceTracking.Core/Services/OscRecvService.cs index 48a6a256..8fbdcfde 100644 --- a/VRCFaceTracking.Core/Services/OscRecvService.cs +++ b/VRCFaceTracking.Core/Services/OscRecvService.cs @@ -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; @@ -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); } } } \ No newline at end of file