c++audioxaudio2

Integrating X3Daudio with XAudio2


I am currently struggling with implementing 3D positional sound with XAudio2 library. I somehow managed to got it working when listener's and source's position are exactly 0.0f on all axis. When I move listener or source even a little bit, sound is no longer heard but is still playing. What am I missing here? Thanks :)

uint32_t sourceInputChannels = 2;
uint32_t masterInputChannels = 8;

float* outputMatrix = new float[masterInputChannels * sourceInputChannels];

// Listener
X3DAUDIO_LISTENER listener{};
listener.Position = { 0.0f, 0.0f, 0.0f };
listener.Velocity = { 0.0f, 0.0f, 0.0f };
listener.OrientFront = { 1.0f, 0.0f, 0.0f };
listener.OrientTop = { 0.0f, 0.0f, 1.0f };

// Emitter
X3DAUDIO_EMITTER sourceEmitter{};
sourceEmitter.ChannelCount = 1;
sourceEmitter.CurveDistanceScaler = FLT_MIN;
sourceEmitter.Position = { 0.0f, 0.0f, 0.0f };
sourceEmitter.Velocity = { 0.0f, 0.0f, 0.0f };
sourceEmitter.OrientFront = { 1.0f, 0.0f, 0.0f };
sourceEmitter.OrientTop = { 0.0f, 0.0f, 1.0f };
sourceEmitter.ChannelRadius = 2.0f;
sourceEmitter.InnerRadius = 2.0f;
sourceEmitter.InnerRadiusAngle = X3DAUDIO_PI / 4.0f;

X3DAUDIO_DSP_SETTINGS dspSettings{};
dspSettings.SrcChannelCount = sourceEmitter.ChannelCount; // 1

// 8 * 2, OUTPUT_CHANNELS is also present in CreateMasteringVoice
dspSettings.DstChannelCount = OUTPUT_CHANNELS * sourceVoiceDetails.InputChannels; 
dspSettings.pMatrixCoefficients = outputMatrix;

// Calculating
X3DAudioCalculate(g_CealContext->X3DInstance, &listener, &sourceEmitter, X3DAUDIO_CALCULATE_MATRIX | 
                X3DAUDIO_CALCULATE_DOPPLER | X3DAUDIO_CALCULATE_LPF_DIRECT | X3DAUDIO_CALCULATE_REVERB, &dspSettings);

sourceVoice->SetOutputMatrix(g_CealContext->XMasterVoice, sourceInputChannels, masterInputChannels, outputMatrix);
delete[] outputMatrix;

Solution

  • Okay, thanks to @chuck-walbourn I managed to get it working.
    The problem was that X3DAUDIO_EMITTER's member CurveDistanceScaler was set to FLT_MIN instead of some not-so-small value.
    Weird thing is I was following official Microsoft documention How to integrate X3DAudio with XAudio2 and the example code uses FLT_MIN, so I do not really understand what is going on.