// OpenALDemo.cpp : Defines the entry point for the console application.
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define PI 3.141592654
// EAX 2.0 GUIDs
const GUID DSPROPSETID_EAX20_ListenerProperties
= { 0x306a6a8, 0xb224, 0x11d2, { 0x99, 0xe5, 0x0, 0x0, 0xe8, 0xd8, 0xc7, 0x22 } };
const GUID DSPROPSETID_EAX20_BufferProperties
= { 0x306a6a7, 0xb224, 0x11d2, {0x99, 0xe5, 0x0, 0x0, 0xe8, 0xd8, 0xc7, 0x22 } };
#define NUM_BUFFERS 7 // Number of buffers to be Generated
typedef struct
{
ALubyte riff[4]; // 'RIFF'
ALsizei riffSize;
ALubyte wave[4]; // 'WAVE'
ALubyte fmt[4]; // 'fmt '
ALuint fmtSize;
ALushort Format;
ALushort Channels;
ALuint SamplesPerSec;
ALuint BytesPerSec;
ALushort BlockAlign;
ALushort BitsPerSample;
ALubyte data[4]; // 'data'
ALuint dataSize;
} WAVE_Struct;
// Global variables
EAXSet eaxSet; // EAXSet function, retrieved if EAX Extension is supported
EAXGet eaxGet; // EAXGet function, retrieved if EAX Extension is supported
ALboolean g_bEAX; // Boolean variable to indicate presence of EAX 2.0 Extension
ALuint g_Buffers[NUM_BUFFERS]; // Array of Buffer IDs
// Function prototypes
ALvoid DisplayALError(ALubyte *szText, ALint errorCode);
// Test Function prototypes
ALvoid PositionTest(ALvoid);
ALvoid LoopingTest(ALvoid);
ALvoid EAXTest(ALvoid);
ALvoid QueueTest(ALvoid);
ALvoid BufferTest(ALvoid);
ALvoid FreqTest(ALvoid);
ALvoid StereoTest(ALvoid);
ALvoid GainTest(ALvoid);
ALvoid StreamingTest(ALvoid);
ALvoid RelativeTest(ALvoid);
ALvoid CreationDeletionTest(ALvoid);
ALvoid MultipleSourcesTest(ALvoid);
ALvoid SourceRollOffTest(ALvoid);
/*
Display AL Error message
*/
ALvoid DisplayALError(ALbyte *szText, ALint errorcode)
{
printf("%s%s", szText, alGetString(errorcode));
}
/*
Main application - Initializes Open AL, Sets up Listener, Generates Buffers, and loads in audio data.
Displays Test Menu and calls appropriate Test functions. On exit, buffers are destroyed and Open AL
is shutdown.
Each Test function is responsible for creating and destroying whatever Sources they require. All test
applications use the same set of Buffers (created in this function).
*/
int main(int argc, char* argv[])
{
ALubyte szFnName[128];
ALbyte ch;
ALint error;
ALsizei size,freq;
ALenum format;
ALvoid *data;
ALboolean loop;
ALCcontext *Context;
ALCdevice *Device;
char deviceName[256];
char *defaultDevice;
char *deviceList;
char *devices[12];
int numDevices, numDefaultDevice, i;
ALfloat listenerPos[]={0.0,0.0,0.0};
ALfloat listenerVel[]={0.0,0.0,0.0};
ALfloat listenerOri[]={0.0,0.0,-1.0, 0.0,1.0,0.0}; // Listener facing into the screen
printf("OpenAL Test application\n\n");
// Initialize Open AL manually
//Open device
strcpy(deviceName, "");
if (alcIsExtensionPresent(NULL, (ALubyte*)"ALC_ENUMERATION_EXT") == AL_TRUE) { // try out enumeration extension
defaultDevice = (char *)alcGetString(NULL, ALC_DEFAULT_DEVICE_SPECIFIER);
deviceList = (char *)alcGetString(NULL, ALC_DEVICE_SPECIFIER);
for (numDevices = 0; numDevices < 12; numDevices++) {devices[numDevices] = NULL;}
for (numDevices = 0; numDevices < 12; numDevices++) {
devices[numDevices] = deviceList;
if (strcmp(devices[numDevices], defaultDevice) == 0) {
numDefaultDevice = numDevices;
}
deviceList += strlen(deviceList);
if (deviceList[0] == 0) {
if (deviceList[1] == 0) {
break;
} else {
deviceList += 1;
}
}
}
if (devices[numDevices] != NULL) {
numDevices++;
printf("\nEnumeration extension found -- select an output device:\n");
printf("0. NULL Device (Default)\n");
for (i = 0; i < numDevices; i++) {
printf("%d. %s\n", i + 1, devices[i]);
}
printf("\n\n");
do {
ch = _getch();
i = atoi(&ch);
} while ((i < 0) || (i > numDevices));
if ((i != 0) && (strlen(devices[i-1]) < 256)) {
strcpy(deviceName, devices[i-1]);
}
}
}
if (strlen(deviceName) == 0) {
Device = alcOpenDevice(NULL); // this is supposed to select the "preferred device"
} else {
Device = alcOpenDevice((ALubyte*)deviceName); // have a name from enumeration process above, so use it...
}
if (Device == NULL)
{
printf("Failed to Initialize Open AL\n");
exit(-1);
}
//Create context(s)
Context=alcCreateContext(Device,NULL);
if (Context == NULL)
{
printf("Failed to initialize Open AL\n");
exit(-1);
}
//Set active context
alcGetError(Device);
alcMakeContextCurrent(Context);
if (alcGetError(Device) != ALC_NO_ERROR)
{
printf("Failed to Make Context Current\n");
exit(-1);
}
// Clear Error Code
alGetError();
alcGetError(Device);
// Set Listener attributes
// Position ...
alListenerfv(AL_POSITION,listenerPos);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alListenerfv POSITION : ", error);
exit(-1);
}
// Velocity ...
alListenerfv(AL_VELOCITY,listenerVel);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alListenerfv VELOCITY : ", error);
exit(-1);
}
// Orientation ...
alListenerfv(AL_ORIENTATION,listenerOri);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alListenerfv ORIENTATION : ", error);
exit(-1);
}
// Generate Buffers
alGenBuffers(NUM_BUFFERS, g_Buffers);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alGenBuffers :", error);
exit(-1);
}
// Load in samples to be used by Test functions
// Load footsteps.wav
alutLoadWAVFile("footsteps.wav",&format,&data,&size,&freq,&loop);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alutLoadWAVFile footsteps.wav : ", error);
// Delete Buffers
alDeleteBuffers(NUM_BUFFERS, g_Buffers);
exit(-1);
}
// Copy footsteps.wav data into AL Buffer 0
alBufferData(g_Buffers[0],format,data,size,freq);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alBufferData buffer 0 : ", error);
// Delete buffers
alDeleteBuffers(NUM_BUFFERS, g_Buffers);
exit(-1);
}
// Unload footsteps.wav
alutUnloadWAV(format,data,size,freq);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alutUnloadWAV : ", error);
// Delete buffers
alDeleteBuffers(NUM_BUFFERS, g_Buffers);
exit(-1);
}
// Load ding.wav
alutLoadWAVFile("ding.wav",&format,&data,&size,&freq,&loop);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alutLoadWAVFile ding.wav : ", error);
// Delete buffers
alDeleteBuffers(NUM_BUFFERS, g_Buffers);
exit (-1);
}
// Copy ding.wav audio data into AL Buffer 1
alBufferData(g_Buffers[1],format,data,size,freq);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alBufferData buffer 1 : ", error);
// Delete buffers
alDeleteBuffers(NUM_BUFFERS, g_Buffers);
exit(-1);
}
// Unload ding.wav
alutUnloadWAV(format,data,size,freq);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alutUnloadWAV : ", error);
// Delete buffers
alDeleteBuffers(NUM_BUFFERS, g_Buffers);
exit(-1);
}
// Load wave1.wav
alutLoadWAVFile("wave1.wav",&format,&data,&size,&freq,&loop);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alutLoadWAVFile wave1.wav : ", error);
// Delete Buffers
alDeleteBuffers(NUM_BUFFERS, g_Buffers);
exit(-1);
}
// Copy wave1.wav data into AL Buffer 2
alBufferData(g_Buffers[2],format,data,size,freq);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alBufferData buffer 2 : ", error);
// Delete buffers
alDeleteBuffers(NUM_BUFFERS, g_Buffers);
exit(-1);
}
// Unload wave1.wav
alutUnloadWAV(format,data,size,freq);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alutUnloadWAV : ", error);
// Delete buffers
alDeleteBuffers(NUM_BUFFERS, g_Buffers);
exit(-1);
}
// Load wave2.wav
alutLoadWAVFile("wave2.wav",&format,&data,&size,&freq,&loop);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alutLoadWAVFile wave2.wav : ", error);
// Delete Buffers
alDeleteBuffers(NUM_BUFFERS, g_Buffers);
exit(-1);
}
// Copy wave2.wav data into AL Buffer 3
alBufferData(g_Buffers[3],format,data,size,freq);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alBufferData buffer 3 : ", error);
// Delete buffers
alDeleteBuffers(NUM_BUFFERS, g_Buffers);
exit(-1);
}
// Unload wave2.wav
alutUnloadWAV(format,data,size,freq);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alutUnloadWAV : ", error);
// Delete buffers
alDeleteBuffers(NUM_BUFFERS, g_Buffers);
exit(-1);
}
// Load wave3.wav
alutLoadWAVFile("wave3.wav",&format,&data,&size,&freq,&loop);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alutLoadWAVFile wave3.wav : ", error);
// Delete Buffers
alDeleteBuffers(NUM_BUFFERS, g_Buffers);
exit(-1);
}
// Copy wave3.wav data into AL Buffer 4
alBufferData(g_Buffers[4],format,data,size,freq);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alBufferData buffer 4 : ", error);
// Delete buffers
alDeleteBuffers(NUM_BUFFERS, g_Buffers);
exit(-1);
}
// Unload wave3.wav
alutUnloadWAV(format,data,size,freq);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alutUnloadWAV : ", error);
// Delete buffers
alDeleteBuffers(NUM_BUFFERS, g_Buffers);
exit(-1);
}
// Load wave4.wav
alutLoadWAVFile("wave4.wav",&format,&data,&size,&freq,&loop);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alutLoadWAVFile wave4.wav : ", error);
// Delete Buffers
alDeleteBuffers(NUM_BUFFERS, g_Buffers);
exit(-1);
}
// Copy wave4.wav data into AL Buffer 5
alBufferData(g_Buffers[5],format,data,size,freq);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alBufferData buffer 5 : ", error);
// Delete buffers
alDeleteBuffers(NUM_BUFFERS, g_Buffers);
exit(-1);
}
// Unload wave4.wav
alutUnloadWAV(format,data,size,freq);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alutUnloadWAV : ", error);
// Delete buffers
alDeleteBuffers(NUM_BUFFERS, g_Buffers);
exit(-1);
}
// Load stereo.wav
alutLoadWAVFile("stereo.wav",&format,&data,&size,&freq,&loop);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alutLoadWAVFile stereo.wav : ", error);
// Delete Buffers
alDeleteBuffers(NUM_BUFFERS, g_Buffers);
exit(-1);
}
// Copy stereo.wav data into AL Buffer 6
alBufferData(g_Buffers[6],format,data,size,freq);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alBufferData buffer 6 : ", error);
// Delete buffers
alDeleteBuffers(NUM_BUFFERS, g_Buffers);
exit(-1);
}
// Unload stereo.wav
alutUnloadWAV(format,data,size,freq);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alutUnloadWAV : ", error);
// Delete buffers
alDeleteBuffers(NUM_BUFFERS, g_Buffers);
exit(-1);
}
// Check for EAX 2.0 support
g_bEAX = alIsExtensionPresent((ALubyte*)"EAX2.0");
if (g_bEAX)
printf("EAX 2.0 Extension available\n");
sprintf((char*)szFnName, "EAXSet");
eaxSet = (EAXSet)alGetProcAddress(szFnName);
if (eaxSet == NULL)
g_bEAX = false;
sprintf((char*)szFnName,"EAXGet");
eaxGet = (EAXGet)alGetProcAddress(szFnName);
if (eaxGet == NULL)
g_bEAX = false;
do
{
printf("\nSelect a test from the following options\n\n");
printf("1 Position Test\n");
printf("2 Looping Test\n");
printf("3 EAX 2.0 Test\n");
printf("4 Queue Test\n");
printf("5 Buffer Test\n");
printf("6 Frequency Test\n");
printf("7 Stereo Test\n");
printf("8 Gain Test\n");
printf("9 Streaming Test\n");
printf("A Source Relative Test\n");
printf("B Generate / Delete Sources Test\n");
printf("C Multiple Sources Test\n");
printf("D Source Roll-off Test\n");
printf("Q to quit\n\n\n");
ch = _getch();
ch = toupper( ch );
switch (ch)
{
case '1':
PositionTest();
break;
case '2':
LoopingTest();
break;
case '3':
if (g_bEAX)
EAXTest();
else
printf("EAX Extensions NOT available. Please select another test\n");
break;
case '4':
QueueTest();
break;
case '5':
BufferTest();
break;
case '6':
FreqTest();
break;
case '7':
StereoTest();
break;
case '8':
GainTest();
break;
case '9':
StreamingTest();
break;
case 'A':
RelativeTest();
break;
case 'B':
CreationDeletionTest();
break;
case 'C':
MultipleSourcesTest();
break;
case 'D':
SourceRollOffTest();
break;
default:
break;
}
} while (ch != 'Q');
alDeleteBuffers(NUM_BUFFERS, g_Buffers);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alDeleteBuffers : ", error);
exit(-1);
}
//Get active context
Context=alcGetCurrentContext();
//Get device for active context
Device=alcGetContextsDevice(Context);
//Disable context
alcMakeContextCurrent(NULL);
//Release context(s)
alcDestroyContext(Context);
//Close device
alcCloseDevice(Device);
return 0;
}
/*
Buffer Test
Dynamically attach and unattach different buffers to a single Source
*/
ALvoid BufferTest(ALvoid)
{
ALuint source[1];
ALint error;
char ch;
ALfloat source0Pos[]={ 2.0, 0.0,-2.0}; // Front and right of the listener
ALfloat source0Vel[]={ 0.0, 0.0, 0.0};
alGenSources(1,source);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alGenSources 2 : ", error);
return;
}
alSourcef(source[0],AL_PITCH,1.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef 0 AL_PITCH : \n", error);
alSourcef(source[0],AL_GAIN,1.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef 0 AL_GAIN : \n", error);
alSourcefv(source[0],AL_POSITION,source0Pos);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcefv 0 AL_POSITION : \n", error);
alSourcefv(source[0],AL_VELOCITY,source0Vel);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcefv 0 AL_VELOCITY : \n", error);
alSourcei(source[0],AL_LOOPING,AL_FALSE);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 0 AL_LOOPING true: \n", error);
printf("Buffer Test\n");
printf("Press '1' to play buffer 0 on source 0\n");
printf("Press '2' to play buffer 1 on source 0\n");
printf("Press '3' to stop source 0\n");
printf("Press 'q' to quit\n");
do
{
ch = _getch();
ch = toupper( ch );
switch (ch)
{
case '1':
// Stop source
alSourceStop(source[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceStop 0 : ", error);
// Attach buffer 0 to source
alSourcei(source[0], AL_BUFFER, g_Buffers[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei AL_BUFFER 0 : ", error);
// Play
alSourcePlay(source[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcePlay 0 : ", error);
break;
case '2':
// Stop source
alSourceStop(source[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceStop 0 : ", error);
// Attach buffer 0 to source
alSourcei(source[0], AL_BUFFER, g_Buffers[1]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei AL_BUFFER 1 : ", error);
// Play
alSourcePlay(source[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcePlay 0 : ", error);
break;
case '3':
// Stop source
alSourceStop(source[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceStop 0 : ", error);
break;
}
} while (ch != 'Q');
// Release resources
alSourceStopv(1, source);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceStopv 1 : ", error);
alDeleteSources(1, source);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alDeleteSources 1 : ", error);
return;
}
/*
Position Test
Creates 2 Sources - one to the front right of the listener, and one to the rear left of the listener
*/
ALvoid PositionTest(ALvoid)
{
ALint error;
ALuint source[2];
ALbyte ch;
ALfloat source0Pos[]={ -2.0, 0.0, 2.0}; // Behind and to the left of the listener
ALfloat source0Vel[]={ 0.0, 0.0, 0.0};
ALfloat source1Pos[]={ 2.0, 0.0, -2.0}; // Front and to the right of the listener
ALfloat source1Vel[]={ 0.0, 0.0, 0.0};
alGenSources(2,source);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alGenSources 2 : ", error);
return;
}
alSourcef(source[0],AL_PITCH,1.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef 0 AL_PITCH : \n", error);
alSourcef(source[0],AL_GAIN,1.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef 0 AL_GAIN : \n", error);
alSourcefv(source[0],AL_POSITION,source0Pos);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcefv 0 AL_POSITION : \n", error);
alSourcefv(source[0],AL_VELOCITY,source0Vel);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcefv 0 AL_VELOCITY : \n", error);
alSourcei(source[0],AL_BUFFER, g_Buffers[1]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 0 AL_BUFFER buffer 0 : \n", error);
alSourcei(source[0],AL_LOOPING,AL_TRUE);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 0 AL_LOOPING true: \n", error);
alSourcef(source[1],AL_PITCH,1.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef 1 AL_PITCH : \n", error);
alSourcef(source[1],AL_GAIN,1.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef 1 AL_GAIN : \n", error);
alSourcefv(source[1],AL_POSITION,source1Pos);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcefv 1 AL_POSITION : \n", error);
alSourcefv(source[1],AL_VELOCITY,source1Vel);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcefv 1 AL_VELOCITY : \n", error);
alSourcei(source[1],AL_BUFFER, g_Buffers[1]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 1 AL_BUFFER buffer 1 : \n", error);
alSourcei(source[1],AL_LOOPING,AL_FALSE);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 1 AL_LOOPING false: \n", error);
printf("Position Test\n");
printf("Press '1' to play source 0 rear left of listener\n");
printf("Press '2' to play source 1 once (single shot) front right of listener\n");
printf("Press '3' to stop source 0\n");
printf("Press '4' to stop source 1\n");
printf("Press '5' to set Source 0 Reference Distance to 2\n");
printf("Press '6' to set Source 0 Reference Distance to 1\n");
printf("Press 'q' to quit\n");
do
{
ch = _getch();
ch = toupper( ch );
switch (ch)
{
case '1':
alSourcePlay(source[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcePlay source 0 : ", error);
break;
case '2':
alSourcePlay(source[1]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcePlay source 1 : ", error);
break;
case '3':
alSourceStop(source[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceStop source 0 : ", error);
break;
case '4':
alSourceStop(source[1]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceStop source 1 : ", error);
break;
case '5':
alSourcef(source[0], AL_REFERENCE_DISTANCE, 2.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef REFERENCE_DISTANCE 2 : ", error);
break;
case '6':
alSourcef(source[0], AL_REFERENCE_DISTANCE, 1.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef REFERENCE_DISTANCE 1 : ", error);
break;
}
} while (ch != 'Q');
// Release resources
alSourceStopv(2, source);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceStopv 2 : ", error);
alDeleteSources(2, source);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alDeleteSources 2 : ", error);
return;
}
/*
Looping Test
Tests the ability to switch Looping ON and OFF for a particular source, either before or during
Playback. (If looping is switched off during playback, the buffer should finish playing until
the end of the sample.)
*/
ALvoid LoopingTest(ALvoid)
{
ALint error;
ALuint source[2];
ALbyte ch;
ALboolean bLooping0 = AL_FALSE;
ALboolean bLooping1 = AL_FALSE;
ALfloat source0Pos[]={ 0.0, 0.0, 0.0}; // Front left of the listener
ALfloat source0Vel[]={ 0.0, 0.0, 0.0};
ALfloat source1Pos[]={ 2.0, 0,0, -2.0}; // Front right of the listener
ALfloat source1Vel[]={ 0.0, 0.0, 0,0};
// Clear Error Code
alGetError();
alGenSources(2,source);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alGenSources 1 : ", error);
return;
}
alSourcef(source[0],AL_PITCH,1.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef 0 AL_PITCH : \n", error);
alSourcef(source[0],AL_GAIN,1.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef 0 AL_GAIN : \n", error);
alSourcefv(source[0],AL_POSITION,source0Pos);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcefv 0 AL_POSITION : \n", error);
alSourcefv(source[0],AL_VELOCITY,source0Vel);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcefv 0 AL_VELOCITY : \n", error);
alSourcei(source[0],AL_BUFFER, g_Buffers[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 0 AL_BUFFER buffer 0 : \n", error);
alSourcei(source[0],AL_LOOPING,AL_FALSE);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 0 AL_LOOPING false : \n", error);
alSourcef(source[1],AL_PITCH,1.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef 1 AL_PITCH : \n", error);
alSourcef(source[1],AL_GAIN,1.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef 1 AL_GAIN : \n", error);
alSourcefv(source[1],AL_POSITION,source1Pos);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcefv 1 AL_POSITION : \n", error);
alSourcefv(source[1],AL_VELOCITY,source1Vel);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcefv 1 AL_VELOCITY : \n", error);
alSourcei(source[1],AL_BUFFER, g_Buffers[1]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 1 AL_BUFFER buffer 1 : \n", error);
alSourcei(source[1],AL_LOOPING,AL_FALSE);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 1 AL_LOOPING false: \n", error);
printf("Looping Test\n");
printf("Press '1' to play source 0 once (single shot)\n");
printf("Press '2' to toggle looping on source 0\n");
printf("Press '3' to play source 1 once (single shot)\n");
printf("Press '4' to toggle looping on source 1\n");
printf("Press 'q' to quit\n");
printf("\nSource 0 : Not looping Source 1 : Not looping\r");
do
{
ch = _getch();
ch = toupper( ch );
switch (ch)
{
case '1':
alSourcePlay(source[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcePlay source 0 : ", error);
break;
case '2':
if (bLooping0 == AL_FALSE)
{
bLooping0 = AL_TRUE;
if (bLooping1)
printf("Source 0 : Looping Source 1 : Looping \r");
else
printf("Source 0 : Looping Source 1 : Not looping\r");
}
else
{
bLooping0 = AL_FALSE;
if (bLooping1)
printf("Source 0 : Not looping Source 1 : Looping \r");
else
printf("Source 0 : Not looping Source 1 : Not looping\r");
}
alSourcei(source[0], AL_LOOPING, bLooping0);
break;
case '3':
alSourcePlay(source[1]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcePlay source 1 : ", error);
break;
case '4':
if (bLooping1 == AL_FALSE)
{
bLooping1 = AL_TRUE;
if (bLooping0)
printf("Source 0 : Looping Source 1 : Looping \r");
else
printf("Source 0 : Not looping Source 1 : Looping \r");
}
else
{
bLooping1 = AL_FALSE;
if (bLooping0)
printf("Source 0 : Looping Source 1 : Not looping\r");
else
printf("Source 0 : Not looping Source 1 : Not looping\r");
}
alSourcei(source[1], AL_LOOPING, bLooping1);
break;
}
} while (ch != 'Q');
printf("\n");
// Release resources
alSourceStop(source[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceStop source 1 : ", error);
alDeleteSources(2, source);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alDeleteSources 1 : ", error);
return;
}
/*
EAXTest (Only runs if the EAX Extension is present)
Uses 2 Sources to test out EAX 2.0 Reverb, Occlusion and Obstruction. Also tests the use of the
DEFERRED flag in EAX.
*/
ALvoid EAXTest(ALvoid)
{
ALint error;
ALuint source[2];
ALbyte ch;
ALuint Env;
ALint Room;
ALint Occlusion;
ALint Obstruction;
EAXBUFFERPROPERTIES eaxBufferProp0;
ALfloat source0Pos[]={ -2.0, 0.0, 2.0}; // Behind and to the left of the listener
ALfloat source0Vel[]={ 0.0, 0.0, 0.0};
ALfloat source1Pos[]={ 2.0, 0.0,-2.0}; // Front and right of the listener
ALfloat source1Vel[]={ 0.0, 0.0, 0.0};
alGenSources(2,source);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alGenSources 2 : ", error);
return;
}
alSourcef(source[0],AL_PITCH,1.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef 0 AL_PITCH : \n", error);
alSourcef(source[0],AL_GAIN,1.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef 0 AL_GAIN : \n", error);
alSourcefv(source[0],AL_POSITION,source0Pos);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcefv 0 AL_POSITION : \n", error);
alSourcefv(source[0],AL_VELOCITY,source0Vel);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcefv 0 AL_VELOCITY : \n", error);
alSourcei(source[0],AL_BUFFER, g_Buffers[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 0 AL_BUFFER buffer 0 : \n", error);
alSourcei(source[0],AL_LOOPING,AL_TRUE);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 0 AL_LOOPING true: \n", error);
alSourcef(source[1],AL_PITCH,1.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef 1 AL_PITCH : \n", error);
alSourcef(source[1],AL_GAIN,1.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef 1 AL_GAIN : \n", error);
alSourcefv(source[1],AL_POSITION,source1Pos);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcefv 1 AL_POSITION : \n", error);
alSourcefv(source[1],AL_VELOCITY,source1Vel);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcefv 1 AL_VELOCITY : \n", error);
alSourcei(source[1],AL_BUFFER, g_Buffers[1]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 1 AL_BUFFER buffer 1 : \n", error);
alSourcei(source[1],AL_LOOPING,AL_FALSE);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 1 AL_LOOPING false: \n", error);
printf("EAX Test\n\n");
printf("Press '1' to play source 0 (looping)\n");
printf("Press '2' to play source 1 once (single shot)\n");
printf("Press '3' to stop source 0\n");
printf("Press '4' to stop source 1\n");
printf("Press '5' to add Hangar reverb (DEFERRED)\n");
printf("Press '6' to remove reverb (DEFERRED)\n");
printf("Press '7' to occlude source 0 (DEFERRED)\n");
printf("Press '8' to remove occlusion from source 0 (DEFERRED)\n");
printf("Press '9' to obstruct source 1 (IMMEDIATE)\n");
printf("Press '0' to remove obstruction from source 1 (IMMEDIATE)\n");
printf("Press 'c' to COMMIT EAX settings\n");
printf("Press 'q' to quit\n\n");
do
{
ch = _getch();
ch = toupper( ch );
switch (ch)
{
case '1':
alSourcePlay(source[0]);
break;
case '2':
alSourcePlay(source[1]);
break;
case '3':
alSourceStop(source[0]);
break;
case '4':
alSourceStop(source[1]);
break;
case '5':
Env = EAX_ENVIRONMENT_HANGAR;
eaxSet(&DSPROPSETID_EAX20_ListenerProperties, DSPROPERTY_EAXLISTENER_ENVIRONMENT | DSPROPERTY_EAXLISTENER_DEFERRED,
NULL, &Env, sizeof(ALuint));
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("eaxSet EAXLISTENER_ENVIRONMENT | EAXLISTENER_DEFERRED : \n", error);
break;
case '6':
Room = -10000;
eaxSet(&DSPROPSETID_EAX20_ListenerProperties, DSPROPERTY_EAXLISTENER_ROOM | DSPROPERTY_EAXLISTENER_DEFERRED, NULL,
&Room, sizeof(ALint));
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("eaxSet EAXLISTENER_ROOM | EAXLISTENER_DEFERRED : \n", error);
break;
case '7':
eaxGet(&DSPROPSETID_EAX20_BufferProperties, DSPROPERTY_EAXBUFFER_ALLPARAMETERS, source[0],
&eaxBufferProp0, sizeof(EAXBUFFERPROPERTIES));
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("eaxGet EAXBUFFER_ALLPARAMETERS : \n", error);
eaxBufferProp0.lOcclusion = -5000;
eaxSet(&DSPROPSETID_EAX20_BufferProperties, DSPROPERTY_EAXBUFFER_ALLPARAMETERS | DSPROPERTY_EAXBUFFER_DEFERRED, source[0],
&eaxBufferProp0, sizeof(EAXBUFFERPROPERTIES));
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("eaxSet EAXBUFFER_ALLPARAMETERS | EAXBUFFER_DEFERRED : \n", error);
break;
case '8':
Occlusion = 0;
eaxSet(&DSPROPSETID_EAX20_BufferProperties, DSPROPERTY_EAXBUFFER_OCCLUSION | DSPROPERTY_EAXBUFFER_DEFERRED, source[0],
&Occlusion, sizeof(ALint));
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("eaxSet EAXBUFFER_OCCLUSION | EAXBUFFER_DEFERRED : \n", error);
break;
case '9':
Obstruction = -5000;
eaxSet(&DSPROPSETID_EAX20_BufferProperties, DSPROPERTY_EAXBUFFER_OBSTRUCTION, source[1],
&Obstruction, sizeof(ALint));
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("eaxSet EAXBUFFER_OBSTRUCTION : \n", error);
break;
case '0':
Obstruction = 0;
eaxSet(&DSPROPSETID_EAX20_BufferProperties, DSPROPERTY_EAXBUFFER_OBSTRUCTION, source[1],
&Obstruction, sizeof(ALint));
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("eaxSet EAXBUFFER_OBSTRUCTION : \n", error);
break;
case 'C':
// Commit settings on source 0
eaxSet(&DSPROPSETID_EAX20_BufferProperties, DSPROPERTY_EAXBUFFER_COMMITDEFERREDSETTINGS,
source[0], NULL, 0);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("eaxSet EAXBUFFER_COMMITDEFERREDSETTINGS : \n", error);
// Commit Listener settings
eaxSet(&DSPROPSETID_EAX20_ListenerProperties, DSPROPERTY_EAXLISTENER_COMMITDEFERREDSETTINGS,
NULL, NULL, 0);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("eaxSet EAXLISTENER_COMMITDEFERREDSETTINGSENVIRONMENT : \n", error);
break;
}
} while (ch != 'Q');
// Release resources
alSourceStopv(2, source);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceStopv 2 : ", error);
alDeleteSources(2, source);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alDeleteSources 2 : ", error);
return;
}
/*
QueueTest
Tests the ability to queue and unqueue a sequence of buffers on a Source. (Buffers can only be
unqueued if they have been PROCESSED by a Source.)
*/
ALvoid QueueTest(ALvoid)
{
ALint error;
ALuint source[1];
ALbyte ch;
ALuint buffers[5];
ALuint *buffersremoved;
ALboolean bLooping;
ALint BuffersInQueue, BuffersProcessed;
ALfloat source0Pos[]={ 0.0, 0.0, -2.0}; // Immediately in front of listener
ALfloat source0Vel[]={ 0.0, 0.0, 0.0};
ALuint Buffer;
ALint i;
// Clear Error Code
alGetError();
alGenSources(1,source);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alGenSources 1 : ", error);
return;
}
alSourcef(source[0],AL_PITCH,1.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef 0 AL_PITCH : ", error);
alSourcef(source[0],AL_GAIN,1.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef 0 AL_GAIN : ", error);
alSourcefv(source[0],AL_POSITION,source0Pos);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcefv 0 AL_POSITION : ", error);
alSourcefv(source[0],AL_VELOCITY,source0Vel);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcefv 0 AL_VELOCITY : ", error);
alSourcei(source[0],AL_LOOPING,AL_FALSE);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 0 AL_LOOPING false: ", error);
bLooping = false;
printf("EAX Test\n\n");
printf("Press '1' to start playing source 0\n");
printf("Press '2' to stop source 0\n");
printf("Press '3' to toggle looping on source 0\n");
printf("Press '4' to queue 4 buffers on source 0\n");
printf("Press '5' to queue 1st buffer on source 0\n");
printf("Press '6' to queue 2nd buffer on source 0\n");
printf("Press '7' to queue 3rd buffer on source 0\n");
printf("Press '8' to queue 4th buffer on source 0\n");
printf("Press '9' to queue 5th buffer (Buffer 0) on source 0\n");
printf("Press '0' to display stats\n");
printf("Press 'a' to unqueue first Buffer\n");
printf("Press 'b' to unqueue first 2 Buffers\n");
printf("Press 'c' to unqueue first 3 Buffers\n");
printf("Press 'd' to unqueue first 4 Buffers\n");
printf("Press 'e' to unqueue first 5 Buffers\n");
printf("Press 'f' to unqueue all buffers\n");
printf("Press 'q' to quit\n");
printf("Source 0 not looping\r");
buffers[0] = g_Buffers[2];
buffers[1] = g_Buffers[3];
buffers[2] = g_Buffers[4];
buffers[3] = g_Buffers[5];
buffers[4] = NULL;
do
{
ch = _getch();
ch = toupper( ch );
switch (ch)
{
case '1':
alSourcePlay(source[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcePlay source 0 : ", error);
break;
case '2':
alSourceStop(source[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceStop source 0 : ", error);
break;
case '3':
if (bLooping == AL_TRUE)
{
bLooping = AL_FALSE;
printf("Source 0 not looping\r");
}
else
{
bLooping = AL_TRUE;
printf("Source 0 looping \r");
}
alSourcei(source[0], AL_LOOPING, bLooping);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei AL_LOOPING : ", error);
break;
case '4':
alSourceQueueBuffers(source[0], 4, buffers);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceQueueBuffers 4 : ", error);
break;
case '5':
alSourceQueueBuffers(source[0], 1, &buffers[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceQueueBuffers 1 : ", error);
break;
case '6':
alSourceQueueBuffers(source[0], 1, &buffers[1]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceQueueBuffers 1 : ", error);
break;
case '7':
alSourceQueueBuffers(source[0], 1, &buffers[2]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceQueueBuffers 1 : ", error);
break;
case '8':
alSourceQueueBuffers(source[0], 1, &buffers[3]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceQueueBuffers 1 : ", error);
break;
case '9':
// Queue buffer 0
alSourceQueueBuffers(source[0], 1, &buffers[4]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceQueueBuffers 1 (buffer 0) : ", error);
break;
case 'A':
// Unqueue first Buffer
buffersremoved = new ALuint[1];
alSourceUnqueueBuffers(source[0], 1, buffersremoved);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceUnqueueBuffers 1 : ", error);
else
{
if (buffersremoved[0] == buffers[0])
buffersremoved[0] = 1;
else if (buffersremoved[0] == buffers[1])
buffersremoved[0] = 2;
else if (buffersremoved[0] == buffers[2])
buffersremoved[0] = 3;
else if (buffersremoved[0] == buffers[3])
buffersremoved[0] = 4;
else
buffersremoved[0] = 0;
printf("\nRemoved Buffer %d from queue\r", buffersremoved[0]);
}
delete buffersremoved;
break;
case 'B':
// Unqueue first 2 Buffers
buffersremoved = new ALuint[2];
alSourceUnqueueBuffers(source[0], 2, buffersremoved);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceUnqueueBuffers 2 : ", error);
else
{
for (i = 0; i < 2; i++)
{
if (buffersremoved[i] == buffers[0])
buffersremoved[i] = 1;
else if (buffersremoved[i] == buffers[1])
buffersremoved[i] = 2;
else if (buffersremoved[i] == buffers[2])
buffersremoved[i] = 3;
else if (buffersremoved[i] == buffers[3])
buffersremoved[i] = 4;
else
buffersremoved[i] = 0;
}
printf("\nRemoved Buffers %d and %d from queue\r", buffersremoved[0], buffersremoved[1]);
}
delete buffersremoved;
break;
case 'C':
// Unqueue first 3 Buffers
buffersremoved = new ALuint[3];
alSourceUnqueueBuffers(source[0], 3, buffersremoved);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceUnqueueBuffers 3 : ", error);
else
{
for (i = 0; i < 3; i++)
{
if (buffersremoved[i] == buffers[0])
buffersremoved[i] = 1;
else if (buffersremoved[i] == buffers[1])
buffersremoved[i] = 2;
else if (buffersremoved[i] == buffers[2])
buffersremoved[i] = 3;
else if (buffersremoved[i] == buffers[3])
buffersremoved[i] = 4;
else
buffersremoved[i] = 0;
}
printf("\nRemoved Buffers %d, %d and %d from queue\r", buffersremoved[0], buffersremoved[1],
buffersremoved[2]);
}
delete buffersremoved;
break;
case 'D':
// Unqueue first 4 Buffers
buffersremoved = new ALuint[4];
alSourceUnqueueBuffers(source[0], 4, buffersremoved);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceUnqueueBuffers 1 : ", error);
else
{
for (i = 0; i < 4; i++)
{
if (buffersremoved[i] == buffers[0])
buffersremoved[i] = 1;
else if (buffersremoved[i] == buffers[1])
buffersremoved[i] = 2;
else if (buffersremoved[i] == buffers[2])
buffersremoved[i] = 3;
else if (buffersremoved[i] == buffers[3])
buffersremoved[i] = 4;
else
buffersremoved[i] = 0;
}
printf("\nRemoved Buffers %d, %d, %d and %d from queue\r", buffersremoved[0], buffersremoved[1],
buffersremoved[2], buffersremoved[3]);
}
delete buffersremoved;
break;
case 'E':
// Unqueue first 5 Buffers
buffersremoved = new ALuint[5];
alSourceUnqueueBuffers(source[0], 5, buffersremoved);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceUnqueueBuffers 1 : ", error);
else
{
for (i = 0; i < 5; i++)
{
if (buffersremoved[i] == buffers[0])
buffersremoved[i] = 1;
else if (buffersremoved[i] == buffers[1])
buffersremoved[i] = 2;
else if (buffersremoved[i] == buffers[2])
buffersremoved[i] = 3;
else if (buffersremoved[i] == buffers[3])
buffersremoved[i] = 4;
else
buffersremoved[i] = 0;
}
printf("\nRemoved Buffers %d, %d, %d, %d and %d from queue\r", buffersremoved[0], buffersremoved[1],
buffersremoved[2], buffersremoved[3], buffersremoved[4]);
}
delete buffersremoved;
break;
case 'F':
alSourcei(source[0], AL_BUFFER, NULL);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSource AL_BUFFER NULL : ", error);
break;
case '0':
// Retrieve number of buffers in queue
alGetSourcei(source[0], AL_BUFFERS_QUEUED, &BuffersInQueue);
// Retrieve number of processed buffers
alGetSourcei(source[0], AL_BUFFERS_PROCESSED, &BuffersProcessed);
// Retrieve current buffer
alGetSourcei(source[0], AL_BUFFER, (ALint*)&Buffer);
if (Buffer == buffers[0])
Buffer = 1;
else if (Buffer == buffers[1])
Buffer = 2;
else if (Buffer == buffers[2])
Buffer = 3;
else if (Buffer == buffers[3])
Buffer = 4;
else
Buffer = 0;
printf("Current Buffer is %d, %d Buffers in queue, %d Processed\r", Buffer, BuffersInQueue, BuffersProcessed);
break;
}
} while (ch != 'Q');
// Release resources
alSourceStop(source[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceStop : ", error);
alDeleteSources(1, source);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alDeleteSources 1 : ", error);
return;
}
/*
FreqTest
Test AL_PITCH functionality
*/
ALvoid FreqTest(ALvoid)
{
ALint error;
ALuint source[1];
ALbyte ch;
ALfloat source0Pos[]={ 2.0, 0.0,-2.0}; // Front and right of the listener
ALfloat source0Vel[]={ 0.0, 0.0, 0.0};
alGenSources(1,source);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alGenSources 1 : ", error);
return;
}
alSourcef(source[0],AL_PITCH,1.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef 0 AL_PITCH : \n", error);
alSourcef(source[0],AL_GAIN,1.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef 0 AL_GAIN : \n", error);
alSourcefv(source[0],AL_POSITION,source0Pos);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcefv 0 AL_POSITION : \n", error);
alSourcefv(source[0],AL_VELOCITY,source0Vel);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcefv 0 AL_VELOCITY : \n", error);
alSourcei(source[0],AL_BUFFER, g_Buffers[1]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 0 AL_BUFFER buffer 1 : \n", error);
alSourcei(source[0],AL_LOOPING,AL_TRUE);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 0 AL_LOOPING true: \n", error);
printf("Frequency Test\n");
printf("Press '1' to play source 0 (looping)\n");
printf("Press '2' to Double Frequency\n");
printf("Press '3' to Halve Frequency\n");
printf("Press 'q' to quit\n");
do
{
ch = _getch();
ch = toupper( ch );
switch (ch)
{
case '1':
alSourcePlay(source[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcePlay source 0 : ", error);
break;
case '2':
alSourcef(source[0], AL_PITCH, 2.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef source 0 AL_PITCH 2.0 : ", error);
break;
case '3':
alSourcef(source[0], AL_PITCH, 0.5f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef source 0 AL PITCH 0.5: ", error);
break;
}
} while (ch != 'Q');
// Release resources
alSourceStopv(1, source);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceStopv 2 : ", error);
alDeleteSources(1, source);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alDeleteSources 2 : ", error);
return;
}
/*
Stereo Test
Plays a stereo buffer
*/
ALvoid StereoTest(ALvoid)
{
ALint error;
ALuint source[1];
ALuint buffers[2];
ALuint Buffer;
ALint BuffersInQueue, BuffersProcessed;
ALbyte ch;
ALboolean bLoop = true;
ALfloat source0Pos[]={ 2.0, 0.0,-2.0}; // Front and right of the listener
ALfloat source0Vel[]={ 0.0, 0.0, 0.0};
alGenSources(1,source);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alGenSources 1 : ", error);
return;
}
buffers[0] = g_Buffers[6];
buffers[1] = g_Buffers[6];
printf("Stereo Test\n");
printf("Press '1' to play a stereo buffer on source 0 (looping)\n");
printf("Press '2' to play a mono buffer on source 0 (looping)\n");
printf("Press '3' to stop source 0\n");
printf("Press '4' to queue 2 stereo buffers on source 0 and start playing\n");
printf("Press '5' to unqueue the 2 stereo buffers on source 0\n");
printf("Press '6' to toggle looping on / off\n");
printf("Press '0' to display stats\n");
printf("Press 'q' to quit\n");
printf("Looping is on\r");
do
{
ch = _getch();
ch = toupper( ch );
switch (ch)
{
case '1':
// Stop source
alSourceStop(source[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceStop source 0 : ", error);
// Attach new buffer
alSourcei(source[0],AL_BUFFER, g_Buffers[6]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 0 AL_BUFFER buffer 6 (stereo) : \n", error);
// Set volume
alSourcef(source[0],AL_GAIN,0.5f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef 0 AL_GAIN : \n", error);
// Set looping
alSourcei(source[0],AL_LOOPING,bLoop);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 0 AL_LOOPING true: \n", error);
// Play source
alSourcePlay(source[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcePlay source 0 : ", error);
break;
case '2':
// Stop source
alSourceStop(source[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceStop source 0 : ", error);
// Attach new buffer
alSourcei(source[0],AL_BUFFER, g_Buffers[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 0 AL_BUFFER buffer 0 (mono) : \n", error);
// Set 3D position
alSourcefv(source[0],AL_POSITION,source0Pos);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcefv 0 AL_POSITION : \n", error);
// Set 3D velocity
alSourcefv(source[0],AL_VELOCITY,source0Vel);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcefv 0 AL_VELOCITY : \n", error);
// Set volume to full
alSourcef(source[0],AL_GAIN,1.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef 0 AL_GAIN : \n", error);
// Set Looping
alSourcei(source[0],AL_LOOPING,bLoop);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 0 AL_LOOPING : \n", error);
// Play source
alSourcePlay(source[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcePlay source 0 : ", error);
break;
case '3':
alSourceStop(source[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceStop source 0 : ", error);
break;
case '4':
alSourceStop(source[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceStop Source 0 : ", error);
// Attach NULL buffer to source to clear everything
alSourcei(source[0], AL_BUFFER, 0);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei AL_BUFFER (NULL) : ", error);
alSourceQueueBuffers(source[0], 2, buffers);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceQueueBuffers 2 (stereo) : ", error);
// Set Looping
alSourcei(source[0],AL_LOOPING,bLoop);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 0 AL_LOOPING : \n", error);
alSourcePlay(source[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcePlay Source 0 : ", error);
break;
case '5':
alSourceUnqueueBuffers(source[0], 2, buffers);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceUnqueueBuffers 2 (stereo) : ", error);
break;
case '6':
if (bLoop)
{
printf("Looping is off\r");
bLoop = AL_FALSE;
}
else
{
printf("Looping is on \r");
bLoop = AL_TRUE;
}
alSourcei(source[0], AL_LOOPING, bLoop);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 0 AL_LOOPING : \n", error);
break;
case '0':
// Retrieve number of buffers in queue
alGetSourcei(source[0], AL_BUFFERS_QUEUED, &BuffersInQueue);
// Retrieve number of processed buffers
alGetSourcei(source[0], AL_BUFFERS_PROCESSED, &BuffersProcessed);
// Retrieve current buffer
alGetSourcei(source[0], AL_BUFFER, (ALint*)&Buffer);
if (Buffer == buffers[0])
Buffer = 6;
else if (Buffer == buffers[1])
Buffer = 6;
else
Buffer = 0;
printf("Current Buffer is %d, %d Buffers in queue, %d Processed\r", Buffer, BuffersInQueue, BuffersProcessed);
break;
}
} while (ch != 'Q');
// Release resources
alSourceStop(source[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceStop : ", error);
alDeleteSources(1, source);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alDeleteSources 2 : ", error);
return;
}
/*
GainTest
Play 2 Sources - control gain of each, and control Listener Gain
*/
ALvoid GainTest(ALvoid)
{
ALint error;
ALuint source[2];
ALbyte ch;
ALfloat source0Pos[]={ 2.0, 0.0,-2.0}; // Front and right of the listener
ALfloat source0Vel[]={ 0.0, 0.0, 0.0};
ALfloat source1Pos[]={-2.0, 0.0,-2.0};
ALfloat source1Vel[]={ 0.0, 0.0, 0.0};
alGenSources(2,source);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alGenSources 2 : ", error);
return;
}
alSourcef(source[0],AL_PITCH,1.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef 0 AL_PITCH : \n", error);
alSourcef(source[0],AL_GAIN,1.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef 0 AL_GAIN : \n", error);
alSourcefv(source[0],AL_POSITION,source0Pos);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcefv 0 AL_POSITION : \n", error);
alSourcefv(source[0],AL_VELOCITY,source0Vel);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcefv 0 AL_VELOCITY : \n", error);
alSourcei(source[0],AL_BUFFER, g_Buffers[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 0 AL_BUFFER buffer 0 : \n", error);
alSourcei(source[0],AL_LOOPING,AL_TRUE);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 0 AL_LOOPING true: \n", error);
alSourcef(source[1],AL_PITCH,1.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef 1 AL_PITCH : \n", error);
alSourcef(source[1],AL_GAIN,1.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef 1 AL_GAIN : \n", error);
alSourcefv(source[1],AL_POSITION,source1Pos);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcefv 1 AL_POSITION : \n", error);
alSourcefv(source[1],AL_VELOCITY,source1Vel);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcefv 1 AL_VELOCITY : \n", error);
alSourcei(source[1],AL_BUFFER, g_Buffers[1]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 1 AL_BUFFER buffer 1 : \n", error);
alSourcei(source[1],AL_LOOPING,AL_TRUE);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 1 AL_LOOPING true: \n", error);
printf("Gain Test\n");
printf("Press '1' to play source 0 (looping)\n");
printf("Press '2' to play source 1 (looping)\n");
printf("Press '3' to stop source 0\n");
printf("Press '4' to stop source 1\n");
printf("Press '5' to set source 0 gain to 1.0\n");
printf("Press '6' to set source 0 gain to 0.5\n");
printf("Press '7' to set source 0 gain to 0.25\n");
printf("Press '8' to set source 0 gain to 0\n");
printf("Press 'a' to set Listener Gain to 1.0\n");
printf("Press 'b' to set Listener Gain to 0.5\n");
printf("Press 'c' to set Listener Gain to 0.25\n");
printf("Press 'd' to set Listener Gain to 0.0\n");
printf("Press 'q' to quit\n");
do
{
ch = _getch();
ch = toupper( ch );
switch (ch)
{
case '1':
alSourcePlay(source[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcePlay source 0 : ", error);
break;
case '2':
alSourcePlay(source[1]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcePlay source 1 : ", error);
break;
case '3':
alSourceStop(source[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceStop source 0 : \n", error);
break;
case '4':
alSourceStop(source[1]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceStop source 1 : \n", error);
break;
case '5':
alSourcef(source[0],AL_GAIN,1.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef 0 AL_GAIN 1.0 : \n", error);
break;
case '6':
alSourcef(source[0],AL_GAIN,0.5f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef 0 AL_GAIN 0.5 : \n", error);
break;
case '7':
alSourcef(source[0],AL_GAIN,0.25f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef 0 AL_GAIN 0.25 : \n", error);
break;
case '8':
alSourcef(source[0],AL_GAIN,0.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef 0 AL_GAIN 0.0 : \n", error);
break;
case 'A':
alListenerf(AL_GAIN,1.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alListenerf AL_GAIN 1.0 : \n", error);
break;
case 'B':
alListenerf(AL_GAIN,0.5f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alListenerf AL_GAIN 0.5 : \n", error);
break;
case 'C':
alListenerf(AL_GAIN,0.25f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alListenerf AL_GAIN 0.25 : \n", error);
break;
case 'D':
alListenerf(AL_GAIN,0.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alListenerf AL_GAIN 0.0 : \n", error);
break;
}
} while (ch != 'Q');
// Release resources
alSourceStopv(2,source);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceStop : ", error);
alDeleteSources(2, source);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alDeleteSources 2 : ", error);
return;
}
#define BSIZE (4608*2)
#define NUMBUFFERS 4
/*
Streaming Test
Stream a long stereo wave file from harddisc - using AL Queuing
*/
ALvoid StreamingTest(ALvoid)
{
FILE *fp;
WAVE_Struct wave;
ALbyte data[BSIZE];
ALuint Buffers[NUMBUFFERS];
ALuint BufferID;
ALuint Sources[1];
ALint error;
ALuint DataSize;
ALuint DataToRead;
ALubyte ch;
ALint processed;
ALboolean bFinished = AL_FALSE;
ALuint Format;
ALuint loop;
ALint i, state;
printf("Streaming Test\n");
fp = fopen("stereo.wav", "rb");
if (fp == NULL)
{
printf("Failed to open stereo.wav\n");
return;
}
// We are going to be queuing x buffers on our source
// To start, fill all the buffers with audio data from the wave file
// Read in WAVE Header
if (fread(&wave, 1, sizeof(WAVE_Struct), fp) != sizeof(WAVE_Struct))
{
printf("Invalid wave file\n");
fclose(fp);
return;
}
DataSize = wave.dataSize;
if (wave.Channels == 1)
Format = AL_FORMAT_MONO16;
else
Format = AL_FORMAT_STEREO16;
alGenBuffers(NUMBUFFERS, Buffers);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alGenBuffers : ", error);
fclose(fp);
return;
}
for (loop = 0; loop < NUMBUFFERS; loop++)
{
fread(data, 1, BSIZE, fp);
DataSize -= BSIZE;
alBufferData(Buffers[loop], Format, data, BSIZE, wave.SamplesPerSec);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alBufferData : ", error);
}
alGenSources(1, Sources);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alGenSources 1 : ", error);
alDeleteBuffers(NUMBUFFERS, Buffers);
fclose(fp);
return;
}
alSourcef(Sources[0], AL_GAIN, 0.5f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef AL_GAIN : ", error);
// Queue the buffers on the source
alSourceQueueBuffers(Sources[0], NUMBUFFERS, Buffers);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceQueueBuffers : ", error);
alSourcei(Sources[0], AL_LOOPING, AL_FALSE);
// Start playing source
alSourcePlay(Sources[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcePlay source 0 : ", error);
int starttime = timeGetTime();
int curtime = starttime;
printf("Started playing at %d\n", starttime);
printf("Press a key to quit\n");
ALuint count = 0;
ALuint buffersreturned = 0;
ALboolean bFinishedPlaying = AL_FALSE;
ALuint buffersinqueue = NUMBUFFERS;
while (!_kbhit() && !bFinishedPlaying)
{
// Get status
alGetSourcei(Sources[0], AL_BUFFERS_PROCESSED, &processed);
// If some buffers have been played, unqueue them and load new audio into them, then add them to the queue
if (processed > 0)
{
buffersreturned += processed;
curtime = timeGetTime() - starttime;
printf("Time is %d ... Buffers Completed is %d \n", curtime, buffersreturned);
// Pseudo code for Streaming with Open AL
// while (processed)
// Unqueue a buffer
// Load audio data into buffer (returned by UnQueueBuffers)
// if successful
// Queue buffer
// processed--
// else
// buffersinqueue--
// if buffersinqueue == 0
// finished playing !
while (processed)
{
alSourceUnqueueBuffers(Sources[0], 1, &BufferID);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alSourceUnqueueBuffers 1 : ", error);
}
if (!bFinished)
{
DataToRead = (DataSize > BSIZE) ? BSIZE : DataSize;
if (DataToRead == DataSize)
bFinished = AL_TRUE;
fread(data, 1, DataToRead, fp);
DataSize -= DataToRead;
if (bFinished == AL_TRUE)
{
memset(data + DataToRead, 0, BSIZE - DataToRead);
}
alBufferData(BufferID, Format, data, BSIZE, wave.SamplesPerSec);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alBufferData : ", error);
// Queue buffer
alSourceQueueBuffers(Sources[0], 1, &BufferID);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceQueueBuffers 1 : ", error);
processed--;
}
else
{
buffersinqueue--;
processed--;
if (buffersinqueue == 0)
{
bFinishedPlaying = true;
break;
}
}
}
}
// Get state
alGetSourcei(Sources[0], AL_SOURCE_STATE, &state);
if (state != AL_PLAYING)
{
printf("Buffer stopped .. need to restart it\n\n\n");
// Unqueue all buffers
alGetSourcei(Sources[0], AL_BUFFERS_PROCESSED, &processed);
printf("Source stopped, unqueuing %d buffers\n", processed);
for (i = 0; i < processed; i++)
{
alSourceUnqueueBuffers(Sources[0], 1, &BufferID);
if (!bFinished)
{
DataToRead = (DataSize > BSIZE) ? BSIZE : DataSize;
if (DataToRead == DataSize)
bFinished = AL_TRUE;
fread(data, 1, DataToRead, fp);
DataSize -= DataToRead;
if (bFinished == AL_TRUE)
{
memset(data + DataToRead, 0, BSIZE - DataToRead);
}
alBufferData(BufferID, Format, data, BSIZE, wave.SamplesPerSec);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alBufferData : ", error);
// Queue buffer
alSourceQueueBuffers(Sources[0], 1, &BufferID);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceQueueBuffers 1 : ", error);
processed--;
}
else
{
buffersinqueue--;
processed--;
if (buffersinqueue == 0)
{
bFinishedPlaying = true;
break;
}
}
}
// Restart playback
alSourcePlay(Sources[0]);
}
}
if (!bFinishedPlaying)
//changed getch to _getch
//ch = getch();
ch = _getch();
alSourceStopv(1, Sources);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceStopv 1 : ", error);
alDeleteSources(1, Sources);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alDeleteSources 1 : ", error);
alDeleteBuffers(NUMBUFFERS, Buffers);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alDeleteBuffers : ", error);
fclose(fp);
return;
}
ALvoid RelativeTest(ALvoid)
{
ALint error;
ALuint source[1];
ALbyte ch;
ALboolean bRelative = AL_FALSE;
ALfloat Pos[3];
ALfloat LPos[3];
ALfloat Vel[]={ 0.0, 0.0, 0.0};
alGenSources(1, source);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alGenSources 1 : ", error);
return;
}
alSourcef(source[0],AL_PITCH,1.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef 0 AL_PITCH : \n", error);
alSourcef(source[0],AL_GAIN,1.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef 0 AL_GAIN : \n", error);
alSourcefv(source[0],AL_VELOCITY, Vel);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcefv 0 AL_VELOCITY : \n", error);
alSourcei(source[0],AL_BUFFER, g_Buffers[1]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 0 AL_BUFFER buffer 0 : \n", error);
alSourcei(source[0],AL_LOOPING,AL_TRUE);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 0 AL_LOOPING true: \n", error);
alSourcei(source[0], AL_SOURCE_RELATIVE, AL_FALSE);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 0 AL_SOURCE_RELATIVE AL_FALSE : \n", error);
printf("Source Relative Test\n");
printf("Press '1' to play source 0 at 1, 0, 0\n");
printf("Press '2' to move listener to 2, 0, 0\n");
printf("Press '3' to toggle SOURCE RELATIVE Mode\n");
printf("Press 'q' to quit\n");
do
{
ch = _getch();
ch = toupper( ch );
switch (ch)
{
case '1':
Pos[0] = 1.f;
Pos[1] = 0.f;
Pos[2] = 0.f;
alSourcefv(source[0],AL_POSITION,Pos);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcefv 0 AL_POSITION : \n", error);
alSourcePlay(source[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcePlay source 0 : ", error);
break;
case '2':
LPos[0] = 2.f;
LPos[1] = 0.0f;
LPos[2] = 0.0f;
alListenerfv(AL_POSITION, LPos);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alListenerfv AL_POSITION : ", error);
break;
case '3':
if (bRelative)
{
printf("Source Relative == FALSE\r");
alSourcei(source[0], AL_SOURCE_RELATIVE, AL_FALSE);
bRelative = AL_FALSE;
}
else
{
alSourcei(source[0], AL_SOURCE_RELATIVE, AL_TRUE);
printf("Source Relative == TRUE \r");
bRelative = AL_TRUE;
}
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei source 0 AL_SOURCE_RELATIVE : ", error);
break;
}
} while (ch != 'Q');
// Release resources
alSourceStopv(1, source);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceStopv 1 : ", error);
alDeleteSources(1, source);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alDeleteSources 1 : ", error);
return;
}
/*
Test that Source can be Generated and Deleted
*/
ALvoid CreationDeletionTest(ALvoid)
{
ALuint Sources[4] = { 0 };
ALint error;
char ch;
printf("Source Creation and Deletion Test\n");
printf("Press '1' to Generate Source 0\n");
printf("Press '2' to Generate Source 1\n");
printf("Press '3' to Generate Source 2\n");
printf("Press '4' to Generate Source 3\n");
printf("Press '5' to Delete Source 0\n");
printf("Press '6' to Delete Source 1\n");
printf("Press '7' to Delete Source 2\n");
printf("Press '8' to Delete Source 3\n");
printf("Press 'q' to quit\n");
do
{
ch = _getch();
ch = toupper( ch );
switch (ch)
{
case '1':
alGenSources(1, &(Sources[0]));
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alGenerateSources 1 : ", error);
break;
case '2':
alGenSources(1, &(Sources[1]));
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alGenerateSources 1 : ", error);
break;
case '3':
alGenSources(1, &(Sources[2]));
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alGenerateSources 1 : ", error);
break;
case '4':
alGenSources(1, &(Sources[3]));
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alGenerateSources 1 : ", error);
break;
case '5':
alDeleteSources(1, &(Sources[0]));
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alDeleteSources 1 : ", error);
break;
case '6':
alDeleteSources(1, &(Sources[1]));
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alDeleteSources 1 : ", error);
break;
case '7':
alDeleteSources(1, &(Sources[2]));
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alDeleteSources 1 : ", error);
break;
case '8':
alDeleteSources(1, &(Sources[3]));
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alDeleteSources 1 : ", error);
break;
}
} while (ch != 'Q');
}
ALvoid MultipleSourcesTest()
{
ALuint numSources = 0;
ALuint Sources[64] = { 0 };
ALuint SourceStopped[64] = { 0 };
ALint error;
ALuint i;
char ch;
ALfloat radius;
double anglestep;
ALfloat pos[3];
// Generate as many sources as possible (up to 64)
for (i = 0; i < 64; i++)
{
alGenSources(1, &Sources[i]);
if ((error = alGetError()) != AL_NO_ERROR)
break;
else
numSources++;
}
printf("Multiple Sources Test\n\n");
printf("Generated %d Sources\n", numSources);
// Set sources to located in a circle around the listener
anglestep = (2 * PI) / (ALfloat)numSources;
radius = 2.0f;
for (i = 0; i < numSources; i++)
{
// Attach buffer
alSourcei(Sources[i], AL_BUFFER, g_Buffers[0]);
// Set position
pos[0] = (float)(cos(anglestep*i) * radius);
pos[1] = 0.0f;
pos[2] = (float)(sin(anglestep*i) * radius);
alSourcefv(Sources[i], AL_POSITION, pos);
// Enable looping
alSourcei(Sources[i], AL_LOOPING, AL_TRUE);
}
printf("Press '1' to start playing Sources seperately\n");
printf("Press '2' to stop playing Sources seperately\n");
printf("Press 'q' to quit\n");
do
{
ch = _getch();
ch = toupper( ch );
switch (ch)
{
case '1':
for (i = 0; i < numSources; i++)
{
alSourcePlay(Sources[i]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcePlay : ", error);
// Delay a little
//changed to sleep(100)
//Sleep(100);
Sleep(100);
}
break;
case '2':
alSourceStopv(numSources, Sources);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceStopv : ", error);
break;
}
} while (ch != 'Q');
// Delete the Sources
alDeleteSources(numSources, Sources);
}
ALvoid SourceRollOffTest()
{
ALint error;
ALuint source[2];
ALbyte ch;
ALfloat source0Pos[]={ -10.0, 0.0, 10.0}; // Behind and to the left of the listener
ALfloat source1Pos[]={ 10.0, 0.0, -10.0}; // Front and to the right of the listener
alGenSources(2,source);
if ((error = alGetError()) != AL_NO_ERROR)
{
DisplayALError("alGenSources 2 : ", error);
return;
}
alSourcefv(source[0],AL_POSITION,source0Pos);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcefv 0 AL_POSITION : \n", error);
alSourcei(source[0],AL_BUFFER, g_Buffers[1]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 0 AL_BUFFER buffer 0 : \n", error);
alSourcei(source[0],AL_LOOPING,AL_TRUE);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 0 AL_LOOPING true: \n", error);
alSourcefv(source[1],AL_POSITION,source1Pos);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcefv 1 AL_POSITION : \n", error);
alSourcei(source[1],AL_BUFFER, g_Buffers[1]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 1 AL_BUFFER buffer 1 : \n", error);
alSourcei(source[1],AL_LOOPING,AL_TRUE);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcei 1 AL_LOOPING false: \n", error);
printf("Source Roll-off Test\n");
printf("Press '1' to play source 0 rear left of listener\n");
printf("Press '2' to stop source 0\n");
printf("Press '3' to play source 1 front right of listener\n");
printf("Press '4' to stop source 1\n");
printf("Press '5' to set Source 0 Roff-off Factor to 0.5\n");
printf("Press '6' to set Source 0 Roll-off Factor to 1.0\n");
printf("Press '7' to set Source 0 Roll-off Factor to 2.0\n");
printf("Press '8' to set Source 1 Roff-off Factor to 0.5\n");
printf("Press '9' to set Source 1 Roll-off Factor to 1.0\n");
printf("Press 'A' to set Source 1 Roll-off Factor to 2.0\n");
printf("Press 'q' to quit\n");
do
{
ch = _getch();
ch = toupper( ch );
switch (ch)
{
case '1':
alSourcePlay(source[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcePlay source 0 : ", error);
break;
case '2':
alSourceStop(source[0]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceStop source 0 : ", error);
break;
case '3':
alSourcePlay(source[1]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcePlay source 1 : ", error);
break;
case '4':
alSourceStop(source[1]);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceStop source 1 : ", error);
break;
case '5':
alSourcef(source[0], AL_ROLLOFF_FACTOR, 0.5f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef ROLLOFF_FACTOR 0.5 : ", error);
break;
case '6':
alSourcef(source[0], AL_ROLLOFF_FACTOR, 1.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef ROLLOFF_FACTOR 1.0 : ", error);
break;
case '7':
alSourcef(source[0], AL_ROLLOFF_FACTOR, 2.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef ROLLOFF_FACTOR 2.0 : ", error);
break;
case '8':
alSourcef(source[1], AL_ROLLOFF_FACTOR, 0.5f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef ROLLOFF_FACTOR 0.5 : ", error);
break;
case '9':
alSourcef(source[1], AL_ROLLOFF_FACTOR, 1.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef ROLLOFF_FACTOR 1.0 : ", error);
break;
case 'A':
alSourcef(source[1], AL_ROLLOFF_FACTOR, 2.0f);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourcef ROLLOFF_FACTOR 2.0 : ", error);
break;
}
} while (ch != 'Q');
// Release resources
alSourceStopv(2, source);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alSourceStopv 2 : ", error);
alDeleteSources(2, source);
if ((error = alGetError()) != AL_NO_ERROR)
DisplayALError("alDeleteSources 2 : ", error);
return;
}