fix effect chains making sounds mono

main
cosmonaut 2021-11-09 15:32:22 -08:00
parent 22d759ea11
commit 0e04346b8c
1 changed files with 63 additions and 56 deletions

View File

@ -506,6 +506,57 @@ void FAudioGMS_Init(double spatialDistanceScale, double timestep)
fflush(stdout); fflush(stdout);
} }
double FAudioGMS_StaticSound_LoadWAV(char *filePath)
{
RETURN_ON_NULL_DEVICE(-1.0)
drwav_uint64 frameCount;
FAudioGMS_StaticSound *sound = SDL_malloc(sizeof(FAudioGMS_StaticSound));
float *pSampleData = drwav_open_file_and_read_pcm_frames_f32(
filePath,
&sound->channels,
&sound->samplesPerSecond,
&frameCount,
NULL);
if (pSampleData == NULL)
{
Log("Error opening WAV file: ");
Log(filePath);
SDL_free(sound);
return -1;
}
sound->buffer.AudioBytes = (uint32_t)(frameCount * sound->channels * sizeof(float));
sound->buffer.Flags = 0;
sound->buffer.LoopBegin = 0;
sound->buffer.LoopCount = 0;
sound->buffer.LoopLength = 0;
sound->buffer.PlayBegin = 0;
sound->buffer.PlayLength = frameCount;
sound->buffer.pAudioData = (uint8_t *)pSampleData;
sound->buffer.pContext = NULL;
sound->lengthInSeconds = frameCount / sound->samplesPerSecond;
if (device->staticSoundIndexStack.count > 0)
{
sound->id = IdStack_Pop(&device->staticSoundIndexStack);
}
else
{
sound->id = device->staticSoundCount;
device->staticSounds = SDL_realloc(
device->staticSounds,
(device->staticSoundCount + 1) * sizeof(FAudioGMS_StaticSound *));
device->staticSoundCount += 1;
}
device->staticSounds[sound->id] = sound;
return (double)sound->id;
}
/* Taken from /* Taken from
* https://github.com/FNA-XNA/FNA/blob/master/src/Audio/SoundEffectInstance.cs * https://github.com/FNA-XNA/FNA/blob/master/src/Audio/SoundEffectInstance.cs
*/ */
@ -563,61 +614,8 @@ static void SetPanMatrixCoefficients(FAudioGMS_SoundInstance *instance)
} }
} }
double FAudioGMS_StaticSound_LoadWAV(char *filePath) static void FAudioGMS_INTERNAl_SoundInstance_ApplyPan(FAudioGMS_SoundInstance* instance)
{ {
RETURN_ON_NULL_DEVICE(-1.0)
drwav_uint64 frameCount;
FAudioGMS_StaticSound *sound = SDL_malloc(sizeof(FAudioGMS_StaticSound));
float *pSampleData = drwav_open_file_and_read_pcm_frames_f32(
filePath,
&sound->channels,
&sound->samplesPerSecond,
&frameCount,
NULL);
if (pSampleData == NULL)
{
Log("Error opening WAV file: ");
Log(filePath);
SDL_free(sound);
return -1;
}
sound->buffer.AudioBytes = (uint32_t)(frameCount * sound->channels * sizeof(float));
sound->buffer.Flags = 0;
sound->buffer.LoopBegin = 0;
sound->buffer.LoopCount = 0;
sound->buffer.LoopLength = 0;
sound->buffer.PlayBegin = 0;
sound->buffer.PlayLength = frameCount;
sound->buffer.pAudioData = (uint8_t *)pSampleData;
sound->buffer.pContext = NULL;
sound->lengthInSeconds = frameCount / sound->samplesPerSecond;
if (device->staticSoundIndexStack.count > 0)
{
sound->id = IdStack_Pop(&device->staticSoundIndexStack);
}
else
{
sound->id = device->staticSoundCount;
device->staticSounds = SDL_realloc(
device->staticSounds,
(device->staticSoundCount + 1) * sizeof(FAudioGMS_StaticSound *));
device->staticSoundCount += 1;
}
device->staticSounds[sound->id] = sound;
return (double)sound->id;
}
static void FAudioGMS_INTERNAL_SoundInstance_SetPan(FAudioGMS_SoundInstance *instance, float pan)
{
pan = SDL_max(-1.0, SDL_min(1.0, pan));
instance->pan = pan;
SetPanMatrixCoefficients(instance); SetPanMatrixCoefficients(instance);
FAudioVoice_SetOutputMatrix( FAudioVoice_SetOutputMatrix(
@ -629,6 +627,13 @@ static void FAudioGMS_INTERNAL_SoundInstance_SetPan(FAudioGMS_SoundInstance *ins
0); 0);
} }
static void FAudioGMS_INTERNAL_SoundInstance_SetPan(FAudioGMS_SoundInstance *instance, float pan)
{
pan = SDL_max(-1.0, SDL_min(1.0, pan));
instance->pan = pan;
FAudioGMS_INTERNAl_SoundInstance_ApplyPan(instance);
}
static void FAudioGMS_INTERNAL_SoundInstance_UpdatePitch(FAudioGMS_SoundInstance *instance) static void FAudioGMS_INTERNAL_SoundInstance_UpdatePitch(FAudioGMS_SoundInstance *instance)
{ {
float doppler = 1.0f; float doppler = 1.0f;
@ -1750,7 +1755,7 @@ static void FAudioGMS_INTERNAL_Voice_SetEffectGain(FAudioGMS_Voice *voice, float
float *outputMatrix = SDL_stack_alloc(float, voice->effectSends.SendCount); float *outputMatrix = SDL_stack_alloc(float, voice->effectSends.SendCount);
outputMatrix[0] = effectGain; outputMatrix[0] = effectGain;
if (voice->effectSends.SendCount == 2) if (voice->handle->outputChannels == 2)
{ {
outputMatrix[1] = effectGain; outputMatrix[1] = effectGain;
} }
@ -1758,7 +1763,7 @@ static void FAudioGMS_INTERNAL_Voice_SetEffectGain(FAudioGMS_Voice *voice, float
FAudioVoice_SetOutputMatrix( FAudioVoice_SetOutputMatrix(
voice->handle, voice->handle,
voice->effectVoice, voice->effectVoice,
voice->effectSends.SendCount, voice->handle->outputChannels,
1, 1,
outputMatrix, outputMatrix,
0); 0);
@ -1926,6 +1931,8 @@ void FAudioGMS_SoundInstance_SetEffectChain(
if (instance != NULL && effectChain != NULL) if (instance != NULL && effectChain != NULL)
{ {
FAudioGMS_INTERNAL_SetEffectChain(&instance->voice, effectChain, effectGain); FAudioGMS_INTERNAL_SetEffectChain(&instance->voice, effectChain, effectGain);
/* re-apply pan after setting chain because sends may have changed */
FAudioGMS_INTERNAl_SoundInstance_ApplyPan(instance);
} }
} }