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;
|
enum Resampler Resampler;
|
||||||
|
|
||||||
ALenum state;
|
ALenum state;
|
||||||
|
ALenum new_state;
|
||||||
ALuint position;
|
ALuint position;
|
||||||
ALuint position_fraction;
|
ALuint position_fraction;
|
||||||
|
|
||||||
|
@ -1376,7 +1376,8 @@ AL_API ALvoid AL_APIENTRY alSourcePlayv(ALsizei n, const ALuint *sources)
|
|||||||
for(i = 0;i < n;i++)
|
for(i = 0;i < n;i++)
|
||||||
{
|
{
|
||||||
Source = (ALsource*)ALTHUNK_LOOKUPENTRY(sources[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:
|
done:
|
||||||
@ -1421,7 +1422,8 @@ AL_API ALvoid AL_APIENTRY alSourcePausev(ALsizei n, const ALuint *sources)
|
|||||||
for(i = 0;i < n;i++)
|
for(i = 0;i < n;i++)
|
||||||
{
|
{
|
||||||
Source = (ALsource*)ALTHUNK_LOOKUPENTRY(sources[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:
|
done:
|
||||||
@ -1466,7 +1468,8 @@ AL_API ALvoid AL_APIENTRY alSourceStopv(ALsizei n, const ALuint *sources)
|
|||||||
for(i = 0;i < n;i++)
|
for(i = 0;i < n;i++)
|
||||||
{
|
{
|
||||||
Source = (ALsource*)ALTHUNK_LOOKUPENTRY(sources[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:
|
done:
|
||||||
@ -1511,7 +1514,8 @@ AL_API ALvoid AL_APIENTRY alSourceRewindv(ALsizei n, const ALuint *sources)
|
|||||||
for(i = 0;i < n;i++)
|
for(i = 0;i < n;i++)
|
||||||
{
|
{
|
||||||
Source = (ALsource*)ALTHUNK_LOOKUPENTRY(sources[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:
|
done:
|
||||||
@ -1772,6 +1776,7 @@ static ALvoid InitSourceParams(ALsource *Source)
|
|||||||
Source->Resampler = DefaultResampler;
|
Source->Resampler = DefaultResampler;
|
||||||
|
|
||||||
Source->state = AL_INITIAL;
|
Source->state = AL_INITIAL;
|
||||||
|
Source->new_state = AL_NONE;
|
||||||
Source->lSourceType = AL_UNDETERMINED;
|
Source->lSourceType = AL_UNDETERMINED;
|
||||||
|
|
||||||
Source->NeedsUpdate = AL_TRUE;
|
Source->NeedsUpdate = AL_TRUE;
|
||||||
|
@ -591,7 +591,23 @@ AL_API ALvoid AL_APIENTRY alProcessUpdatesSOFT(void)
|
|||||||
Context = GetLockedContext();
|
Context = GetLockedContext();
|
||||||
if(!Context) return;
|
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);
|
UnlockContext(Context);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user