aboutsummaryrefslogtreecommitdiffstats
path: root/OpenAL32/Include
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2017-02-27 15:35:15 -0800
committerChris Robinson <[email protected]>2017-02-27 15:35:15 -0800
commit5c859af24ea44dabbbb31631309bb08a858a523e (patch)
tree5713cdb318c1d9869e4b2e24d0f415ec0c89fd71 /OpenAL32/Include
parent513c18fdc4d0d9184e061570209eb59f4ad0e392 (diff)
Move the current buffer queue entry and play position to the voice
This has a couple behavioral changes. First and biggest is that querying AL_BUFFERS_PROCESSED from a source will always return all buffers processed when in an AL_STOPPED state. Previously all buffers would be set as processed when first becoming stopped, but newly queued buffers would *not* be indicated as processed. That old behavior was not compliant with the spec, which unequivocally states "On a source in the AL_STOPPED state, all buffers are processed." Secondly, querying AL_BUFFER on an AL_STREAMING source will now always return 0. Previously it would return the current "active" buffer in the queue, but there's no basis for that in the spec.
Diffstat (limited to 'OpenAL32/Include')
-rw-r--r--OpenAL32/Include/alSource.h24
1 files changed, 13 insertions, 11 deletions
diff --git a/OpenAL32/Include/alSource.h b/OpenAL32/Include/alSource.h
index 6282939e..f8a32f71 100644
--- a/OpenAL32/Include/alSource.h
+++ b/OpenAL32/Include/alSource.h
@@ -81,6 +81,17 @@ typedef struct ALvoice {
struct ALsource *Source;
+ /* Current buffer queue item being played. */
+ ATOMIC(ALbufferlistitem*) current_buffer;
+
+ /**
+ * Source offset in samples, relative to the currently playing buffer, NOT
+ * the whole queue, and the fractional (fixed-point) offset to the next
+ * sample.
+ */
+ ATOMIC(ALuint) position;
+ ATOMIC(ALuint) position_fraction;
+
/** Current target parameters used for mixing. */
ALint Step;
@@ -178,18 +189,9 @@ typedef struct ALsource {
ATOMIC(ALenum) state;
ALenum new_state;
- /** Source Buffer Queue info. */
+ /** Source Buffer Queue head. */
RWLock queue_lock;
ATOMIC(ALbufferlistitem*) queue;
- ATOMIC(ALbufferlistitem*) current_buffer;
-
- /**
- * Source offset in samples, relative to the currently playing buffer, NOT
- * the whole queue, and the fractional (fixed-point) offset to the next
- * sample.
- */
- ATOMIC(ALuint) position;
- ATOMIC(ALuint) position_fraction;
ATOMIC(ALboolean) looping;
@@ -222,7 +224,7 @@ inline struct ALsource *RemoveSource(ALCcontext *context, ALuint id)
void UpdateAllSourceProps(ALCcontext *context);
ALvoid SetSourceState(ALsource *Source, ALCcontext *Context, ALenum state);
-ALboolean ApplyOffset(ALsource *Source);
+ALboolean ApplyOffset(ALsource *Source, ALvoice *voice);
inline ALboolean IsPlayingOrPaused(const ALsource *source)
{