/* * 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; }