XR & Apple-Swift - disconnect/crash after connection

Hey

I’ve been converting objC example to swift one. But I hit a wall. I stripped down 99% of the code to barebone example here. It connects to steamVR, XR headset displays on icon as green, but 5 seconds in to the connection I get disconnected and then steam client crashes internally.

Can any1 shed some light on where we messed up the conversion ?

TIA

import Foundation
import UIKit

import ARKit
import MetalKit
import CoreGraphics


class xrView : UIViewController, ARSessionDelegate {
    var arTransform : simd_float4x4!;
    var mMetalDevice : MTLDevice?;
    var mMetalCommandQueue : MTLCommandQueue?;
    var mReceiver : cxrReceiverHandle?;
    var mDesc : cxrReceiverDesc!;
    var mArSession : ARSession!;

   
    override func viewDidLoad() {
        super.viewDidLoad()

        
        arTransform = simd_float4x4()
        //arTransform.columns.0.x=1.0;
        //arTransform.columns.1.y=1.0;
        //arTransform.columns.2.z=1.0;
        
        mMetalDevice  = MTLCreateSystemDefaultDevice()
        
        if var device = mMetalDevice {
            mArSession = ARSession();
            mArSession.delegate = self;
            mArSession.run(ARWorldTrackingConfiguration());

            
            device.makeCommandQueue()
            mMetalCommandQueue = device.makeCommandQueue()
                
            mDesc = cxrReceiverDesc();
            let major : UInt32 = 2
            let minor : UInt32 = 1
            let ver : UInt32 = (major << 16) | (minor);
            mDesc.requestedVersion = ver
            mDesc.deviceDesc.width = UInt32(self.view.bounds.size.width);
            mDesc.deviceDesc.height = UInt32(self.view.bounds.size.height);
            print("Width : \(mDesc.deviceDesc.width)")
            print("Height : \(mDesc.deviceDesc.height)")
            
            let aspect = Float(mDesc.deviceDesc.width) / Float(mDesc.deviceDesc.height);
            let fov : Float = 3.14159 * 0.5;
            let top : Float = tan(fov * 0.5);
            let bottom = -top;
            let left =  -(top * aspect);
            let right = -left;
            mDesc.deviceDesc.maxResFactor = 1.0;
            mDesc.deviceDesc.fps = 60.0;
            mDesc.deviceDesc.ipd = 0.062;
            mDesc.deviceDesc.proj.0.0 = left;
            mDesc.deviceDesc.proj.0.1 = right;
            mDesc.deviceDesc.proj.0.2 = bottom;
            mDesc.deviceDesc.proj.0.3 = top;
            mDesc.deviceDesc.proj.1.0 = left;
            mDesc.deviceDesc.proj.1.1 = right;
            mDesc.deviceDesc.proj.1.2 = bottom;
            mDesc.deviceDesc.proj.1.3 = top;
            
            mDesc.deviceDesc.predOffset = 0.1;
            mDesc.deviceDesc.audio = UInt8(0) ; //cxrFalse;
            mDesc.deviceDesc.embedInfoInVideo =  UInt8(0);//cxrFalse;
            mDesc.deviceDesc.disablePosePrediction =  UInt8(0);//cxrFalse;
            mDesc.deviceDesc.angularVelocityInDeviceSpace =  UInt8(0);//cxrFalse;
            mDesc.deviceDesc.foveatedScaleFactor = 100;
            mDesc.deviceDesc.posePollFreq = 0;
            mDesc.deviceDesc.ctrlType = cxrControllerType_HtcVive;
            mDesc.clientCallbacks.GetTrackingState = GetTrackingState;
            mDesc.clientCallbacks.TriggerHaptic = TriggerHaptic;
            mDesc.clientCallbacks.RenderAudio = RenderAudio;
            mDesc.clientCallbacks.ReceiveUserData = ReceiveUserData;
            mDesc.clientCallbacks.Disconnect = Disconnect;
            mDesc.clientContext = UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque()); // (__bridge void*)self;
            mDesc.shareContext = nil; //0
            mDesc.numStreams = 2;//(self.streamingXR) ? 2 : 1;
            mDesc.receiverMode = cxrStreamingMode_XR;//(self.streamingXR) ? cxrStreamingMode_XR : cxrStreamingMode_Generic;
            mDesc.debugFlags = 0;
            mDesc.logMaxSizeKB = 65536;
            mDesc.logMaxAgeDays = 30;
            
             var e : cxrError = cxrCreateReceiver(&mDesc, &mReceiver);
            print("Receiver After  : \(mReceiver)")

            if(e != cxrError_Success) {
                print("Receiver create failed with code \(e) [%s]", cxrErrorString(e));
            }
            e = cxrConnect(mReceiver, "192.168.0.33");
            
            if(e != cxrError_Success) {
                print("Receiver connect failed with code \(e) [%s]",  cxrErrorString(e));
            }
        }

        
    }
    func session(_ session: ARSession, didUpdate frame: ARFrame)
    {
        arTransform = frame.camera.transform;

    }

}

func GetTrackingState(context: UnsafeMutableRawPointer?, state : UnsafeMutablePointer<cxrVRTrackingState>?) {

    if let con = context {

        let controller = Unmanaged<xrView>.fromOpaque(context!).takeUnretainedValue()
                               
        if let st = state{
            var trackingState =     st.pointee
            
            memset(trackingState , 0, MemoryLayout<cxrVRTrackingState>.size);

            let transform : simd_float4x4 = controller.arTransform;
            var transposed : simd_float4x4 = simd_transpose(transform);

            //memcpy(&trackingState.hmd.pose.deviceToAbsoluteTracking.m.0, &transposed.columns.0, MemoryLayout<simd_float4>.stride * 4);
            //memcpy(&trackingState.hmd.pose.deviceToAbsoluteTracking.m.1, &transposed.columns.1, MemoryLayout<simd_float4>.stride * 4);
            //memcpy(&trackingState.hmd.pose.deviceToAbsoluteTracking.m.2, &transposed.columns.2, MemoryLayout<simd_float4>.stride * 4);
            trackingState.hmd.pose.deviceToAbsoluteTracking.m.0.0 = transposed.columns.0.x
            trackingState.hmd.pose.deviceToAbsoluteTracking.m.0.1 = transposed.columns.0.y
            trackingState.hmd.pose.deviceToAbsoluteTracking.m.0.2 = transposed.columns.0.z
            trackingState.hmd.pose.deviceToAbsoluteTracking.m.0.3 = transposed.columns.0.w
            
            trackingState.hmd.pose.deviceToAbsoluteTracking.m.1.0 = transposed.columns.1.x
            trackingState.hmd.pose.deviceToAbsoluteTracking.m.1.1 = transposed.columns.1.y
            trackingState.hmd.pose.deviceToAbsoluteTracking.m.1.2 = transposed.columns.1.z
            trackingState.hmd.pose.deviceToAbsoluteTracking.m.1.3 = transposed.columns.1.w
            
            trackingState.hmd.pose.deviceToAbsoluteTracking.m.2.0 = transposed.columns.2.x
            trackingState.hmd.pose.deviceToAbsoluteTracking.m.2.1 = transposed.columns.2.y
            trackingState.hmd.pose.deviceToAbsoluteTracking.m.2.2 = transposed.columns.2.z
            trackingState.hmd.pose.deviceToAbsoluteTracking.m.2.3 = transposed.columns.2.w
            trackingState.hmd.pose.deviceIsConnected = UInt8(1);
            trackingState.hmd.pose.trackingResult = cxrTrackingResult_Running_OK;
            trackingState.hmd.pose.poseIsValid = UInt8(1);
            trackingState.hmd.activityLevel = cxrDeviceActivityLevel_UserInteraction;
            trackingState.poseTimeOffset = 0.042;
        }
    }else{
    }

}
// A controller vibration must be started.
func TriggerHaptic(context : UnsafeMutableRawPointer?, haptic : UnsafePointer<cxrHapticFeedback>?) {
}

// An audio buffer is available for playback.
func RenderAudio(context : UnsafeMutableRawPointer?, audioFrame : UnsafePointer<cxrAudioFrame>?) {
}

func ReceiveUserData( context : UnsafeMutableRawPointer?, data: UnsafeRawPointer? , size: UInt32){

}
// The connection was lost or closed by the server
func Disconnect(context : UnsafeMutableRawPointer?, reason : cxrDisconnectReason) {
}