Fix playing 6-channel audio with XAudio2 backend

This commit is contained in:
Wojtek Figat
2024-05-08 10:20:04 +02:00
parent a11fa46ee2
commit e51d2dda00
3 changed files with 7 additions and 17 deletions

View File

@@ -160,18 +160,8 @@ public:
break; break;
case 2: case 2:
default: // TODO: implement multi-channel support (eg. 5.1, 7.1) default: // TODO: implement multi-channel support (eg. 5.1, 7.1)
if (sourceChannels == 1) outputMatrix[0] = channels[FrontLeft];
{ outputMatrix[sourceChannels + 1] = channels[FrontRight];
outputMatrix[0] = channels[FrontLeft];
outputMatrix[1] = channels[FrontRight];
}
else if (sourceChannels == 2)
{
outputMatrix[0] = channels[FrontLeft];
outputMatrix[1] = 0.0f;
outputMatrix[2] = 0.0f;
outputMatrix[3] = channels[FrontRight];
}
break; break;
} }
} }

View File

@@ -498,7 +498,7 @@ void AudioBackendOAL::Buffer_Write(uint32 bufferID, byte* samples, const AudioDa
} }
else else
{ {
LOG(Warning, "OpenAL doesn't support bit depth larger than 16. Your audio data will be truncated."); LOG(Warning, "OpenAL doesn't support bit depth larger than 16. Audio data will be truncated.");
const uint32 bufferSize = info.NumSamples * 2; const uint32 bufferSize = info.NumSamples * 2;
byte* sampleBuffer16 = (byte*)Allocator::Allocate(bufferSize); byte* sampleBuffer16 = (byte*)Allocator::Allocate(bufferSize);
AudioTool::ConvertBitDepth(samples, info.BitDepth, sampleBuffer16, 16, info.NumSamples); AudioTool::ConvertBitDepth(samples, info.BitDepth, sampleBuffer16, 16, info.NumSamples);

View File

@@ -19,11 +19,9 @@
// Include XAudio library // Include XAudio library
// Documentation: https://docs.microsoft.com/en-us/windows/desktop/xaudio2/xaudio2-apis-portal // Documentation: https://docs.microsoft.com/en-us/windows/desktop/xaudio2/xaudio2-apis-portal
#include <xaudio2.h> #include <xaudio2.h>
//#include <xaudio2fx.h>
//#include <x3daudio.h>
// TODO: implement multi-channel support (eg. 5.1, 7.1) // TODO: implement multi-channel support (eg. 5.1, 7.1)
#define MAX_INPUT_CHANNELS 2 #define MAX_INPUT_CHANNELS 6
#define MAX_OUTPUT_CHANNELS 2 #define MAX_OUTPUT_CHANNELS 2
#define MAX_CHANNELS_MATRIX_SIZE (MAX_INPUT_CHANNELS*MAX_OUTPUT_CHANNELS) #define MAX_CHANNELS_MATRIX_SIZE (MAX_INPUT_CHANNELS*MAX_OUTPUT_CHANNELS)
#if ENABLE_ASSERTION #if ENABLE_ASSERTION
@@ -151,6 +149,7 @@ namespace XAudio2
IXAudio2* Instance = nullptr; IXAudio2* Instance = nullptr;
IXAudio2MasteringVoice* MasteringVoice = nullptr; IXAudio2MasteringVoice* MasteringVoice = nullptr;
int32 Channels; int32 Channels;
DWORD ChannelMask;
bool ForceDirty = true; bool ForceDirty = true;
AudioBackendTools::Settings Settings; AudioBackendTools::Settings Settings;
Listener Listener; Listener Listener;
@@ -683,7 +682,7 @@ bool AudioBackendXAudio2::Base_Init()
} }
XAUDIO2_VOICE_DETAILS details; XAUDIO2_VOICE_DETAILS details;
XAudio2::MasteringVoice->GetVoiceDetails(&details); XAudio2::MasteringVoice->GetVoiceDetails(&details);
#if 0 #if MAX_OUTPUT_CHANNELS > 2
// TODO: implement multi-channel support (eg. 5.1, 7.1) // TODO: implement multi-channel support (eg. 5.1, 7.1)
XAudio2::Channels = details.InputChannels; XAudio2::Channels = details.InputChannels;
hr = XAudio2::MasteringVoice->GetChannelMask(&XAudio2::ChannelMask); hr = XAudio2::MasteringVoice->GetChannelMask(&XAudio2::ChannelMask);
@@ -694,6 +693,7 @@ bool AudioBackendXAudio2::Base_Init()
} }
#else #else
XAudio2::Channels = 2; XAudio2::Channels = 2;
XAudio2::ChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT;
#endif #endif
LOG(Info, "XAudio2: {0} channels at {1} kHz", XAudio2::Channels, details.InputSampleRate / 1000.0f); LOG(Info, "XAudio2: {0} channels at {1} kHz", XAudio2::Channels, details.InputSampleRate / 1000.0f);