diff options
Diffstat (limited to 'OpenAL32')
-rw-r--r-- | OpenAL32/Include/alMain.h | 40 | ||||
-rw-r--r-- | OpenAL32/Include/alSource.h | 8 | ||||
-rw-r--r-- | OpenAL32/alSource.c | 54 |
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; |