Defer source state changes from alSourcePlay/Pause/Stop/Rewind calls
This commit is contained in:
parent
7ea71d8bfa
commit
f196a9fc67
@ -51,6 +51,7 @@ typedef struct ALsource
|
||||
enum Resampler Resampler;
|
||||
|
||||
ALenum state;
|
||||
ALenum new_state;
|
||||
ALuint position;
|
||||
ALuint position_fraction;
|
||||
|
||||
|
@ -1376,7 +1376,8 @@ AL_API ALvoid AL_APIENTRY alSourcePlayv(ALsizei n, const ALuint *sources)
|
||||
for(i = 0;i < n;i++)
|
||||
{
|
||||
Source = (ALsource*)ALTHUNK_LOOKUPENTRY(sources[i]);
|
||||
SetSourceState(Source, Context, AL_PLAYING);
|
||||
if(Context->DeferUpdates) Source->new_state = AL_PLAYING;
|
||||
else SetSourceState(Source, Context, AL_PLAYING);
|
||||
}
|
||||
|
||||
done:
|
||||
@ -1421,7 +1422,8 @@ AL_API ALvoid AL_APIENTRY alSourcePausev(ALsizei n, const ALuint *sources)
|
||||
for(i = 0;i < n;i++)
|
||||
{
|
||||
Source = (ALsource*)ALTHUNK_LOOKUPENTRY(sources[i]);
|
||||
SetSourceState(Source, Context, AL_PAUSED);
|
||||
if(Context->DeferUpdates) Source->new_state = AL_PAUSED;
|
||||
else SetSourceState(Source, Context, AL_PAUSED);
|
||||
}
|
||||
|
||||
done:
|
||||
@ -1466,7 +1468,8 @@ AL_API ALvoid AL_APIENTRY alSourceStopv(ALsizei n, const ALuint *sources)
|
||||
for(i = 0;i < n;i++)
|
||||
{
|
||||
Source = (ALsource*)ALTHUNK_LOOKUPENTRY(sources[i]);
|
||||
SetSourceState(Source, Context, AL_STOPPED);
|
||||
if(Context->DeferUpdates) Source->new_state = AL_STOPPED;
|
||||
else SetSourceState(Source, Context, AL_STOPPED);
|
||||
}
|
||||
|
||||
done:
|
||||
@ -1511,7 +1514,8 @@ AL_API ALvoid AL_APIENTRY alSourceRewindv(ALsizei n, const ALuint *sources)
|
||||
for(i = 0;i < n;i++)
|
||||
{
|
||||
Source = (ALsource*)ALTHUNK_LOOKUPENTRY(sources[i]);
|
||||
SetSourceState(Source, Context, AL_INITIAL);
|
||||
if(Context->DeferUpdates) Source->new_state = AL_INITIAL;
|
||||
else SetSourceState(Source, Context, AL_INITIAL);
|
||||
}
|
||||
|
||||
done:
|
||||
@ -1772,6 +1776,7 @@ static ALvoid InitSourceParams(ALsource *Source)
|
||||
Source->Resampler = DefaultResampler;
|
||||
|
||||
Source->state = AL_INITIAL;
|
||||
Source->new_state = AL_NONE;
|
||||
Source->lSourceType = AL_UNDETERMINED;
|
||||
|
||||
Source->NeedsUpdate = AL_TRUE;
|
||||
|
@ -591,7 +591,23 @@ AL_API ALvoid AL_APIENTRY alProcessUpdatesSOFT(void)
|
||||
Context = GetLockedContext();
|
||||
if(!Context) return;
|
||||
|
||||
Context->DeferUpdates = AL_FALSE;
|
||||
if(Context->DeferUpdates)
|
||||
{
|
||||
ALsizei pos;
|
||||
|
||||
Context->DeferUpdates = AL_FALSE;
|
||||
|
||||
for(pos = 0;pos < Context->SourceMap.size;pos++)
|
||||
{
|
||||
ALsource *src = Context->SourceMap.array[pos].value;
|
||||
ALenum new_state;
|
||||
|
||||
new_state = src->new_state;
|
||||
src->new_state = AL_NONE;
|
||||
if(new_state)
|
||||
SetSourceState(src, Context, new_state);
|
||||
}
|
||||
}
|
||||
|
||||
UnlockContext(Context);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user