aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Alc/ALu.c2
-rw-r--r--Alc/mixer.c33
-rw-r--r--OpenAL32/Include/alSource.h2
-rw-r--r--OpenAL32/alSource.c140
4 files changed, 76 insertions, 101 deletions
diff --git a/Alc/ALu.c b/Alc/ALu.c
index 25d2db42..d2746d68 100644
--- a/Alc/ALu.c
+++ b/Alc/ALu.c
@@ -1324,7 +1324,7 @@ ALvoid aluHandleDisconnect(ALCdevice *device)
if(source->state == AL_PLAYING)
{
source->state = AL_STOPPED;
- source->BuffersPlayed = source->BuffersInQueue;
+ source->current_buffer = NULL;
source->position = 0;
source->position_fraction = 0;
}
diff --git a/Alc/mixer.c b/Alc/mixer.c
index 9aa9ad7d..a4712207 100644
--- a/Alc/mixer.c
+++ b/Alc/mixer.c
@@ -98,7 +98,6 @@ ALvoid MixSource(ALactivesource *src, ALCdevice *Device, ALuint SamplesToDo)
ALsource *Source = src->Source;
ALbufferlistitem *BufferListItem;
ALuint DataPosInt, DataPosFrac;
- ALuint BuffersPlayed;
ALboolean Looping;
ALuint increment;
enum Resampler Resampler;
@@ -110,20 +109,17 @@ ALvoid MixSource(ALactivesource *src, ALCdevice *Device, ALuint SamplesToDo)
ALuint chan, j;
/* Get source info */
- State = Source->state;
- BuffersPlayed = Source->BuffersPlayed;
- DataPosInt = Source->position;
- DataPosFrac = Source->position_fraction;
- Looping = Source->Looping;
- increment = src->Step;
- Resampler = (increment==FRACTIONONE) ? PointResampler : Source->Resampler;
- NumChannels = Source->NumChannels;
- SampleSize = Source->SampleSize;
+ State = Source->state;
+ BufferListItem = Source->current_buffer;
+ DataPosInt = Source->position;
+ DataPosFrac = Source->position_fraction;
+ Looping = Source->Looping;
+ increment = src->Step;
+ Resampler = (increment==FRACTIONONE) ? PointResampler : Source->Resampler;
+ NumChannels = Source->NumChannels;
+ SampleSize = Source->SampleSize;
/* Get current buffer queue item */
- BufferListItem = Source->queue;
- for(j = 0;j < BuffersPlayed;j++)
- BufferListItem = BufferListItem->next;
OutPos = 0;
do {
@@ -379,20 +375,13 @@ ALvoid MixSource(ALactivesource *src, ALCdevice *Device, ALuint SamplesToDo)
break;
if(BufferListItem->next)
- {
BufferListItem = BufferListItem->next;
- BuffersPlayed++;
- }
else if(Looping)
- {
BufferListItem = Source->queue;
- BuffersPlayed = 0;
- }
else
{
State = AL_STOPPED;
- BufferListItem = Source->queue;
- BuffersPlayed = Source->BuffersInQueue;
+ BufferListItem = NULL;
DataPosInt = 0;
DataPosFrac = 0;
break;
@@ -404,7 +393,7 @@ ALvoid MixSource(ALactivesource *src, ALCdevice *Device, ALuint SamplesToDo)
/* Update source info */
Source->state = State;
- Source->BuffersPlayed = BuffersPlayed;
+ Source->current_buffer = BufferListItem;
Source->position = DataPosInt;
Source->position_fraction = DataPosFrac;
src->Direct.Offset += OutPos;
diff --git a/OpenAL32/Include/alSource.h b/OpenAL32/Include/alSource.h
index 7a337a89..ba1e5f4c 100644
--- a/OpenAL32/Include/alSource.h
+++ b/OpenAL32/Include/alSource.h
@@ -98,7 +98,7 @@ typedef struct ALsource {
/** Source Buffer Queue info. */
ALbufferlistitem *queue;
ALuint BuffersInQueue;
- ALuint BuffersPlayed;
+ ALbufferlistitem *current_buffer;
/** Current buffer sample info. */
ALuint NumChannels;
diff --git a/OpenAL32/alSource.c b/OpenAL32/alSource.c
index 1a1d696f..f762747a 100644
--- a/OpenAL32/alSource.c
+++ b/OpenAL32/alSource.c
@@ -579,9 +579,6 @@ static ALboolean SetSourceiv(ALsource *Source, ALCcontext *Context, SrcIntProp p
SET_ERROR_AND_RETURN_VALUE(Context, AL_INVALID_OPERATION, AL_FALSE);
}
- Source->BuffersInQueue = 0;
- Source->BuffersPlayed = 0;
-
if(buffer != NULL)
{
ALbufferlistitem *BufferListItem;
@@ -609,7 +606,9 @@ static ALboolean SetSourceiv(ALsource *Source, ALCcontext *Context, SrcIntProp p
/* Source is now Undetermined */
Source->SourceType = AL_UNDETERMINED;
oldlist = ExchangePtr((XchgPtr*)&Source->queue, NULL);
+ Source->BuffersInQueue = 0;
}
+ Source->current_buffer = Source->queue;
/* Delete all elements in the previous queue */
while(oldlist != NULL)
@@ -1013,18 +1012,9 @@ static ALboolean GetSourceiv(const ALsource *Source, ALCcontext *Context, SrcInt
case AL_BUFFER:
LockContext(Context);
- BufferList = Source->queue;
- if(Source->SourceType != AL_STATIC)
- {
- ALuint i = Source->BuffersPlayed;
- while(i > 0)
- {
- BufferList = BufferList->next;
- i--;
- }
- }
- *values = ((BufferList && BufferList->buffer) ?
- BufferList->buffer->id : 0);
+ BufferList = (Source->SourceType == AL_STATIC) ? Source->queue :
+ Source->current_buffer;
+ *values = (BufferList && BufferList->buffer) ? BufferList->buffer->id : 0;
UnlockContext(Context);
return AL_TRUE;
@@ -1045,7 +1035,16 @@ static ALboolean GetSourceiv(const ALsource *Source, ALCcontext *Context, SrcInt
*values = 0;
}
else
- *values = Source->BuffersPlayed;
+ {
+ const ALbufferlistitem *BufferList = Source->queue;
+ ALsizei played = 0;
+ while(BufferList && BufferList != Source->current_buffer)
+ {
+ played++;
+ BufferList = BufferList->next;
+ }
+ *values = played;
+ }
UnlockContext(Context);
return AL_TRUE;
@@ -2127,7 +2126,9 @@ AL_API ALvoid AL_APIENTRY alSourceQueueBuffers(ALuint src, ALsizei nb, const ALu
/* Source is now streaming */
source->SourceType = AL_STREAMING;
- if(source->queue == NULL)
+ if(!source->current_buffer)
+ source->current_buffer = BufferListStart;
+ if(!source->queue)
source->queue = BufferListStart;
else
{
@@ -2163,8 +2164,8 @@ AL_API ALvoid AL_APIENTRY alSourceUnqueueBuffers(ALuint src, ALsizei nb, ALuint
{
ALCcontext *context;
ALsource *source;
- ALsizei i;
ALbufferlistitem *BufferList;
+ ALsizei i;
if(nb == 0)
return;
@@ -2179,8 +2180,14 @@ AL_API ALvoid AL_APIENTRY alSourceUnqueueBuffers(ALuint src, ALsizei nb, ALuint
SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
LockContext(context);
- if(source->Looping || source->SourceType != AL_STREAMING ||
- (ALuint)nb > source->BuffersPlayed)
+ BufferList = source->queue;
+ for(i = 0;i < nb && BufferList;i++)
+ {
+ if(BufferList == source->current_buffer)
+ break;
+ BufferList = BufferList->next;
+ }
+ if(source->Looping || source->SourceType != AL_STREAMING || i != nb)
{
UnlockContext(context);
/* Trying to unqueue pending buffers, or a buffer that wasn't queued. */
@@ -2192,7 +2199,6 @@ AL_API ALvoid AL_APIENTRY alSourceUnqueueBuffers(ALuint src, ALsizei nb, ALuint
BufferList = source->queue;
source->queue = BufferList->next;
source->BuffersInQueue--;
- source->BuffersPlayed--;
if(BufferList->buffer)
{
@@ -2286,7 +2292,8 @@ ALvoid SetSourceState(ALsource *Source, ALCcontext *Context, ALenum state)
BufferList = Source->queue;
while(BufferList)
{
- if(BufferList->buffer != NULL && BufferList->buffer->SampleLen)
+ ALbuffer *buffer;
+ if((buffer=BufferList->buffer) != NULL && buffer->SampleLen > 0)
break;
BufferList = BufferList->next;
}
@@ -2296,7 +2303,7 @@ ALvoid SetSourceState(ALsource *Source, ALCcontext *Context, ALenum state)
Source->state = AL_PLAYING;
Source->position = 0;
Source->position_fraction = 0;
- Source->BuffersPlayed = 0;
+ Source->current_buffer = Source->queue;
}
else
Source->state = AL_PLAYING;
@@ -2372,7 +2379,7 @@ ALvoid SetSourceState(ALsource *Source, ALCcontext *Context, ALenum state)
if(Source->state != AL_INITIAL)
{
Source->state = AL_STOPPED;
- Source->BuffersPlayed = Source->BuffersInQueue;
+ Source->current_buffer = NULL;
}
Source->Offset = -1.0;
}
@@ -2383,7 +2390,7 @@ ALvoid SetSourceState(ALsource *Source, ALCcontext *Context, ALenum state)
Source->state = AL_INITIAL;
Source->position = 0;
Source->position_fraction = 0;
- Source->BuffersPlayed = 0;
+ Source->current_buffer = Source->queue;
}
Source->Offset = -1.0;
}
@@ -2399,7 +2406,6 @@ static ALint64 GetSourceOffset(const ALsource *Source)
{
const ALbufferlistitem *BufferList;
ALuint64 readPos;
- ALuint i;
if(Source->state != AL_PLAYING && Source->state != AL_PAUSED)
return 0;
@@ -2409,7 +2415,7 @@ static ALint64 GetSourceOffset(const ALsource *Source)
readPos = (ALuint64)Source->position << 32;
readPos |= (ALuint64)Source->position_fraction << (32-FRACTIONBITS);
BufferList = Source->queue;
- for(i = 0;i < Source->BuffersPlayed && BufferList;i++)
+ while(BufferList && BufferList != Source->current_buffer)
{
if(BufferList->buffer)
readPos += (ALuint64)BufferList->buffer->SampleLen << 32;
@@ -2427,22 +2433,10 @@ static ALint64 GetSourceOffset(const ALsource *Source)
static ALdouble GetSourceSecOffset(const ALsource *Source)
{
const ALbufferlistitem *BufferList;
- const ALbuffer *Buffer = NULL;
+ const ALbuffer *Buffer;
ALuint64 readPos;
- ALuint i;
- BufferList = Source->queue;
- while(BufferList)
- {
- if(BufferList->buffer)
- {
- Buffer = BufferList->buffer;
- break;
- }
- BufferList = BufferList->next;
- }
-
- if((Source->state != AL_PLAYING && Source->state != AL_PAUSED) || !Buffer)
+ if(Source->state != AL_PLAYING && Source->state != AL_PAUSED)
return 0.0;
/* NOTE: This is the offset into the *current* buffer, so add the length of
@@ -2450,10 +2444,20 @@ static ALdouble GetSourceSecOffset(const ALsource *Source)
readPos = (ALuint64)Source->position << FRACTIONBITS;
readPos |= (ALuint64)Source->position_fraction;
BufferList = Source->queue;
- for(i = 0;i < Source->BuffersPlayed && BufferList;i++)
+ while(BufferList && BufferList != Source->current_buffer)
{
- if(BufferList->buffer)
- readPos += (ALuint64)BufferList->buffer->SampleLen << FRACTIONBITS;
+ const ALbuffer *buffer = BufferList->buffer;
+ if(buffer != NULL)
+ {
+ if(!Buffer) Buffer = buffer;
+ readPos += (ALuint64)buffer->SampleLen << FRACTIONBITS;
+ }
+ BufferList = BufferList->next;
+ }
+
+ while(BufferList && !Buffer)
+ {
+ Buffer = BufferList->buffer;
BufferList = BufferList->next;
}
@@ -2469,24 +2473,12 @@ static ALdouble GetSourceSecOffset(const ALsource *Source)
static ALvoid GetSourceOffsets(const ALsource *Source, ALenum name, ALdouble *offset, ALdouble updateLen)
{
const ALbufferlistitem *BufferList;
- const ALbuffer *Buffer = NULL;
+ const ALbuffer *Buffer = NULL;
+ ALboolean readFin = AL_FALSE;
ALuint readPos, writePos;
ALuint totalBufferLen;
- ALuint i;
- // Find the first valid Buffer in the Queue
- BufferList = Source->queue;
- while(BufferList)
- {
- if(BufferList->buffer)
- {
- Buffer = BufferList->buffer;
- break;
- }
- BufferList = BufferList->next;
- }
-
- if((Source->state != AL_PLAYING && Source->state != AL_PAUSED) || !Buffer)
+ if(Source->state != AL_PLAYING && Source->state != AL_PAUSED)
{
offset[0] = 0.0;
offset[1] = 0.0;
@@ -2501,13 +2493,15 @@ static ALvoid GetSourceOffsets(const ALsource *Source, ALenum name, ALdouble *of
readPos = Source->position;
totalBufferLen = 0;
BufferList = Source->queue;
- for(i = 0;BufferList;i++)
+ while(BufferList != NULL)
{
- if(BufferList->buffer)
+ const ALbuffer *buffer;
+ readFin = readFin || (BufferList == Source->current_buffer);
+ if((buffer=BufferList->buffer) != NULL)
{
- if(i < Source->BuffersPlayed)
- readPos += BufferList->buffer->SampleLen;
- totalBufferLen += BufferList->buffer->SampleLen;
+ totalBufferLen += buffer->SampleLen;
+ if(!readFin) readPos += buffer->SampleLen;
+ if(!Buffer) Buffer = buffer;
}
BufferList = BufferList->next;
}
@@ -2597,10 +2591,9 @@ static ALvoid GetSourceOffsets(const ALsource *Source, ALenum name, ALdouble *of
*/
ALboolean ApplyOffset(ALsource *Source)
{
- const ALbufferlistitem *BufferList;
- const ALbuffer *Buffer;
+ ALbufferlistitem *BufferList;
+ const ALbuffer *Buffer;
ALint bufferLen, totalBufferLen;
- ALint buffersPlayed;
ALint offset;
/* Get sample frame offset */
@@ -2608,24 +2601,17 @@ ALboolean ApplyOffset(ALsource *Source)
if(offset == -1)
return AL_FALSE;
- buffersPlayed = 0;
totalBufferLen = 0;
-
BufferList = Source->queue;
- while(BufferList)
+ while(BufferList && totalBufferLen <= offset)
{
Buffer = BufferList->buffer;
bufferLen = Buffer ? Buffer->SampleLen : 0;
- if(bufferLen <= offset-totalBufferLen)
- {
- /* Offset is past this buffer so increment to the next buffer */
- buffersPlayed++;
- }
- else if(totalBufferLen <= offset)
+ if(bufferLen > offset-totalBufferLen)
{
/* Offset is in this buffer */
- Source->BuffersPlayed = buffersPlayed;
+ Source->current_buffer = BufferList;
Source->position = offset - totalBufferLen;
Source->position_fraction = 0;