Added OpenAL capture support.
git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4513 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
e8b6c874a2
commit
38305b4f06
4 changed files with 121 additions and 9 deletions
|
@ -116,9 +116,12 @@ static AL_API void (AL_APIENTRY *palSourceUnqueueBuffers)(ALuint source, ALsizei
|
||||||
typedef char ALCboolean;
|
typedef char ALCboolean;
|
||||||
typedef char ALCchar;
|
typedef char ALCchar;
|
||||||
typedef int ALCint;
|
typedef int ALCint;
|
||||||
|
typedef unsigned int ALCuint;
|
||||||
typedef int ALCenum;
|
typedef int ALCenum;
|
||||||
|
typedef size_t ALCsizei;
|
||||||
typedef struct ALCdevice_struct ALCdevice;
|
typedef struct ALCdevice_struct ALCdevice;
|
||||||
typedef struct ALCcontext_struct ALCcontext;
|
typedef struct ALCcontext_struct ALCcontext;
|
||||||
|
typedef void ALCvoid;
|
||||||
|
|
||||||
static ALC_API ALCdevice * (ALC_APIENTRY *palcOpenDevice)( const ALCchar *devicename );
|
static ALC_API ALCdevice * (ALC_APIENTRY *palcOpenDevice)( const ALCchar *devicename );
|
||||||
static ALC_API ALCboolean (ALC_APIENTRY *palcCloseDevice)( ALCdevice *device );
|
static ALC_API ALCboolean (ALC_APIENTRY *palcCloseDevice)( ALCdevice *device );
|
||||||
|
@ -134,14 +137,12 @@ static ALC_API ALCboolean (ALC_APIENTRY *palcIsExtensionPresent)( ALCdevice
|
||||||
#define ALC_DEFAULT_DEVICE_SPECIFIER 0x1004
|
#define ALC_DEFAULT_DEVICE_SPECIFIER 0x1004
|
||||||
#define ALC_DEVICE_SPECIFIER 0x1005
|
#define ALC_DEVICE_SPECIFIER 0x1005
|
||||||
#define ALC_EXTENSIONS 0x1006
|
#define ALC_EXTENSIONS 0x1006
|
||||||
#define ALC_ALL_DEVICES_SPECIFIER 0x1013
|
#define ALC_ALL_DEVICES_SPECIFIER 0x1013 //ALC_ENUMERATE_ALL_EXT
|
||||||
|
|
||||||
//#include "AL/alut.h"
|
//#include "AL/alut.h"
|
||||||
//#include "AL/al.h"
|
//#include "AL/al.h"
|
||||||
//#include "AL/alext.h"
|
//#include "AL/alext.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//efx
|
//efx
|
||||||
#define AL_AUXILIARY_SEND_FILTER 0x20006
|
#define AL_AUXILIARY_SEND_FILTER 0x20006
|
||||||
#define AL_FILTER_NULL 0x0000
|
#define AL_FILTER_NULL 0x0000
|
||||||
|
@ -202,6 +203,19 @@ static AL_API ALvoid (AL_APIENTRY *palEffectiv)(ALuint effect, ALenum param, con
|
||||||
static AL_API ALvoid (AL_APIENTRY *palEffectf)(ALuint effect, ALenum param, ALfloat flValue);
|
static AL_API ALvoid (AL_APIENTRY *palEffectf)(ALuint effect, ALenum param, ALfloat flValue);
|
||||||
static AL_API ALvoid (AL_APIENTRY *palEffectfv)(ALuint effect, ALenum param, const ALfloat *pflValues);
|
static AL_API ALvoid (AL_APIENTRY *palEffectfv)(ALuint effect, ALenum param, const ALfloat *pflValues);
|
||||||
|
|
||||||
|
//capture-specific stuff
|
||||||
|
static ALC_API void (ALC_APIENTRY *palcGetIntegerv)( ALCdevice *device, ALCenum param, ALCsizei size, ALCint *data );
|
||||||
|
static ALC_API ALCdevice * (ALC_APIENTRY *palcCaptureOpenDevice)( const ALCchar *devicename, ALCuint frequency, ALCenum format, ALCsizei buffersize );
|
||||||
|
static ALC_API ALCboolean (ALC_APIENTRY *palcCaptureCloseDevice)( ALCdevice *device );
|
||||||
|
static ALC_API void (ALC_APIENTRY *palcCaptureStart)( ALCdevice *device );
|
||||||
|
static ALC_API void (ALC_APIENTRY *palcCaptureStop)( ALCdevice *device );
|
||||||
|
static ALC_API void (ALC_APIENTRY *palcCaptureSamples)( ALCdevice *device, ALCvoid *buffer, ALCsizei samples );
|
||||||
|
#define ALC_CAPTURE_DEVICE_SPECIFIER 0x310
|
||||||
|
#define ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER 0x311
|
||||||
|
#define ALC_CAPTURE_SAMPLES 0x312
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define SOUNDVARS "OpenAL variables"
|
#define SOUNDVARS "OpenAL variables"
|
||||||
|
|
||||||
|
@ -229,7 +243,8 @@ static cvar_t s_al_speedofsound = CVARFC("s_al_speedofsound", "343.3",0,OnChange
|
||||||
static cvar_t s_al_dopplerfactor = CVARFC("s_al_dopplerfactor", "3.0",0,OnChangeALDopplerFactor);
|
static cvar_t s_al_dopplerfactor = CVARFC("s_al_dopplerfactor", "3.0",0,OnChangeALDopplerFactor);
|
||||||
static cvar_t s_al_distancemodel = CVARFC("s_al_distancemodel", "2",0,OnChangeALDistanceModel);
|
static cvar_t s_al_distancemodel = CVARFC("s_al_distancemodel", "2",0,OnChangeALDistanceModel);
|
||||||
static cvar_t s_al_rolloff_factor = CVAR("s_al_rolloff_factor", "1");
|
static cvar_t s_al_rolloff_factor = CVAR("s_al_rolloff_factor", "1");
|
||||||
static cvar_t s_al_reference_distance = CVAR("s_al_reference_distance", "120");static cvar_t s_al_velocityscale = CVAR("s_al_velocityscale", "1");
|
static cvar_t s_al_reference_distance = CVAR("s_al_reference_distance", "120");
|
||||||
|
static cvar_t s_al_velocityscale = CVAR("s_al_velocityscale", "1");
|
||||||
static cvar_t s_al_static_listener = CVAR("s_al_static_listener", "0"); //cheat
|
static cvar_t s_al_static_listener = CVAR("s_al_static_listener", "0"); //cheat
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
|
@ -379,6 +394,7 @@ static void OpenAL_ListenerUpdate(soundcardinfo_t *sc, vec3_t origin, vec3_t for
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//schanged says the sample has changed, otherwise its merely moved around a little, maybe changed in volume, but nothing that will restart it.
|
||||||
static void OpenAL_ChannelUpdate(soundcardinfo_t *sc, channel_t *chan, unsigned int schanged)
|
static void OpenAL_ChannelUpdate(soundcardinfo_t *sc, channel_t *chan, unsigned int schanged)
|
||||||
{
|
{
|
||||||
oalinfo_t *oali = sc->handle;
|
oalinfo_t *oali = sc->handle;
|
||||||
|
@ -904,6 +920,7 @@ static qboolean QDECL OpenAL_InitCard(soundcardinfo_t *sc, const char *devname)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define SDRVNAME "OpenAL"
|
||||||
static qboolean QDECL OpenAL_Enumerate(void (QDECL *callback)(const char *driver, const char *devicecode, const char *readabledevice))
|
static qboolean QDECL OpenAL_Enumerate(void (QDECL *callback)(const char *driver, const char *devicecode, const char *readabledevice))
|
||||||
{
|
{
|
||||||
const char *devnames;
|
const char *devnames;
|
||||||
|
@ -915,7 +932,7 @@ static qboolean QDECL OpenAL_Enumerate(void (QDECL *callback)(const char *driver
|
||||||
devnames = palcGetString(NULL, ALC_DEVICE_SPECIFIER);
|
devnames = palcGetString(NULL, ALC_DEVICE_SPECIFIER);
|
||||||
while(*devnames)
|
while(*devnames)
|
||||||
{
|
{
|
||||||
callback("OpenAL", devnames, va("OAL:%s", devnames));
|
callback(SDRVNAME, devnames, va("OAL:%s", devnames));
|
||||||
devnames += strlen(devnames)+1;
|
devnames += strlen(devnames)+1;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
@ -923,9 +940,104 @@ static qboolean QDECL OpenAL_Enumerate(void (QDECL *callback)(const char *driver
|
||||||
|
|
||||||
sounddriver_t OPENAL_Output =
|
sounddriver_t OPENAL_Output =
|
||||||
{
|
{
|
||||||
"OpenAL",
|
SDRVNAME,
|
||||||
OpenAL_InitCard,
|
OpenAL_InitCard,
|
||||||
OpenAL_Enumerate
|
OpenAL_Enumerate
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(VOICECHAT)
|
||||||
|
|
||||||
|
qboolean OpenAL_InitCapture(void)
|
||||||
|
{
|
||||||
|
if (!OpenAL_InitLibrary())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
//is there really much point checking for the name when the functions should exist or not regardless?
|
||||||
|
//if its not really supported, I would trust the open+enumerate operations to reliably fail. the functions are exported as actual symbols after all, not some hidden driver feature.
|
||||||
|
//it doesn't really matter if the default driver supports it, so long as one does, I guess.
|
||||||
|
//if (!palcIsExtensionPresent(NULL, "ALC_EXT_capture"))
|
||||||
|
// return false;
|
||||||
|
|
||||||
|
if(!palcCaptureOpenDevice)
|
||||||
|
{
|
||||||
|
palcGetIntegerv = Sys_GetAddressForName(openallib, "alcGetIntegerv");
|
||||||
|
|
||||||
|
palcCaptureOpenDevice = Sys_GetAddressForName(openallib, "alcCaptureOpenDevice");
|
||||||
|
palcCaptureStart = Sys_GetAddressForName(openallib, "alcCaptureStart");
|
||||||
|
palcCaptureSamples = Sys_GetAddressForName(openallib, "alcCaptureSamples");
|
||||||
|
palcCaptureStop = Sys_GetAddressForName(openallib, "alcCaptureStop");
|
||||||
|
palcCaptureCloseDevice = Sys_GetAddressForName(openallib, "alcCaptureCloseDevice");
|
||||||
|
}
|
||||||
|
|
||||||
|
return palcGetIntegerv&&palcCaptureOpenDevice&&palcCaptureStart&&palcCaptureSamples&&palcCaptureStop&&palcCaptureCloseDevice;
|
||||||
|
}
|
||||||
|
qboolean QDECL OPENAL_Capture_Enumerate (void (QDECL *callback) (const char *drivername, const char *devicecode, const char *readablename))
|
||||||
|
{
|
||||||
|
const char *devnames;
|
||||||
|
if (!OpenAL_InitCapture())
|
||||||
|
return true; //enumerate nothing if al is disabled
|
||||||
|
|
||||||
|
devnames = palcGetString(NULL, ALC_CAPTURE_DEVICE_SPECIFIER);
|
||||||
|
while(*devnames)
|
||||||
|
{
|
||||||
|
callback(SDRVNAME, devnames, va("OAL:%s", devnames));
|
||||||
|
devnames += strlen(devnames)+1;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//fte's capture api specifies mono 16.
|
||||||
|
void *QDECL OPENAL_Capture_Init (int samplerate, const char *device)
|
||||||
|
{
|
||||||
|
if (!device) //no default devices please, too buggy for that.
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (!OpenAL_InitCapture())
|
||||||
|
return NULL; //enumerate nothing if al is disabled
|
||||||
|
|
||||||
|
if (!device || !*device)
|
||||||
|
device = palcGetString(NULL, ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER);
|
||||||
|
|
||||||
|
return palcCaptureOpenDevice(device, samplerate, AL_FORMAT_MONO16, 0.5*samplerate);
|
||||||
|
}
|
||||||
|
void QDECL OPENAL_Capture_Start (void *ctx)
|
||||||
|
{
|
||||||
|
ALCdevice *device = ctx;
|
||||||
|
palcCaptureStart(device);
|
||||||
|
}
|
||||||
|
unsigned int QDECL OPENAL_Capture_Update (void *ctx, unsigned char *buffer, unsigned int minbytes, unsigned int maxbytes)
|
||||||
|
{
|
||||||
|
#define samplesize sizeof(short)
|
||||||
|
ALCdevice *device = ctx;
|
||||||
|
int avail = 0;
|
||||||
|
palcGetIntegerv(device, ALC_CAPTURE_SAMPLES, sizeof(ALint), &avail);
|
||||||
|
if (avail*samplesize < minbytes)
|
||||||
|
return 0; //don't bother grabbing it if its below the threshold.
|
||||||
|
palcCaptureSamples(device, (ALCvoid *)buffer, avail);
|
||||||
|
return avail * samplesize;
|
||||||
|
}
|
||||||
|
void QDECL OPENAL_Capture_Stop (void *ctx)
|
||||||
|
{
|
||||||
|
ALCdevice *device = ctx;
|
||||||
|
palcCaptureStop(device);
|
||||||
|
}
|
||||||
|
void QDECL OPENAL_Capture_Shutdown (void *ctx)
|
||||||
|
{
|
||||||
|
ALCdevice *device = ctx;
|
||||||
|
palcCaptureCloseDevice(device);
|
||||||
|
}
|
||||||
|
|
||||||
|
snd_capture_driver_t OPENAL_Capture =
|
||||||
|
{
|
||||||
|
1,
|
||||||
|
SDRVNAME,
|
||||||
|
OPENAL_Capture_Enumerate,
|
||||||
|
OPENAL_Capture_Init,
|
||||||
|
OPENAL_Capture_Start,
|
||||||
|
OPENAL_Capture_Update,
|
||||||
|
OPENAL_Capture_Stop,
|
||||||
|
OPENAL_Capture_Shutdown
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1062,7 +1062,7 @@ static qboolean QDECL DSOUND_Capture_Enumerate (void (QDECL *callback) (const ch
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *QDECL DSOUND_Capture_Init (int rate, char *device)
|
static void *QDECL DSOUND_Capture_Init (int rate, const char *device)
|
||||||
{
|
{
|
||||||
dsndcapture_t *result;
|
dsndcapture_t *result;
|
||||||
DSCBUFFERDESC bufdesc;
|
DSCBUFFERDESC bufdesc;
|
||||||
|
|
|
@ -365,7 +365,7 @@ static qboolean QDECL OSS_Capture_Enumerate (void (QDECL *callback) (const char
|
||||||
//SNDCTL_CARDINFO
|
//SNDCTL_CARDINFO
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
void *OSS_Capture_Init(int rate, char *snddev)
|
void *OSS_Capture_Init(int rate, const char *snddev)
|
||||||
{
|
{
|
||||||
int tmp;
|
int tmp;
|
||||||
intptr_t fd;
|
intptr_t fd;
|
||||||
|
|
|
@ -315,7 +315,7 @@ typedef struct
|
||||||
int apiver;
|
int apiver;
|
||||||
char *drivername;
|
char *drivername;
|
||||||
qboolean (QDECL *Enumerate) (void (QDECL *callback) (const char *drivername, const char *devicecode, const char *readablename));
|
qboolean (QDECL *Enumerate) (void (QDECL *callback) (const char *drivername, const char *devicecode, const char *readablename));
|
||||||
void *(QDECL *Init) (int samplerate, char *device); /*create a new context*/
|
void *(QDECL *Init) (int samplerate, const char *device); /*create a new context*/
|
||||||
void (QDECL *Start) (void *ctx); /*begin grabbing new data, old data is potentially flushed*/
|
void (QDECL *Start) (void *ctx); /*begin grabbing new data, old data is potentially flushed*/
|
||||||
unsigned int (QDECL *Update) (void *ctx, unsigned char *buffer, unsigned int minbytes, unsigned int maxbytes); /*grab the data into a different buffer*/
|
unsigned int (QDECL *Update) (void *ctx, unsigned char *buffer, unsigned int minbytes, unsigned int maxbytes); /*grab the data into a different buffer*/
|
||||||
void (QDECL *Stop) (void *ctx); /*stop grabbing new data, old data may remain*/
|
void (QDECL *Stop) (void *ctx); /*stop grabbing new data, old data may remain*/
|
||||||
|
|
Loading…
Reference in a new issue