333 lines
11 KiB
C++
333 lines
11 KiB
C++
|
/*
|
||
|
* Copyright (c) 2006, Creative Labs Inc.
|
||
|
* All rights reserved.
|
||
|
*
|
||
|
* Redistribution and use in source and binary forms, with or without modification, are permitted provided
|
||
|
* that the following conditions are met:
|
||
|
*
|
||
|
* * Redistributions of source code must retain the above copyright notice, this list of conditions and
|
||
|
* the following disclaimer.
|
||
|
* * Redistributions in binary form must reproduce the above copyright notice, this list of conditions
|
||
|
* and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||
|
* * Neither the name of Creative Labs Inc. nor the names of its contributors may be used to endorse or
|
||
|
* promote products derived from this software without specific prior written permission.
|
||
|
*
|
||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
|
||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||
|
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||
|
*/
|
||
|
|
||
|
// Win32 version of the Creative Labs OpenAL 1.1 Framework for samples
|
||
|
#include "stdneb.h"
|
||
|
|
||
|
#include "Framework.h"
|
||
|
#include "CWaves.h"
|
||
|
#include "aldlist.h"
|
||
|
|
||
|
#ifdef __ANDROID__
|
||
|
typedef long HRESULT;
|
||
|
#define SUCCEEDED(hr) (((HRESULT)(hr)) >= 0)
|
||
|
#define _MAX_PATH 260
|
||
|
#endif
|
||
|
|
||
|
|
||
|
static CWaves *g_pWaveLoader = NULL;
|
||
|
|
||
|
// Imported EFX functions
|
||
|
#ifndef AL_BUILD_LIBRARY
|
||
|
// Effect objects
|
||
|
LPALGENEFFECTS alGenEffects = NULL;
|
||
|
LPALDELETEEFFECTS alDeleteEffects = NULL;
|
||
|
LPALISEFFECT alIsEffect = NULL;
|
||
|
LPALEFFECTI alEffecti = NULL;
|
||
|
LPALEFFECTIV alEffectiv = NULL;
|
||
|
LPALEFFECTF alEffectf = NULL;
|
||
|
LPALEFFECTFV alEffectfv = NULL;
|
||
|
LPALGETEFFECTI alGetEffecti = NULL;
|
||
|
LPALGETEFFECTIV alGetEffectiv = NULL;
|
||
|
LPALGETEFFECTF alGetEffectf = NULL;
|
||
|
LPALGETEFFECTFV alGetEffectfv = NULL;
|
||
|
|
||
|
//Filter objects
|
||
|
LPALGENFILTERS alGenFilters = NULL;
|
||
|
LPALDELETEFILTERS alDeleteFilters = NULL;
|
||
|
LPALISFILTER alIsFilter = NULL;
|
||
|
LPALFILTERI alFilteri = NULL;
|
||
|
LPALFILTERIV alFilteriv = NULL;
|
||
|
LPALFILTERF alFilterf = NULL;
|
||
|
LPALFILTERFV alFilterfv = NULL;
|
||
|
LPALGETFILTERI alGetFilteri = NULL;
|
||
|
LPALGETFILTERIV alGetFilteriv = NULL;
|
||
|
LPALGETFILTERF alGetFilterf = NULL;
|
||
|
LPALGETFILTERFV alGetFilterfv = NULL;
|
||
|
|
||
|
// Auxiliary slot object
|
||
|
LPALGENAUXILIARYEFFECTSLOTS alGenAuxiliaryEffectSlots = NULL;
|
||
|
LPALDELETEAUXILIARYEFFECTSLOTS alDeleteAuxiliaryEffectSlots = NULL;
|
||
|
LPALISAUXILIARYEFFECTSLOT alIsAuxiliaryEffectSlot = NULL;
|
||
|
LPALAUXILIARYEFFECTSLOTI alAuxiliaryEffectSloti = NULL;
|
||
|
LPALAUXILIARYEFFECTSLOTIV alAuxiliaryEffectSlotiv = NULL;
|
||
|
LPALAUXILIARYEFFECTSLOTF alAuxiliaryEffectSlotf = NULL;
|
||
|
LPALAUXILIARYEFFECTSLOTFV alAuxiliaryEffectSlotfv = NULL;
|
||
|
LPALGETAUXILIARYEFFECTSLOTI alGetAuxiliaryEffectSloti = NULL;
|
||
|
LPALGETAUXILIARYEFFECTSLOTIV alGetAuxiliaryEffectSlotiv = NULL;
|
||
|
LPALGETAUXILIARYEFFECTSLOTF alGetAuxiliaryEffectSlotf = NULL;
|
||
|
LPALGETAUXILIARYEFFECTSLOTFV alGetAuxiliaryEffectSlotfv = NULL;
|
||
|
|
||
|
#endif
|
||
|
|
||
|
// XRAM functions and enum values
|
||
|
|
||
|
LPEAXSETBUFFERMODE eaxSetBufferMode = NULL;
|
||
|
LPEAXGETBUFFERMODE eaxGetBufferMode = NULL;
|
||
|
|
||
|
ALenum eXRAMSize = 0;
|
||
|
ALenum eXRAMFree = 0;
|
||
|
ALenum eXRAMAuto = 0;
|
||
|
ALenum eXRAMHardware = 0;
|
||
|
ALenum eXRAMAccessible = 0;
|
||
|
|
||
|
|
||
|
// Initialization and enumeration
|
||
|
void ALFWInit()
|
||
|
{
|
||
|
g_pWaveLoader = new CWaves();
|
||
|
}
|
||
|
|
||
|
void ALFWShutdown()
|
||
|
{
|
||
|
if (g_pWaveLoader)
|
||
|
{
|
||
|
delete g_pWaveLoader;
|
||
|
g_pWaveLoader = NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool ALFWInitOpenAL()
|
||
|
{
|
||
|
ALDeviceList *pDeviceList = NULL;
|
||
|
ALCcontext *pContext = NULL;
|
||
|
ALCdevice *pDevice = NULL;
|
||
|
ALint i = 1;
|
||
|
bool bReturn = false;
|
||
|
|
||
|
pDeviceList = new ALDeviceList();
|
||
|
if ((pDeviceList) && (pDeviceList->GetNumDevices()))
|
||
|
{
|
||
|
///*ALFWprintf("\nSelect OpenAL Device:\n");
|
||
|
//for (i = 0; i < pDeviceList->GetNumDevices(); i++)
|
||
|
// ALFWprintf("%d. %s%s\n", i + 1, pDeviceList->GetDeviceName(i), i == pDeviceList->GetDefaultDevice() ? "(DEFAULT)" : "");*/
|
||
|
|
||
|
//do {
|
||
|
// ALchar ch = _getch();
|
||
|
// i = atoi(&ch);
|
||
|
//} while ((i < 1) || (i > pDeviceList->GetNumDevices()));
|
||
|
|
||
|
pDevice = alcOpenDevice(pDeviceList->GetDeviceName(i - 1));
|
||
|
if (pDevice)
|
||
|
{
|
||
|
pContext = alcCreateContext(pDevice, NULL);
|
||
|
if (pContext)
|
||
|
{
|
||
|
ALFWprintf("\nOpened %s Device\n", alcGetString(pDevice, ALC_DEVICE_SPECIFIER));
|
||
|
alcMakeContextCurrent(pContext);
|
||
|
bReturn = true;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
alcCloseDevice(pDevice);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
delete pDeviceList;
|
||
|
}
|
||
|
|
||
|
return bReturn;
|
||
|
}
|
||
|
|
||
|
ALboolean ALFWShutdownOpenAL()
|
||
|
{
|
||
|
ALCcontext *pContext;
|
||
|
ALCdevice *pDevice;
|
||
|
|
||
|
pContext = alcGetCurrentContext();
|
||
|
pDevice = alcGetContextsDevice(pContext);
|
||
|
|
||
|
alcMakeContextCurrent(NULL);
|
||
|
alcDestroyContext(pContext);
|
||
|
alcCloseDevice(pDevice);
|
||
|
|
||
|
return AL_TRUE;
|
||
|
}
|
||
|
|
||
|
#ifdef __OSX__
|
||
|
#define SUCCEEDED( x ) WR_OK == (x)
|
||
|
#endif
|
||
|
|
||
|
bool ALFWLoadWaveToBuffer(const char* nameOrData, SizeT dataSize, ALuint uiBufferID, ALenum eXRAMBufferMode, bool bOpenMemory)
|
||
|
{
|
||
|
WAVEID WaveID;
|
||
|
ALint iDataSize, iFrequency;
|
||
|
ALenum eBufferFormat;
|
||
|
ALchar *pData;
|
||
|
bool bReturn;
|
||
|
|
||
|
bReturn = false;
|
||
|
if (g_pWaveLoader)
|
||
|
{
|
||
|
if (SUCCEEDED(g_pWaveLoader->LoadWaveFile(nameOrData, dataSize, &WaveID, bOpenMemory)))
|
||
|
{
|
||
|
if ((SUCCEEDED(g_pWaveLoader->GetWaveSize(WaveID, (unsigned long*)&iDataSize))) &&
|
||
|
(SUCCEEDED(g_pWaveLoader->GetWaveData(WaveID, (void**)&pData))) &&
|
||
|
(SUCCEEDED(g_pWaveLoader->GetWaveFrequency(WaveID, (unsigned long*)&iFrequency))) &&
|
||
|
(SUCCEEDED(g_pWaveLoader->GetWaveALBufferFormat(WaveID, &alGetEnumValue, (unsigned long*)&eBufferFormat))))
|
||
|
{
|
||
|
// Set XRAM Mode (if application)
|
||
|
if (eaxSetBufferMode && eXRAMBufferMode)
|
||
|
eaxSetBufferMode(1, &uiBufferID, eXRAMBufferMode);
|
||
|
|
||
|
alGetError();
|
||
|
alBufferData(uiBufferID, eBufferFormat, pData, iDataSize, iFrequency);
|
||
|
if (alGetError() == AL_NO_ERROR)
|
||
|
bReturn = true;
|
||
|
|
||
|
g_pWaveLoader->DeleteWaveFile(WaveID);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return bReturn;
|
||
|
}
|
||
|
|
||
|
#ifdef __OSX__
|
||
|
#define _MAX_PATH (1024)
|
||
|
#endif
|
||
|
|
||
|
void ALFWprintf( const char* x, ... )
|
||
|
{
|
||
|
va_list args;
|
||
|
va_start( args, x );
|
||
|
vprintf( x, args );
|
||
|
va_end( args );
|
||
|
}
|
||
|
|
||
|
ALchar fullPath[_MAX_PATH];
|
||
|
ALchar *ALFWaddMediaPath(const ALchar *filename)
|
||
|
{
|
||
|
#ifdef __WIN32__
|
||
|
sprintf_s(fullPath, "%s%s", "..\\..\\Media\\", filename);
|
||
|
#elif __ANDROID__
|
||
|
sprintf(fullPath, "%s%s", "..\\..\\Media\\", filename);
|
||
|
#endif
|
||
|
return fullPath;
|
||
|
}
|
||
|
|
||
|
ALint ALFWKeyPress(void)
|
||
|
{
|
||
|
#ifdef __WIN32__
|
||
|
return _kbhit();
|
||
|
|
||
|
#elif __ANDROID__
|
||
|
return 0;
|
||
|
#endif
|
||
|
|
||
|
}
|
||
|
// Extension Queries
|
||
|
typedef ALboolean (__cdecl *EAXSetBufferMode)(ALsizei n, ALuint *buffers, ALint value);
|
||
|
typedef ALenum (__cdecl *EAXGetBufferMode)(ALuint buffer, ALint *value);
|
||
|
ALboolean ALFWIsXRAMSupported()
|
||
|
{
|
||
|
ALboolean bXRAM = AL_FALSE;
|
||
|
|
||
|
if (alIsExtensionPresent("EAX-RAM") == AL_TRUE)
|
||
|
{
|
||
|
// Get X-RAM Function pointers
|
||
|
eaxSetBufferMode = (EAXSetBufferMode)alGetProcAddress("EAXSetBufferMode");
|
||
|
eaxGetBufferMode = (EAXGetBufferMode)alGetProcAddress("EAXGetBufferMode");
|
||
|
|
||
|
if (eaxSetBufferMode && eaxGetBufferMode)
|
||
|
{
|
||
|
eXRAMSize = alGetEnumValue("AL_EAX_RAM_SIZE");
|
||
|
eXRAMFree = alGetEnumValue("AL_EAX_RAM_FREE");
|
||
|
eXRAMAuto = alGetEnumValue("AL_STORAGE_AUTOMATIC");
|
||
|
eXRAMHardware = alGetEnumValue("AL_STORAGE_HARDWARE");
|
||
|
eXRAMAccessible = alGetEnumValue("AL_STORAGE_ACCESSIBLE");
|
||
|
|
||
|
if (eXRAMSize && eXRAMFree && eXRAMAuto && eXRAMHardware && eXRAMAccessible)
|
||
|
bXRAM = AL_TRUE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return bXRAM;
|
||
|
}
|
||
|
|
||
|
ALboolean ALFWIsEFXSupported()
|
||
|
{
|
||
|
ALCdevice *pDevice = NULL;
|
||
|
ALCcontext *pContext = NULL;
|
||
|
ALboolean bEFXSupport = AL_FALSE;
|
||
|
|
||
|
pContext = alcGetCurrentContext();
|
||
|
pDevice = alcGetContextsDevice(pContext);
|
||
|
|
||
|
if (alcIsExtensionPresent(pDevice, (ALCchar*)ALC_EXT_EFX_NAME))
|
||
|
{
|
||
|
#ifndef AL_BUILD_LIBRARY
|
||
|
// Get function pointers
|
||
|
alGenEffects = (LPALGENEFFECTS)alGetProcAddress("alGenEffects");
|
||
|
alDeleteEffects = (LPALDELETEEFFECTS )alGetProcAddress("alDeleteEffects");
|
||
|
alIsEffect = (LPALISEFFECT )alGetProcAddress("alIsEffect");
|
||
|
alEffecti = (LPALEFFECTI)alGetProcAddress("alEffecti");
|
||
|
alEffectiv = (LPALEFFECTIV)alGetProcAddress("alEffectiv");
|
||
|
alEffectf = (LPALEFFECTF)alGetProcAddress("alEffectf");
|
||
|
alEffectfv = (LPALEFFECTFV)alGetProcAddress("alEffectfv");
|
||
|
alGetEffecti = (LPALGETEFFECTI)alGetProcAddress("alGetEffecti");
|
||
|
alGetEffectiv = (LPALGETEFFECTIV)alGetProcAddress("alGetEffectiv");
|
||
|
alGetEffectf = (LPALGETEFFECTF)alGetProcAddress("alGetEffectf");
|
||
|
alGetEffectfv = (LPALGETEFFECTFV)alGetProcAddress("alGetEffectfv");
|
||
|
alGenFilters = (LPALGENFILTERS)alGetProcAddress("alGenFilters");
|
||
|
alDeleteFilters = (LPALDELETEFILTERS)alGetProcAddress("alDeleteFilters");
|
||
|
alIsFilter = (LPALISFILTER)alGetProcAddress("alIsFilter");
|
||
|
alFilteri = (LPALFILTERI)alGetProcAddress("alFilteri");
|
||
|
alFilteriv = (LPALFILTERIV)alGetProcAddress("alFilteriv");
|
||
|
alFilterf = (LPALFILTERF)alGetProcAddress("alFilterf");
|
||
|
alFilterfv = (LPALFILTERFV)alGetProcAddress("alFilterfv");
|
||
|
alGetFilteri = (LPALGETFILTERI )alGetProcAddress("alGetFilteri");
|
||
|
alGetFilteriv= (LPALGETFILTERIV )alGetProcAddress("alGetFilteriv");
|
||
|
alGetFilterf = (LPALGETFILTERF )alGetProcAddress("alGetFilterf");
|
||
|
alGetFilterfv= (LPALGETFILTERFV )alGetProcAddress("alGetFilterfv");
|
||
|
alGenAuxiliaryEffectSlots = (LPALGENAUXILIARYEFFECTSLOTS)alGetProcAddress("alGenAuxiliaryEffectSlots");
|
||
|
alDeleteAuxiliaryEffectSlots = (LPALDELETEAUXILIARYEFFECTSLOTS)alGetProcAddress("alDeleteAuxiliaryEffectSlots");
|
||
|
alIsAuxiliaryEffectSlot = (LPALISAUXILIARYEFFECTSLOT)alGetProcAddress("alIsAuxiliaryEffectSlot");
|
||
|
alAuxiliaryEffectSloti = (LPALAUXILIARYEFFECTSLOTI)alGetProcAddress("alAuxiliaryEffectSloti");
|
||
|
alAuxiliaryEffectSlotiv = (LPALAUXILIARYEFFECTSLOTIV)alGetProcAddress("alAuxiliaryEffectSlotiv");
|
||
|
alAuxiliaryEffectSlotf = (LPALAUXILIARYEFFECTSLOTF)alGetProcAddress("alAuxiliaryEffectSlotf");
|
||
|
alAuxiliaryEffectSlotfv = (LPALAUXILIARYEFFECTSLOTFV)alGetProcAddress("alAuxiliaryEffectSlotfv");
|
||
|
alGetAuxiliaryEffectSloti = (LPALGETAUXILIARYEFFECTSLOTI)alGetProcAddress("alGetAuxiliaryEffectSloti");
|
||
|
alGetAuxiliaryEffectSlotiv = (LPALGETAUXILIARYEFFECTSLOTIV)alGetProcAddress("alGetAuxiliaryEffectSlotiv");
|
||
|
alGetAuxiliaryEffectSlotf = (LPALGETAUXILIARYEFFECTSLOTF)alGetProcAddress("alGetAuxiliaryEffectSlotf");
|
||
|
alGetAuxiliaryEffectSlotfv = (LPALGETAUXILIARYEFFECTSLOTFV)alGetProcAddress("alGetAuxiliaryEffectSlotfv");
|
||
|
|
||
|
|
||
|
if (alGenEffects && alDeleteEffects && alIsEffect && alEffecti && alEffectiv && alEffectf &&
|
||
|
alEffectfv && alGetEffecti && alGetEffectiv && alGetEffectf && alGetEffectfv && alGenFilters &&
|
||
|
alDeleteFilters && alIsFilter && alFilteri && alFilteriv && alFilterf && alFilterfv &&
|
||
|
alGetFilteri && alGetFilteriv && alGetFilterf && alGetFilterfv && alGenAuxiliaryEffectSlots &&
|
||
|
alDeleteAuxiliaryEffectSlots && alIsAuxiliaryEffectSlot && alAuxiliaryEffectSloti &&
|
||
|
alAuxiliaryEffectSlotiv && alAuxiliaryEffectSlotf && alAuxiliaryEffectSlotfv &&
|
||
|
alGetAuxiliaryEffectSloti && alGetAuxiliaryEffectSlotiv && alGetAuxiliaryEffectSlotf &&
|
||
|
alGetAuxiliaryEffectSlotfv)
|
||
|
bEFXSupport = AL_TRUE;
|
||
|
#else
|
||
|
bEFXSupport = true;
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
return bEFXSupport;
|
||
|
}
|