aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Alc/ALc.c9
-rw-r--r--Alc/ALu.c1
-rw-r--r--OpenAL32/Include/alMain.h3
3 files changed, 13 insertions, 0 deletions
diff --git a/Alc/ALc.c b/Alc/ALc.c
index 02e04e58..0cdb9da8 100644
--- a/Alc/ALc.c
+++ b/Alc/ALc.c
@@ -1453,6 +1453,7 @@ ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCin
{
ALCcontext *ALContext;
ALboolean running;
+ ALuint oldRate;
ALuint attrIdx;
void *temp;
ALuint i;
@@ -1467,6 +1468,7 @@ ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCin
}
running = ((device->NumContexts > 0) ? AL_TRUE : AL_FALSE);
+ oldRate = device->Frequency;
// Reset Context Last Error code
device->LastError = ALC_NO_ERROR;
@@ -1540,6 +1542,11 @@ ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCin
}
aluInitPanning(device);
+ // Scale the number of samples played according to the new sample rate
+ device->SamplesPlayed *= device->Frequency;
+ device->SamplesPlayed += oldRate-1;
+ device->SamplesPlayed /= oldRate;
+
for(i = 0;i < device->NumContexts;i++)
{
ALCcontext *context = device->Contexts[i];
@@ -1986,6 +1993,8 @@ ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *deviceName)
device->Contexts = NULL;
device->NumContexts = 0;
+ device->SamplesPlayed = 0;
+
InitUIntMap(&device->BufferMap);
InitUIntMap(&device->EffectMap);
InitUIntMap(&device->FilterMap);
diff --git a/Alc/ALu.c b/Alc/ALu.c
index d92f8311..b276982a 100644
--- a/Alc/ALu.c
+++ b/Alc/ALu.c
@@ -1474,6 +1474,7 @@ ALvoid aluMixData(ALCdevice *device, ALvoid *buffer, ALsizei size)
}
ProcessContext(ALContext);
}
+ device->SamplesPlayed += SamplesToDo;
ProcessContext(NULL);
//Post processing loop
diff --git a/OpenAL32/Include/alMain.h b/OpenAL32/Include/alMain.h
index d6fc5c15..d9c369ef 100644
--- a/OpenAL32/Include/alMain.h
+++ b/OpenAL32/Include/alMain.h
@@ -405,6 +405,9 @@ struct ALCdevice_struct
ALCcontext **Contexts;
ALuint NumContexts;
+ // Number of samples rendered by this device
+ ALuint64 SamplesPlayed;
+
BackendFuncs *Funcs;
void *ExtraData; // For the backend's use