30007263e5
This will be to allow buffer layering, multiple buffers of the same format and sample rate that are mixed together prior to resampling, filtering, and panning. This will allow composing sounds from individual components that can be swapped around on different invocations (e.g. layer SoundA and SoundB on one instance and SoundA and SoundC on a different instance for a slightly different sound, then just SoundA for a third instance, and so on). The longest buffer within the list item determines the length of the list item. More work needs to be done to fully support it, namely the ability to specity multiple buffers to layer for static and streaming sources. Also the behavior of loop points for layered static sources should be worked out. Should also consider allowing each layer to have a sample offset.
130 lines
3.0 KiB
C
130 lines
3.0 KiB
C
#ifndef _AL_SOURCE_H_
|
|
#define _AL_SOURCE_H_
|
|
|
|
#include "bool.h"
|
|
#include "alMain.h"
|
|
#include "alu.h"
|
|
#include "hrtf.h"
|
|
#include "atomic.h"
|
|
|
|
#define MAX_SENDS 16
|
|
#define DEFAULT_SENDS 2
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
struct ALbuffer;
|
|
struct ALsource;
|
|
|
|
|
|
typedef struct ALbufferlistitem {
|
|
ATOMIC(struct ALbufferlistitem*) next;
|
|
ALsizei num_buffers;
|
|
struct ALbuffer *buffers[];
|
|
} ALbufferlistitem;
|
|
|
|
|
|
typedef struct ALsource {
|
|
/** Source properties. */
|
|
ALfloat Pitch;
|
|
ALfloat Gain;
|
|
ALfloat OuterGain;
|
|
ALfloat MinGain;
|
|
ALfloat MaxGain;
|
|
ALfloat InnerAngle;
|
|
ALfloat OuterAngle;
|
|
ALfloat RefDistance;
|
|
ALfloat MaxDistance;
|
|
ALfloat RolloffFactor;
|
|
ALfloat Position[3];
|
|
ALfloat Velocity[3];
|
|
ALfloat Direction[3];
|
|
ALfloat Orientation[2][3];
|
|
ALboolean HeadRelative;
|
|
ALboolean Looping;
|
|
enum DistanceModel DistanceModel;
|
|
enum Resampler Resampler;
|
|
ALboolean DirectChannels;
|
|
enum SpatializeMode Spatialize;
|
|
|
|
ALboolean DryGainHFAuto;
|
|
ALboolean WetGainAuto;
|
|
ALboolean WetGainHFAuto;
|
|
ALfloat OuterGainHF;
|
|
|
|
ALfloat AirAbsorptionFactor;
|
|
ALfloat RoomRolloffFactor;
|
|
ALfloat DopplerFactor;
|
|
|
|
/* NOTE: Stereo pan angles are specified in radians, counter-clockwise
|
|
* rather than clockwise.
|
|
*/
|
|
ALfloat StereoPan[2];
|
|
|
|
ALfloat Radius;
|
|
|
|
/** Direct filter and auxiliary send info. */
|
|
struct {
|
|
ALfloat Gain;
|
|
ALfloat GainHF;
|
|
ALfloat HFReference;
|
|
ALfloat GainLF;
|
|
ALfloat LFReference;
|
|
} Direct;
|
|
struct {
|
|
struct ALeffectslot *Slot;
|
|
ALfloat Gain;
|
|
ALfloat GainHF;
|
|
ALfloat HFReference;
|
|
ALfloat GainLF;
|
|
ALfloat LFReference;
|
|
} *Send;
|
|
|
|
/**
|
|
* Last user-specified offset, and the offset type (bytes, samples, or
|
|
* seconds).
|
|
*/
|
|
ALdouble Offset;
|
|
ALenum OffsetType;
|
|
|
|
/** Source type (static, streaming, or undetermined) */
|
|
ALint SourceType;
|
|
|
|
/** Source state (initial, playing, paused, or stopped) */
|
|
ATOMIC(ALenum) state;
|
|
|
|
/** Source Buffer Queue head. */
|
|
RWLock queue_lock;
|
|
ALbufferlistitem *queue;
|
|
|
|
ATOMIC_FLAG PropsClean;
|
|
|
|
/** Self ID */
|
|
ALuint id;
|
|
} ALsource;
|
|
|
|
inline void LockSourcesRead(ALCcontext *context)
|
|
{ LockUIntMapRead(&context->SourceMap); }
|
|
inline void UnlockSourcesRead(ALCcontext *context)
|
|
{ UnlockUIntMapRead(&context->SourceMap); }
|
|
inline void LockSourcesWrite(ALCcontext *context)
|
|
{ LockUIntMapWrite(&context->SourceMap); }
|
|
inline void UnlockSourcesWrite(ALCcontext *context)
|
|
{ UnlockUIntMapWrite(&context->SourceMap); }
|
|
|
|
inline struct ALsource *LookupSource(ALCcontext *context, ALuint id)
|
|
{ return (struct ALsource*)LookupUIntMapKeyNoLock(&context->SourceMap, id); }
|
|
inline struct ALsource *RemoveSource(ALCcontext *context, ALuint id)
|
|
{ return (struct ALsource*)RemoveUIntMapKeyNoLock(&context->SourceMap, id); }
|
|
|
|
void UpdateAllSourceProps(ALCcontext *context);
|
|
|
|
ALvoid ReleaseALSources(ALCcontext *Context);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|