public unsafe void Calculate(Listener listener, Emitter emitter, CalculateFlags flags, DspSettings *result) { Debug.Assert((flags & CalculateFlags.Delay) == 0 || (result->DelayTimesPointer != IntPtr.Zero), "When CalculateFlags.Delay is specified, DelayTimesPointer must point to float[DstChannelCount]"); Debug.Assert((flags & CalculateFlags.Matrix) == 0 || (result->MatrixCoefficientsPointer != IntPtr.Zero), "When CalculateFlags.Matrix is specified, MatrixCoefficientsPointer must point to float[SrcChannelCount*DstChannelCount]"); Cone emitterCone; Emitter.Native nativeEmitter = new Emitter.Native(); Cone listenerCone; Listener.Native nativeListener = new Listener.Native(); { if (emitter.Cone.HasValue) { emitterCone = emitter.Cone.Value; nativeEmitter.ConePointer = new IntPtr(&emitterCone); } else { nativeEmitter.ConePointer = IntPtr.Zero; } nativeEmitter.OrientFront = emitter.OrientFront; nativeEmitter.OrientTop = emitter.OrientTop; nativeEmitter.Position = emitter.Position; nativeEmitter.Velocity = emitter.Velocity; nativeEmitter.InnerRadius = emitter.InnerRadius; nativeEmitter.InnerRadiusAngle = emitter.InnerRadiusAngle; nativeEmitter.ChannelCount = emitter.ChannelCount; nativeEmitter.ChannelRadius = emitter.ChannelRadius; nativeEmitter.ChannelAzimuthsPointer = emitter.ChannelAzimuths.ToPointer(); nativeEmitter.VolumeCurvePointer = emitter.VolumeCurve.ToPointer(); nativeEmitter.LFECurvePointer = emitter.LFECurve.ToPointer(); nativeEmitter.LPFDirectCurvePointer = emitter.LPFDirectCurve.ToPointer(); nativeEmitter.LPFReverbCurvePointer = emitter.LPFReverbCurve.ToPointer(); nativeEmitter.ReverbCurvePointer = emitter.ReverbCurve.ToPointer(); nativeEmitter.CurveDistanceScaler = emitter.CurveDistanceScaler; nativeEmitter.DopplerScaler = emitter.DopplerScaler; if (listener.Cone.HasValue) { listenerCone = listener.Cone.Value; nativeListener.ConePointer = new IntPtr(&listenerCone); } else { nativeListener.ConePointer = IntPtr.Zero; } nativeListener.OrientFront = listener.OrientFront; nativeListener.OrientTop = listener.OrientTop; nativeListener.Position = listener.Position; nativeListener.Velocity = listener.Velocity; fixed(X3DAudioHandle *handle = &m_x3dAudioHandle) { X3DAudioCalculate_(handle, &nativeListener, &nativeEmitter, (int)flags, result); } } }
public unsafe void Calculate(Listener listener, Emitter emitter, CalculateFlags flags, DspSettings* result) { Debug.Assert((flags & CalculateFlags.Delay) == 0 || (result->DelayTimesPointer != IntPtr.Zero), "When CalculateFlags.Delay is specified, DelayTimesPointer must point to float[DstChannelCount]"); Debug.Assert((flags & CalculateFlags.Matrix) == 0 || (result->MatrixCoefficientsPointer != IntPtr.Zero), "When CalculateFlags.Matrix is specified, MatrixCoefficientsPointer must point to float[SrcChannelCount*DstChannelCount]"); Cone emitterCone; Emitter.Native nativeEmitter = new Emitter.Native(); Cone listenerCone; Listener.Native nativeListener = new Listener.Native(); { if (emitter.Cone.HasValue) { emitterCone = emitter.Cone.Value; nativeEmitter.ConePointer = new IntPtr(&emitterCone); } else { nativeEmitter.ConePointer = IntPtr.Zero; } nativeEmitter.OrientFront = emitter.OrientFront; nativeEmitter.OrientTop = emitter.OrientTop; nativeEmitter.Position = emitter.Position; nativeEmitter.Velocity = emitter.Velocity; nativeEmitter.InnerRadius = emitter.InnerRadius; nativeEmitter.InnerRadiusAngle = emitter.InnerRadiusAngle; nativeEmitter.ChannelCount = emitter.ChannelCount; nativeEmitter.ChannelRadius = emitter.ChannelRadius; nativeEmitter.ChannelAzimuthsPointer = emitter.ChannelAzimuths.ToPointer(); nativeEmitter.VolumeCurvePointer = emitter.VolumeCurve.ToPointer(); nativeEmitter.LFECurvePointer = emitter.LFECurve.ToPointer(); nativeEmitter.LPFDirectCurvePointer = emitter.LPFDirectCurve.ToPointer(); nativeEmitter.LPFReverbCurvePointer = emitter.LPFReverbCurve.ToPointer(); nativeEmitter.ReverbCurvePointer = emitter.ReverbCurve.ToPointer(); nativeEmitter.CurveDistanceScaler = emitter.CurveDistanceScaler; nativeEmitter.DopplerScaler = emitter.DopplerScaler; if (listener.Cone.HasValue) { listenerCone = listener.Cone.Value; nativeListener.ConePointer = new IntPtr(&listenerCone); } else { nativeListener.ConePointer = IntPtr.Zero; } nativeListener.OrientFront = listener.OrientFront; nativeListener.OrientTop = listener.OrientTop; nativeListener.Position = listener.Position; nativeListener.Velocity = listener.Velocity; fixed (X3DAudioHandle* handle = &m_x3dAudioHandle) { X3DAudioCalculate_(handle, &nativeListener, &nativeEmitter, (int)flags, result); } } }