From 7bf64eaee0788b7eb64c7410384a9ee66f75c4ce Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Thu, 19 May 2016 20:50:55 -0700 Subject: Make the source position calues atomic --- Alc/ALu.c | 4 ++-- Alc/mixer.c | 14 +++++++------- OpenAL32/Include/alSource.h | 4 ++-- OpenAL32/alSource.c | 39 ++++++++++++++++++++------------------- 4 files changed, 31 insertions(+), 30 deletions(-) diff --git a/Alc/ALu.c b/Alc/ALu.c index 44361979..ec0dd011 100644 --- a/Alc/ALu.c +++ b/Alc/ALu.c @@ -1619,8 +1619,8 @@ ALvoid aluHandleDisconnect(ALCdevice *device) { source->state = AL_STOPPED; ATOMIC_STORE(&source->current_buffer, NULL); - source->position = 0; - source->position_fraction = 0; + ATOMIC_STORE(&source->position, 0); + ATOMIC_STORE(&source->position_fraction, 0); } voice++; diff --git a/Alc/mixer.c b/Alc/mixer.c index 38ec295c..1ee422be 100644 --- a/Alc/mixer.c +++ b/Alc/mixer.c @@ -384,10 +384,10 @@ ALvoid MixSource(ALvoice *voice, ALsource *Source, ALCdevice *Device, ALuint Sam ALuint chan, j; /* Get source info */ - State = Source->state; + State = AL_PLAYING; /* Only called while playing. */ BufferListItem = ATOMIC_LOAD(&Source->current_buffer); - DataPosInt = Source->position; - DataPosFrac = Source->position_fraction; + DataPosInt = ATOMIC_LOAD(&Source->position, almemory_order_relaxed); + DataPosFrac = ATOMIC_LOAD(&Source->position_fraction, almemory_order_relaxed); NumChannels = Source->NumChannels; SampleSize = Source->SampleSize; Looping = voice->Looping; @@ -752,8 +752,8 @@ ALvoid MixSource(ALvoice *voice, ALsource *Source, ALCdevice *Device, ALuint Sam voice->Moving = AL_TRUE; /* Update source info */ - Source->state = State; - ATOMIC_STORE(&Source->current_buffer, BufferListItem); - Source->position = DataPosInt; - Source->position_fraction = DataPosFrac; + Source->state = State; + ATOMIC_STORE(&Source->current_buffer, BufferListItem, almemory_order_relaxed); + ATOMIC_STORE(&Source->position, DataPosInt, almemory_order_relaxed); + ATOMIC_STORE(&Source->position_fraction, DataPosFrac); } diff --git a/OpenAL32/Include/alSource.h b/OpenAL32/Include/alSource.h index fbd63ce2..bb1e6434 100644 --- a/OpenAL32/Include/alSource.h +++ b/OpenAL32/Include/alSource.h @@ -172,8 +172,8 @@ typedef struct ALsource { * the whole queue, and the fractional (fixed-point) offset to the next * sample. */ - ALuint position; - ALuint position_fraction; + ATOMIC(ALuint) position; + ATOMIC(ALuint) position_fraction; /** Source Buffer Queue info. */ ATOMIC(ALbufferlistitem*) queue; diff --git a/OpenAL32/alSource.c b/OpenAL32/alSource.c index 780e9061..a0e40c1d 100644 --- a/OpenAL32/alSource.c +++ b/OpenAL32/alSource.c @@ -2904,8 +2904,8 @@ ALvoid SetSourceState(ALsource *Source, ALCcontext *Context, ALenum state) if(Source->state != AL_PAUSED) { Source->state = AL_PLAYING; - Source->position = 0; - Source->position_fraction = 0; + ATOMIC_STORE(&Source->position, 0, almemory_order_relaxed); + ATOMIC_STORE(&Source->position_fraction, 0, almemory_order_relaxed); ATOMIC_STORE(&Source->current_buffer, BufferList); discontinuity = AL_TRUE; } @@ -2991,8 +2991,8 @@ ALvoid SetSourceState(ALsource *Source, ALCcontext *Context, ALenum state) if(Source->state != AL_INITIAL) { Source->state = AL_INITIAL; - Source->position = 0; - Source->position_fraction = 0; + ATOMIC_STORE(&Source->position, 0, almemory_order_relaxed); + ATOMIC_STORE(&Source->position_fraction, 0, almemory_order_relaxed); ATOMIC_STORE(&Source->current_buffer, ATOMIC_LOAD(&Source->queue)); } Source->OffsetType = AL_NONE; @@ -3022,10 +3022,11 @@ ALint64 GetSourceSampleOffset(ALsource *Source) /* NOTE: This is the offset into the *current* buffer, so add the length of * any played buffers */ - readPos = (ALuint64)Source->position << 32; - readPos |= (ALuint64)Source->position_fraction << (32-FRACTIONBITS); - BufferList = ATOMIC_LOAD(&Source->queue); - Current = ATOMIC_LOAD(&Source->current_buffer); + readPos = (ALuint64)ATOMIC_LOAD(&Source->position) << 32; + readPos |= (ALuint64)ATOMIC_LOAD(&Source->position_fraction, almemory_order_relaxed) << + (32-FRACTIONBITS); + BufferList = ATOMIC_LOAD(&Source->queue, almemory_order_relaxed); + Current = ATOMIC_LOAD(&Source->current_buffer, almemory_order_relaxed); while(BufferList && BufferList != Current) { if(BufferList->buffer) @@ -3058,10 +3059,10 @@ static ALdouble GetSourceSecOffset(ALsource *Source) /* NOTE: This is the offset into the *current* buffer, so add the length of * any played buffers */ - readPos = (ALuint64)Source->position << FRACTIONBITS; - readPos |= (ALuint64)Source->position_fraction; - BufferList = ATOMIC_LOAD(&Source->queue); - Current = ATOMIC_LOAD(&Source->current_buffer); + readPos = (ALuint64)ATOMIC_LOAD(&Source->position) << FRACTIONBITS; + readPos |= (ALuint64)ATOMIC_LOAD(&Source->position_fraction, almemory_order_relaxed); + BufferList = ATOMIC_LOAD(&Source->queue, almemory_order_relaxed); + Current = ATOMIC_LOAD(&Source->current_buffer, almemory_order_relaxed); while(BufferList && BufferList != Current) { const ALbuffer *buffer = BufferList->buffer; @@ -3110,10 +3111,10 @@ static ALdouble GetSourceOffset(ALsource *Source, ALenum name) /* NOTE: This is the offset into the *current* buffer, so add the length of * any played buffers */ totalBufferLen = 0; - readPos = Source->position; - readPosFrac = Source->position_fraction; - BufferList = ATOMIC_LOAD(&Source->queue); - Current = ATOMIC_LOAD(&Source->current_buffer); + readPos = ATOMIC_LOAD(&Source->position); + readPosFrac = ATOMIC_LOAD(&Source->position_fraction, almemory_order_relaxed); + BufferList = ATOMIC_LOAD(&Source->queue, almemory_order_relaxed); + Current = ATOMIC_LOAD(&Source->current_buffer, almemory_order_relaxed); while(BufferList != NULL) { const ALbuffer *buffer; @@ -3205,10 +3206,10 @@ ALboolean ApplyOffset(ALsource *Source) if(bufferLen > offset-totalBufferLen) { /* Offset is in this buffer */ - ATOMIC_STORE(&Source->current_buffer, BufferList); + ATOMIC_STORE(&Source->current_buffer, BufferList, almemory_order_relaxed); - Source->position = offset - totalBufferLen; - Source->position_fraction = frac; + ATOMIC_STORE(&Source->position, offset - totalBufferLen, almemory_order_relaxed); + ATOMIC_STORE(&Source->position_fraction, frac); return AL_TRUE; } -- cgit v1.2.3