aboutsummaryrefslogtreecommitdiffstats
path: root/OpenAL32
diff options
context:
space:
mode:
Diffstat (limited to 'OpenAL32')
-rw-r--r--OpenAL32/Include/alMain.h40
-rw-r--r--OpenAL32/Include/alSource.h8
-rw-r--r--OpenAL32/alSource.c54
3 files changed, 74 insertions, 28 deletions
diff --git a/OpenAL32/Include/alMain.h b/OpenAL32/Include/alMain.h
index 23572a90..cc30dcef 100644
--- a/OpenAL32/Include/alMain.h
+++ b/OpenAL32/Include/alMain.h
@@ -29,6 +29,29 @@
#include "almalloc.h"
#include "threads.h"
+#ifndef ALC_SOFT_loopback2
+#define ALC_SOFT_loopback2 1
+#define ALC_AMBISONIC_LAYOUT_SOFT 0x1997
+#define ALC_AMBISONIC_SCALING_SOFT 0x1998
+#define ALC_AMBISONIC_ORDER_SOFT 0x1999
+
+#define ALC_BFORMAT3D_SOFT 0x1508
+
+/* Ambisonic layouts */
+#define ALC_ACN_SOFT 0x1600
+#define ALC_FUMA_SOFT 0x1601
+
+/* Ambisonic scalings (normalization) */
+#define ALC_N3D_SOFT 0x1700
+#define ALC_SN3D_SOFT 0x1701
+/*#define ALC_FUMA_SOFT*/
+
+typedef ALCboolean (ALC_APIENTRY*LPALCISAMBISONICFORMATSUPPORTEDSOFT)(ALCdevice *device, ALCenum layout, ALCenum scaling, ALsizei order);
+#ifdef AL_ALEXT_PROTOTYPES
+ALC_API ALCboolean ALC_APIENTRY alcIsAmbisonicFormatSupportedSOFT(ALCdevice *device, ALCenum layout, ALCenum scaling, ALsizei order);
+#endif
+#endif
+
#ifndef ALC_SOFT_device_clock
#define ALC_SOFT_device_clock 1
typedef int64_t ALCint64SOFT;
@@ -408,9 +431,6 @@ typedef struct {
ALCboolean alc_ca_init(BackendFuncs *func_list);
void alc_ca_deinit(void);
void alc_ca_probe(enum DevProbe type);
-ALCboolean alc_opensl_init(BackendFuncs *func_list);
-void alc_opensl_deinit(void);
-void alc_opensl_probe(enum DevProbe type);
ALCboolean alc_qsa_init(BackendFuncs *func_list);
void alc_qsa_deinit(void);
void alc_qsa_probe(enum DevProbe type);
@@ -511,16 +531,16 @@ inline ALsizei FrameSizeFromDevFmt(enum DevFmtChannels chans, enum DevFmtType ty
}
enum AmbiLayout {
- AmbiLayout_FuMa, /* FuMa channel order */
- AmbiLayout_ACN, /* ACN channel order */
+ AmbiLayout_FuMa = ALC_FUMA_SOFT, /* FuMa channel order */
+ AmbiLayout_ACN = ALC_ACN_SOFT, /* ACN channel order */
AmbiLayout_Default = AmbiLayout_ACN
};
enum AmbiNorm {
- AmbiNorm_FuMa, /* FuMa normalization */
- AmbiNorm_SN3D, /* SN3D normalization */
- AmbiNorm_N3D, /* N3D normalization */
+ AmbiNorm_FuMa = ALC_FUMA_SOFT, /* FuMa normalization */
+ AmbiNorm_SN3D = ALC_SN3D_SOFT, /* SN3D normalization */
+ AmbiNorm_N3D = ALC_N3D_SOFT, /* N3D normalization */
AmbiNorm_Default = AmbiNorm_SN3D
};
@@ -611,12 +631,12 @@ TYPEDEF_VECTOR(HrtfEntry, vector_HrtfEntry)
/* Maximum delay in samples for speaker distance compensation. */
-#define MAX_DELAY_LENGTH 128
+#define MAX_DELAY_LENGTH 1024
typedef struct DistanceComp {
ALfloat Gain;
ALsizei Length; /* Valid range is [0...MAX_DELAY_LENGTH). */
- alignas(16) ALfloat Buffer[MAX_DELAY_LENGTH];
+ ALfloat *Buffer;
} DistanceComp;
/* Size for temporary storage of buffer data, in ALfloats. Larger values need
diff --git a/OpenAL32/Include/alSource.h b/OpenAL32/Include/alSource.h
index f8a32f71..fc1756e5 100644
--- a/OpenAL32/Include/alSource.h
+++ b/OpenAL32/Include/alSource.h
@@ -1,13 +1,14 @@
#ifndef _AL_SOURCE_H_
#define _AL_SOURCE_H_
-#define MAX_SENDS 16
-#define DEFAULT_SENDS 2
-
+#include "bool.h"
#include "alMain.h"
#include "alu.h"
#include "hrtf.h"
+#define MAX_SENDS 16
+#define DEFAULT_SENDS 2
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -80,6 +81,7 @@ typedef struct ALvoice {
struct ALsourceProps *Props;
struct ALsource *Source;
+ ATOMIC(bool) Playing;
/* Current buffer queue item being played. */
ATOMIC(ALbufferlistitem*) current_buffer;
diff --git a/OpenAL32/alSource.c b/OpenAL32/alSource.c
index 40aa855c..14329bc2 100644
--- a/OpenAL32/alSource.c
+++ b/OpenAL32/alSource.c
@@ -1637,8 +1637,11 @@ AL_API ALvoid AL_APIENTRY alDeleteSources(ALsizei n, const ALuint *sources)
FreeThunkEntry(Source->id);
ALCdevice_Lock(device);
- voice = GetSourceVoice(Source, context);
- if(voice) voice->Source = NULL;
+ if((voice=GetSourceVoice(Source, context)) != NULL)
+ {
+ voice->Source = NULL;
+ ATOMIC_STORE(&voice->Playing, false, almemory_order_release);
+ }
ALCdevice_Unlock(device);
DeinitSource(Source, device->NumAuxSends);
@@ -2963,6 +2966,8 @@ void UpdateAllSourceProps(ALCcontext *context)
*/
ALvoid SetSourceState(ALsource *Source, ALCcontext *Context, ALenum state)
{
+ ALCdevice *device = Context->Device;
+ ALuint refcount;
ALvoice *voice;
WriteLock(&Source->queue_lock);
@@ -2994,11 +2999,12 @@ ALvoid SetSourceState(ALsource *Source, ALCcontext *Context, ALenum state)
{
case AL_PLAYING:
assert(voice != NULL);
- /* A source that's already playing is restarted. */
+ /* A source that's already playing is restarted from the beginning. */
ATOMIC_STORE(&voice->current_buffer, BufferList, almemory_order_relaxed);
ATOMIC_STORE(&voice->position, 0, almemory_order_relaxed);
ATOMIC_STORE(&voice->position_fraction, 0, almemory_order_release);
- /* fall-through */
+ goto done;
+
case AL_PAUSED:
assert(voice != NULL);
/* A source that's paused simply resumes. Make sure it uses the
@@ -3006,12 +3012,16 @@ ALvoid SetSourceState(ALsource *Source, ALCcontext *Context, ALenum state)
* it stopped at.
*/
voice->Moving = AL_FALSE;
+ ATOMIC_STORE(&voice->Playing, true, almemory_order_release);
goto done;
default:
break;
}
+ Source->NeedsUpdate = AL_FALSE;
+ UpdateSourceProps(Source, device->NumAuxSends);
+
/* Make sure this source isn't already active, and if not, look for an
* unused voice to put it in.
*/
@@ -3021,22 +3031,20 @@ ALvoid SetSourceState(ALsource *Source, ALCcontext *Context, ALenum state)
if(Context->Voices[i]->Source == NULL)
{
voice = Context->Voices[i];
- voice->Source = Source;
break;
}
}
if(voice == NULL)
- {
voice = Context->Voices[Context->VoiceCount++];
- voice->Source = Source;
- }
+ ATOMIC_STORE(&voice->Playing, false, almemory_order_release);
+ ATOMIC_THREAD_FENCE(almemory_order_acquire);
/* A source that's not playing or paused has any offset applied when it
* starts playing.
*/
ATOMIC_STORE(&voice->current_buffer, BufferList, almemory_order_relaxed);
ATOMIC_STORE(&voice->position, 0, almemory_order_relaxed);
- ATOMIC_STORE(&voice->position_fraction, 0, almemory_order_release);
+ ATOMIC_STORE(&voice->position_fraction, 0, almemory_order_relaxed);
if(Source->OffsetType != AL_NONE)
ApplyOffset(Source, voice);
@@ -3061,19 +3069,30 @@ ALvoid SetSourceState(ALsource *Source, ALCcontext *Context, ALenum state)
}
}
- Source->NeedsUpdate = AL_FALSE;
- UpdateSourceProps(Source, device->NumAuxSends);
+ voice->Source = Source;
+ ATOMIC_STORE(&voice->Playing, true, almemory_order_release);
}
else if(state == AL_PAUSED)
{
ALenum playing = AL_PLAYING;
+ if((voice=GetSourceVoice(Source, Context)) != NULL)
+ {
+ ATOMIC_STORE(&voice->Playing, false, almemory_order_release);
+ while(((refcount=ATOMIC_LOAD(&device->MixCount, almemory_order_acquire))&1))
+ althrd_yield();
+ }
ATOMIC_COMPARE_EXCHANGE_STRONG_SEQ(ALenum, &Source->state, &playing, AL_PAUSED);
}
else if(state == AL_STOPPED)
{
do_stop:
- voice = GetSourceVoice(Source, Context);
- if(voice) voice->Source = NULL;
+ if((voice=GetSourceVoice(Source, Context)) != NULL)
+ {
+ voice->Source = NULL;
+ ATOMIC_STORE(&voice->Playing, false, almemory_order_release);
+ while(((refcount=ATOMIC_LOAD(&device->MixCount, almemory_order_acquire))&1))
+ althrd_yield();
+ }
if(ATOMIC_LOAD(&Source->state, almemory_order_acquire) != AL_INITIAL)
ATOMIC_STORE(&Source->state, AL_STOPPED, almemory_order_relaxed);
Source->OffsetType = AL_NONE;
@@ -3081,8 +3100,13 @@ ALvoid SetSourceState(ALsource *Source, ALCcontext *Context, ALenum state)
}
else if(state == AL_INITIAL)
{
- voice = GetSourceVoice(Source, Context);
- if(voice) voice->Source = NULL;
+ if((voice=GetSourceVoice(Source, Context)) != NULL)
+ {
+ voice->Source = NULL;
+ ATOMIC_STORE(&voice->Playing, false, almemory_order_release);
+ while(((refcount=ATOMIC_LOAD(&device->MixCount, almemory_order_acquire))&1))
+ althrd_yield();
+ }
if(ATOMIC_LOAD(&Source->state, almemory_order_acquire) != AL_INITIAL)
ATOMIC_STORE(&Source->state, AL_INITIAL, almemory_order_relaxed);
Source->OffsetType = AL_NONE;