aboutsummaryrefslogtreecommitdiffstats
path: root/Alc/ALc.c
diff options
context:
space:
mode:
Diffstat (limited to 'Alc/ALc.c')
-rw-r--r--Alc/ALc.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/Alc/ALc.c b/Alc/ALc.c
index 43f3cdc8..538ed4c3 100644
--- a/Alc/ALc.c
+++ b/Alc/ALc.c
@@ -1712,6 +1712,7 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList)
enum DevFmtType oldType;
ALCuint oldFreq;
FPUCtl oldMode;
+ size_t size;
// Check for attributes
if(device->Type == Loopback)
@@ -1885,6 +1886,9 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList)
if((device->Flags&DEVICE_RUNNING))
return ALC_NO_ERROR;
+ al_free(device->DryBuffer);
+ device->DryBuffer = NULL;
+
UpdateClockBase(device);
if(device->Type != Loopback)
@@ -1992,11 +1996,15 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList)
aluInitPanning(device);
- al_free(device->DryBuffer);
- device->DryBuffer = al_calloc(16, sizeof(device->DryBuffer[0]) * device->NumChannels);
+ /* With HRTF enabled, the channels are virtual and get positioned around
+ * the virtual listener. Two extra channels are allocated for the actual
+ * HRTF-filtered output.
+ */
+ size = sizeof(device->DryBuffer[0]) * (device->NumChannels + (device->Hrtf ? 2 : 0));
+ device->DryBuffer = al_calloc(16, size);
if(!device->DryBuffer)
{
- ERR("Failed to allocate "SZFMT" bytes for mix buffer\n", sizeof(device->DryBuffer[0]) * device->NumChannels);
+ ERR("Failed to allocate "SZFMT" bytes for mix buffer\n", size);
return ALC_INVALID_DEVICE;
}