aboutsummaryrefslogtreecommitdiffstats
path: root/OpenAL32
diff options
context:
space:
mode:
Diffstat (limited to 'OpenAL32')
-rw-r--r--OpenAL32/Include/alSource.h2
-rw-r--r--OpenAL32/alSource.c55
2 files changed, 30 insertions, 27 deletions
diff --git a/OpenAL32/Include/alSource.h b/OpenAL32/Include/alSource.h
index b288937a..d5eb3c50 100644
--- a/OpenAL32/Include/alSource.h
+++ b/OpenAL32/Include/alSource.h
@@ -78,7 +78,7 @@ struct ALsourceProps {
typedef struct ALvoice {
struct ALsourceProps Props;
- struct ALsource *volatile Source;
+ struct ALsource *Source;
/** Current target parameters used for mixing. */
ALint Step;
diff --git a/OpenAL32/alSource.c b/OpenAL32/alSource.c
index 78aaf61d..b65c2c18 100644
--- a/OpenAL32/alSource.c
+++ b/OpenAL32/alSource.c
@@ -125,6 +125,18 @@ static ALboolean GetSourcedv(ALsource *Source, ALCcontext *Context, SourceProp p
static ALboolean GetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp prop, ALint *values);
static ALboolean GetSourcei64v(ALsource *Source, ALCcontext *Context, SourceProp prop, ALint64 *values);
+static inline ALvoice *GetSourceVoice(const ALsource *source, const ALCcontext *context)
+{
+ ALvoice *voice = context->Voices;
+ ALvoice *voice_end = voice + context->VoiceCount;
+ while(voice != voice_end)
+ {
+ if(voice->Source == source)
+ return voice;
+ }
+ return NULL;
+}
+
static inline bool SourceShouldUpdate(const ALsource *source, const ALCcontext *context)
{
return (source->state == AL_PLAYING || source->state == AL_PAUSED) &&
@@ -1584,22 +1596,15 @@ AL_API ALvoid AL_APIENTRY alDeleteSources(ALsizei n, const ALuint *sources)
}
for(i = 0;i < n;i++)
{
- ALvoice *voice, *voice_end;
+ ALvoice *voice;
if((Source=RemoveSource(context, sources[i])) == NULL)
continue;
FreeThunkEntry(Source->id);
LockContext(context);
- voice = context->Voices;
- voice_end = voice + context->VoiceCount;
- while(voice != voice_end)
- {
- ALsource *old = Source;
- if(COMPARE_EXCHANGE(&voice->Source, &old, NULL))
- break;
- voice++;
- }
+ voice = GetSourceVoice(Source, context);
+ if(voice) voice->Source = NULL;
UnlockContext(context);
DeinitSource(Source);
@@ -2977,29 +2982,27 @@ ALvoid SetSourceState(ALsource *Source, ALCcontext *Context, ALenum state)
if(!BufferList || !device->Connected)
goto do_stop;
- /* Make sure this source isn't already active, while looking for an
- * unused active source slot to put it in. */
- for(i = 0;i < Context->VoiceCount;i++)
+ /* Make sure this source isn't already active, and if not, look for an
+ * unused voice to put it in.
+ */
+ voice = GetSourceVoice(Source, Context);
+ if(voice == NULL)
{
- if(Context->Voices[i].Source == Source)
+ for(i = 0;i < Context->VoiceCount;i++)
{
- if(voice != NULL)
- Context->Voices[i].Source = NULL;
- else
+ if(Context->Voices[i].Source == NULL)
+ {
voice = &Context->Voices[i];
- break;
+ voice->Source = Source;
+ break;
+ }
}
-
- if(!voice && !Context->Voices[i].Source)
+ if(voice == NULL)
{
- voice = &Context->Voices[i];
+ voice = &Context->Voices[Context->VoiceCount++];
voice->Source = Source;
}
- }
- if(voice == NULL)
- {
- voice = &Context->Voices[Context->VoiceCount++];
- voice->Source = Source;
+ discontinuity = AL_TRUE;
}
if(discontinuity)