Store the time precision with the device

This commit is contained in:
Chris Robinson 2010-07-25 12:54:50 -07:00
parent 40dd1fb853
commit 46d46c49a8
10 changed files with 24 additions and 2 deletions

View File

@ -1995,6 +1995,8 @@ ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *deviceName)
device->SamplesPlayed = 0; device->SamplesPlayed = 0;
device->TimeRes = 1;
InitUIntMap(&device->BufferMap); InitUIntMap(&device->BufferMap);
InitUIntMap(&device->EffectMap); InitUIntMap(&device->EffectMap);
InitUIntMap(&device->FilterMap); InitUIntMap(&device->FilterMap);

View File

@ -695,6 +695,9 @@ static ALCboolean alsa_reset_playback(ALCdevice *device)
psnd_pcm_sw_params_free(sp); psnd_pcm_sw_params_free(sp);
device->TimeRes = (ALuint64)periodSizeInFrames * 1000000000 / rate;
device->Frequency = rate;
SetDefaultChannelOrder(device); SetDefaultChannelOrder(device);
data->size = psnd_pcm_frames_to_bytes(data->pcmHandle, periodSizeInFrames); 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->UpdateSize = periodSizeInFrames;
device->NumUpdates = periods; device->NumUpdates = periods;
device->Frequency = rate;
data->thread = StartThread(ALSANoMMapProc, device); data->thread = StartThread(ALSANoMMapProc, device);
} }
else else
@ -724,7 +726,6 @@ static ALCboolean alsa_reset_playback(ALCdevice *device)
} }
device->UpdateSize = periodSizeInFrames; device->UpdateSize = periodSizeInFrames;
device->NumUpdates = periods; device->NumUpdates = periods;
device->Frequency = rate;
data->thread = StartThread(ALSAProc, device); data->thread = StartThread(ALSAProc, device);
} }
if(data->thread == NULL) if(data->thread == NULL)

View File

@ -461,6 +461,8 @@ static ALCboolean DSoundResetPlayback(ALCdevice *device)
if(SUCCEEDED(hr)) if(SUCCEEDED(hr))
{ {
device->TimeRes = (ALuint64)device->UpdateSize * 1000000000 /
device->Frequency;
device->Format = format; device->Format = format;
SetDefaultWFXChannelOrder(device); SetDefaultWFXChannelOrder(device);
pData->thread = StartThread(DSoundProc, device); pData->thread = StartThread(DSoundProc, device);

View File

@ -108,6 +108,9 @@ static ALCboolean null_reset_playback(ALCdevice *device)
} }
SetDefaultWFXChannelOrder(device); SetDefaultWFXChannelOrder(device);
device->TimeRes = (ALuint64)device->UpdateSize * 1000000000 /
device->Frequency;
data->thread = StartThread(NullProc, device); data->thread = StartThread(NullProc, device);
if(data->thread == NULL) if(data->thread == NULL)
{ {

View File

@ -268,6 +268,8 @@ static ALCboolean oss_reset_playback(ALCdevice *device)
device->Frequency = ossSpeed; device->Frequency = ossSpeed;
device->UpdateSize = info.fragsize / frameSize; device->UpdateSize = info.fragsize / frameSize;
device->NumUpdates = info.fragments + 1; device->NumUpdates = info.fragments + 1;
device->TimeRes = (ALuint64)device->UpdateSize * 1000000000 /
device->Frequency;
data->data_size = device->UpdateSize * frameSize; data->data_size = device->UpdateSize * frameSize;
data->mix_data = calloc(1, data->data_size); data->mix_data = calloc(1, data->data_size);

View File

@ -250,6 +250,8 @@ static ALCboolean pa_reset_playback(ALCdevice *device)
streamInfo = pPa_GetStreamInfo(data->stream); streamInfo = pPa_GetStreamInfo(data->stream);
device->Frequency = streamInfo->sampleRate; device->Frequency = streamInfo->sampleRate;
device->UpdateSize = data->update_size; device->UpdateSize = data->update_size;
device->TimeRes = (ALuint64)device->UpdateSize * 1000000000 /
device->Frequency;
err = pPa_StartStream(data->stream); err = pPa_StartStream(data->stream);
if(err != paNoError) if(err != paNoError)

View File

@ -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_moved_callback(data->stream, stream_device_callback, device);
ppa_stream_set_write_callback(data->stream, stream_write_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); data->thread = StartThread(PulseProc, device);
if(!data->thread) if(!data->thread)
{ {

View File

@ -193,6 +193,8 @@ static ALCboolean solaris_reset_playback(ALCdevice *device)
device->Frequency = info.play.sample_rate; device->Frequency = info.play.sample_rate;
device->UpdateSize = (info.play.buffer_size/device->NumUpdates) + 1; device->UpdateSize = (info.play.buffer_size/device->NumUpdates) + 1;
device->TimeRes = (ALuint64)device->UpdateSize * 1000000000 /
device->Frequency;
data->data_size = device->UpdateSize * frameSize; data->data_size = device->UpdateSize * frameSize;
data->mix_data = calloc(1, data->data_size); data->mix_data = calloc(1, data->data_size);

View File

@ -273,6 +273,8 @@ static ALCboolean wave_reset_playback(ALCdevice *device)
return ALC_FALSE; return ALC_FALSE;
} }
device->TimeRes = (ALuint64)device->UpdateSize * 1000000000 /
device->Frequency;
SetDefaultWFXChannelOrder(device); SetDefaultWFXChannelOrder(device);
data->thread = StartThread(WaveProc, device); data->thread = StartThread(WaveProc, device);

View File

@ -410,6 +410,9 @@ struct ALCdevice_struct
// Number of samples rendered by this device // Number of samples rendered by this device
ALuint64 SamplesPlayed; ALuint64 SamplesPlayed;
// Precision of this device's timing
ALuint64 TimeRes;
BackendFuncs *Funcs; BackendFuncs *Funcs;
void *ExtraData; // For the backend's use void *ExtraData; // For the backend's use