AuroraOpenALSoft/OpenAL32/Include/alSource.h

181 lines
4.5 KiB
C
Raw Normal View History

2007-11-14 02:02:18 +00:00
#ifndef _AL_SOURCE_H_
#define _AL_SOURCE_H_
#define MAX_SENDS 4
#include "alFilter.h"
#include "alu.h"
2007-11-14 02:02:18 +00:00
#include "AL/al.h"
#ifdef __cplusplus
extern "C" {
#endif
#define SRC_HISTORY_BITS (6)
#define SRC_HISTORY_LENGTH (1<<SRC_HISTORY_BITS)
#define SRC_HISTORY_MASK (SRC_HISTORY_LENGTH-1)
2011-07-03 04:33:53 +00:00
extern enum Resampler DefaultResampler;
2010-01-11 13:37:20 +00:00
extern const ALsizei ResamplerPadding[ResamplerMax];
extern const ALsizei ResamplerPrePadding[ResamplerMax];
2007-11-14 02:02:18 +00:00
typedef struct ALbufferlistitem
{
struct ALbuffer *buffer;
2007-11-14 02:02:18 +00:00
struct ALbufferlistitem *next;
struct ALbufferlistitem *prev;
2007-11-14 02:02:18 +00:00
} ALbufferlistitem;
typedef struct HrtfState {
ALboolean Moving;
ALuint Counter;
ALfloat History[MAXCHANNELS][SRC_HISTORY_LENGTH];
ALfloat Values[MAXCHANNELS][HRIR_LENGTH][2];
ALuint Offset;
} HrtfState;
2012-04-27 07:45:42 +00:00
typedef struct HrtfParams {
ALfloat Gain;
ALfloat Dir[3];
ALfloat Coeffs[MAXCHANNELS][HRIR_LENGTH][2];
ALuint Delay[MAXCHANNELS][2];
ALfloat CoeffStep[HRIR_LENGTH][2];
ALint DelayStep[2];
} HrtfParams;
typedef struct DirectParams {
HrtfParams Hrtf;
/* A mixing matrix. First subscript is the channel number of the input data
* (regardless of channel configuration) and the second is the channel
* target (eg. FRONT_LEFT). Not used with HRTF. */
ALfloat Gains[MAXCHANNELS][MAXCHANNELS];
/* A low-pass filter, using 2 chained one-pole filters. */
FILTER iirFilter;
ALfloat history[MAXCHANNELS*2];
} DirectParams;
typedef struct SendParams {
/* Gain control, which applies to all input channels to a single (mono)
* output buffer. */
ALfloat Gain;
/* A low-pass filter, using a one-pole filter. */
FILTER iirFilter;
ALfloat history[MAXCHANNELS];
} SendParams;
2012-04-27 07:45:42 +00:00
typedef struct ALsource
2007-11-14 02:02:18 +00:00
{
2012-04-26 10:26:22 +00:00
/** Source properties. */
2012-04-20 04:46:29 +00:00
volatile ALfloat Pitch;
volatile ALfloat Gain;
volatile ALfloat OuterGain;
volatile ALfloat MinGain;
volatile ALfloat MaxGain;
volatile ALfloat InnerAngle;
volatile ALfloat OuterAngle;
volatile ALfloat RefDistance;
volatile ALfloat MaxDistance;
volatile ALfloat RollOffFactor;
volatile ALfloat Position[3];
volatile ALfloat Velocity[3];
volatile ALfloat Orientation[3];
volatile ALboolean HeadRelative;
volatile ALboolean Looping;
2011-09-11 08:18:57 +00:00
volatile enum DistanceModel DistanceModel;
volatile ALboolean DirectChannels;
2007-11-14 02:02:18 +00:00
2011-09-11 08:18:57 +00:00
volatile ALboolean DryGainHFAuto;
volatile ALboolean WetGainAuto;
volatile ALboolean WetGainHFAuto;
volatile ALfloat OuterGainHF;
2011-09-11 08:18:57 +00:00
volatile ALfloat AirAbsorptionFactor;
volatile ALfloat RoomRolloffFactor;
volatile ALfloat DopplerFactor;
2012-04-26 10:26:22 +00:00
enum Resampler Resampler;
/**
* Last user-specified offset, and the offset type (bytes, samples, or
* seconds).
*/
ALdouble Offset;
ALenum OffsetType;
2007-11-14 02:02:18 +00:00
2012-04-26 10:26:22 +00:00
/** Source type (static, streaming, or undetermined) */
2012-04-20 04:46:29 +00:00
volatile ALint SourceType;
2007-11-14 02:02:18 +00:00
2012-04-26 10:26:22 +00:00
/** Source state (initial, playing, paused, or stopped) */
volatile ALenum state;
ALenum new_state;
/**
* Source offset in samples, relative to the currently playing buffer, NOT
* the whole queue, and the fractional (fixed-point) offset to the next
* sample.
*/
ALuint position;
ALuint position_fraction;
/** Source Buffer Queue info. */
ALbufferlistitem *queue;
ALuint BuffersInQueue;
ALuint BuffersPlayed;
/** Current buffer sample info. */
ALuint NumChannels;
ALuint SampleSize;
2012-04-26 10:26:22 +00:00
/** Direct filter and auxiliary send info. */
ALfloat DirectGain;
ALfloat DirectGainHF;
struct {
struct ALeffectslot *Slot;
2012-04-27 07:45:42 +00:00
ALfloat Gain;
ALfloat GainHF;
2012-04-26 10:26:22 +00:00
} Send[MAX_SENDS];
/** HRTF info. */
2012-04-27 07:45:42 +00:00
HrtfState Hrtf;
2011-05-01 20:21:56 +00:00
2012-04-26 10:26:22 +00:00
/** Current target parameters used for mixing. */
struct {
DryMixerFunc DryMix;
WetMixerFunc WetMix;
ALint Step;
DirectParams Direct;
struct ALeffectslot *Slot[MAX_SENDS];
SendParams Send[MAX_SENDS];
} Params;
2012-04-26 10:26:22 +00:00
/** Source needs to update its mixing parameters. */
2011-08-29 20:43:59 +00:00
volatile ALenum NeedsUpdate;
2012-04-26 10:26:22 +00:00
/** Method to update mixing parameters. */
ALvoid (*Update)(struct ALsource *self, const ALCcontext *context);
2012-04-26 10:26:22 +00:00
/** Self ID */
ALuint id;
2007-11-14 02:02:18 +00:00
} ALsource;
#define ALsource_Update(s,a) ((s)->Update(s,a))
2007-11-14 02:02:18 +00:00
ALvoid SetSourceState(ALsource *Source, ALCcontext *Context, ALenum state);
ALboolean ApplyOffset(ALsource *Source);
ALvoid ReleaseALSources(ALCcontext *Context);
2007-11-14 02:02:18 +00:00
#ifdef __cplusplus
}
#endif
#endif