diff --git a/src/Audio/SourceVoice.cs b/src/Audio/SourceVoice.cs index 9950a28..b970051 100644 --- a/src/Audio/SourceVoice.cs +++ b/src/Audio/SourceVoice.cs @@ -139,6 +139,41 @@ namespace MoonWorks.Audio Submit(buffer.ToFAudioBuffer()); } + public unsafe void Apply3D(AudioListener listener, AudioEmitter emitter) + { + Is3D = true; + + emitter.emitterData.CurveDistanceScaler = Device.CurveDistanceScalar; + emitter.emitterData.ChannelCount = SourceChannelCount; + + var dspSettings = new FAudio.F3DAUDIO_DSP_SETTINGS + { + DopplerFactor = DopplerFactor, + SrcChannelCount = SourceChannelCount, + DstChannelCount = DestinationChannelCount, + pMatrixCoefficients = (nint) pMatrixCoefficients + }; + + FAudio.F3DAudioCalculate( + Device.Handle3D, + ref listener.listenerData, + ref emitter.emitterData, + FAudio.F3DAUDIO_CALCULATE_MATRIX | FAudio.F3DAUDIO_CALCULATE_DOPPLER, + ref dspSettings + ); + + UpdatePitch(); + + FAudio.FAudioVoice_SetOutputMatrix( + Handle, + OutputVoice.Handle, + SourceChannelCount, + DestinationChannelCount, + (nint) pMatrixCoefficients, + 0 + ); + } + /// /// Specifies that this source voice can be returned to the voice pool. /// Holding on to the reference after calling this will cause problems! diff --git a/src/Audio/Voice.cs b/src/Audio/Voice.cs index 771e5fa..cbf7243 100644 --- a/src/Audio/Voice.cs +++ b/src/Audio/Voice.cs @@ -12,10 +12,10 @@ namespace MoonWorks.Audio public uint SourceChannelCount { get; } public uint DestinationChannelCount { get; } - private SubmixVoice OutputVoice; + protected SubmixVoice OutputVoice; private ReverbEffect ReverbEffect; - byte* pMatrixCoefficients; + protected byte* pMatrixCoefficients; public bool Is3D { get; protected set; } @@ -447,7 +447,7 @@ namespace MoonWorks.Audio SetOutputVoice(Device.MasteringVoice); } - private void UpdatePitch() + protected void UpdatePitch() { float doppler; float dopplerScale = Device.DopplerScale;