diff --git a/Alc/ALc.c b/Alc/ALc.c index 93ee4b7..30fe037 100644 --- a/Alc/ALc.c +++ b/Alc/ALc.c @@ -1995,6 +1995,8 @@ ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *deviceName) device->SamplesPlayed = 0; + device->TimeRes = 1; + InitUIntMap(&device->BufferMap); InitUIntMap(&device->EffectMap); InitUIntMap(&device->FilterMap); diff --git a/Alc/alsa.c b/Alc/alsa.c index 80825b0..4d1d58b 100644 --- a/Alc/alsa.c +++ b/Alc/alsa.c @@ -695,6 +695,9 @@ static ALCboolean alsa_reset_playback(ALCdevice *device) psnd_pcm_sw_params_free(sp); + device->TimeRes = (ALuint64)periodSizeInFrames * 1000000000 / rate; + device->Frequency = rate; + SetDefaultChannelOrder(device); data->size = psnd_pcm_frames_to_bytes(data->pcmHandle, periodSizeInFrames); @@ -711,7 +714,6 @@ static ALCboolean alsa_reset_playback(ALCdevice *device) } device->UpdateSize = periodSizeInFrames; device->NumUpdates = periods; - device->Frequency = rate; data->thread = StartThread(ALSANoMMapProc, device); } else @@ -724,7 +726,6 @@ static ALCboolean alsa_reset_playback(ALCdevice *device) } device->UpdateSize = periodSizeInFrames; device->NumUpdates = periods; - device->Frequency = rate; data->thread = StartThread(ALSAProc, device); } if(data->thread == NULL) diff --git a/Alc/dsound.c b/Alc/dsound.c index f636287..f513f2e 100644 --- a/Alc/dsound.c +++ b/Alc/dsound.c @@ -461,6 +461,8 @@ static ALCboolean DSoundResetPlayback(ALCdevice *device) if(SUCCEEDED(hr)) { + device->TimeRes = (ALuint64)device->UpdateSize * 1000000000 / + device->Frequency; device->Format = format; SetDefaultWFXChannelOrder(device); pData->thread = StartThread(DSoundProc, device); diff --git a/Alc/null.c b/Alc/null.c index be760e7..43a1062 100644 --- a/Alc/null.c +++ b/Alc/null.c @@ -108,6 +108,9 @@ static ALCboolean null_reset_playback(ALCdevice *device) } SetDefaultWFXChannelOrder(device); + device->TimeRes = (ALuint64)device->UpdateSize * 1000000000 / + device->Frequency; + data->thread = StartThread(NullProc, device); if(data->thread == NULL) { diff --git a/Alc/oss.c b/Alc/oss.c index 9f3e5ae..8fda248 100644 --- a/Alc/oss.c +++ b/Alc/oss.c @@ -268,6 +268,8 @@ static ALCboolean oss_reset_playback(ALCdevice *device) device->Frequency = ossSpeed; device->UpdateSize = info.fragsize / frameSize; device->NumUpdates = info.fragments + 1; + device->TimeRes = (ALuint64)device->UpdateSize * 1000000000 / + device->Frequency; data->data_size = device->UpdateSize * frameSize; data->mix_data = calloc(1, data->data_size); diff --git a/Alc/portaudio.c b/Alc/portaudio.c index 94eca19..062c403 100644 --- a/Alc/portaudio.c +++ b/Alc/portaudio.c @@ -250,6 +250,8 @@ static ALCboolean pa_reset_playback(ALCdevice *device) streamInfo = pPa_GetStreamInfo(data->stream); device->Frequency = streamInfo->sampleRate; device->UpdateSize = data->update_size; + device->TimeRes = (ALuint64)device->UpdateSize * 1000000000 / + device->Frequency; err = pPa_StartStream(data->stream); if(err != paNoError) diff --git a/Alc/pulseaudio.c b/Alc/pulseaudio.c index 2769fcd..9355cc3 100644 --- a/Alc/pulseaudio.c +++ b/Alc/pulseaudio.c @@ -938,6 +938,9 @@ static ALCboolean pulse_reset_playback(ALCdevice *device) //{{{ ppa_stream_set_moved_callback(data->stream, stream_device_callback, device); ppa_stream_set_write_callback(data->stream, stream_write_callback, device); + device->TimeRes = (ALuint64)device->UpdateSize * 1000000000 / + device->Frequency; + data->thread = StartThread(PulseProc, device); if(!data->thread) { diff --git a/Alc/solaris.c b/Alc/solaris.c index cff744a..4fbb194 100644 --- a/Alc/solaris.c +++ b/Alc/solaris.c @@ -193,6 +193,8 @@ static ALCboolean solaris_reset_playback(ALCdevice *device) device->Frequency = info.play.sample_rate; device->UpdateSize = (info.play.buffer_size/device->NumUpdates) + 1; + device->TimeRes = (ALuint64)device->UpdateSize * 1000000000 / + device->Frequency; data->data_size = device->UpdateSize * frameSize; data->mix_data = calloc(1, data->data_size); diff --git a/Alc/wave.c b/Alc/wave.c index 61a9357..1b6a41d 100644 --- a/Alc/wave.c +++ b/Alc/wave.c @@ -273,6 +273,8 @@ static ALCboolean wave_reset_playback(ALCdevice *device) return ALC_FALSE; } + device->TimeRes = (ALuint64)device->UpdateSize * 1000000000 / + device->Frequency; SetDefaultWFXChannelOrder(device); data->thread = StartThread(WaveProc, device); diff --git a/OpenAL32/Include/alMain.h b/OpenAL32/Include/alMain.h index 5791b33..4957b94 100644 --- a/OpenAL32/Include/alMain.h +++ b/OpenAL32/Include/alMain.h @@ -410,6 +410,9 @@ struct ALCdevice_struct // Number of samples rendered by this device ALuint64 SamplesPlayed; + // Precision of this device's timing + ALuint64 TimeRes; + BackendFuncs *Funcs; void *ExtraData; // For the backend's use