• Main Page
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

src/audio/src/OALFramework/Framework.cpp

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2006, Creative Labs Inc.
00003  * All rights reserved.
00004  * 
00005  * Redistribution and use in source and binary forms, with or without modification, are permitted provided
00006  * that the following conditions are met:
00007  * 
00008  *     * Redistributions of source code must retain the above copyright notice, this list of conditions and
00009  *           the following disclaimer.
00010  *     * Redistributions in binary form must reproduce the above copyright notice, this list of conditions
00011  *           and the following disclaimer in the documentation and/or other materials provided with the distribution.
00012  *     * Neither the name of Creative Labs Inc. nor the names of its contributors may be used to endorse or
00013  *           promote products derived from this software without specific prior written permission.
00014  * 
00015  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
00016  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
00017  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
00018  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
00019  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00020  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00021  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00022  * POSSIBILITY OF SUCH DAMAGE.
00023  */
00024 
00025 #include "../h/OpenAL.h"
00026 // Win32 version of the Creative Labs OpenAL 1.1 Framework for samples
00027 /*#include<windows.h>
00028 #include<stdio.h>
00029 
00030 #include "Framework.h"
00031 #include "CWaves.h"
00032 #include "aldlist.h"*/
00033 
00034 static CWaves *g_pWaveLoader = NULL;
00035 
00036 // Imported EFX functions
00037 
00038 // Effect objects
00039 LPALGENEFFECTS alGenEffects = NULL;
00040 LPALDELETEEFFECTS alDeleteEffects = NULL;
00041 LPALISEFFECT alIsEffect = NULL;
00042 LPALEFFECTI alEffecti = NULL;
00043 LPALEFFECTIV alEffectiv = NULL;
00044 LPALEFFECTF alEffectf = NULL;
00045 LPALEFFECTFV alEffectfv = NULL;
00046 LPALGETEFFECTI alGetEffecti = NULL;
00047 LPALGETEFFECTIV alGetEffectiv = NULL;
00048 LPALGETEFFECTF alGetEffectf = NULL;
00049 LPALGETEFFECTFV alGetEffectfv = NULL;
00050 
00051 //Filter objects
00052 LPALGENFILTERS alGenFilters = NULL;
00053 LPALDELETEFILTERS alDeleteFilters = NULL;
00054 LPALISFILTER alIsFilter = NULL;
00055 LPALFILTERI alFilteri = NULL;
00056 LPALFILTERIV alFilteriv = NULL;
00057 LPALFILTERF alFilterf = NULL;
00058 LPALFILTERFV alFilterfv = NULL;
00059 LPALGETFILTERI alGetFilteri = NULL;
00060 LPALGETFILTERIV alGetFilteriv = NULL;
00061 LPALGETFILTERF alGetFilterf = NULL;
00062 LPALGETFILTERFV alGetFilterfv = NULL;
00063 
00064 // Auxiliary slot object
00065 LPALGENAUXILIARYEFFECTSLOTS alGenAuxiliaryEffectSlots = NULL;
00066 LPALDELETEAUXILIARYEFFECTSLOTS alDeleteAuxiliaryEffectSlots = NULL;
00067 LPALISAUXILIARYEFFECTSLOT alIsAuxiliaryEffectSlot = NULL;
00068 LPALAUXILIARYEFFECTSLOTI alAuxiliaryEffectSloti = NULL;
00069 LPALAUXILIARYEFFECTSLOTIV alAuxiliaryEffectSlotiv = NULL;
00070 LPALAUXILIARYEFFECTSLOTF alAuxiliaryEffectSlotf = NULL;
00071 LPALAUXILIARYEFFECTSLOTFV alAuxiliaryEffectSlotfv = NULL;
00072 LPALGETAUXILIARYEFFECTSLOTI alGetAuxiliaryEffectSloti = NULL;
00073 LPALGETAUXILIARYEFFECTSLOTIV alGetAuxiliaryEffectSlotiv = NULL;
00074 LPALGETAUXILIARYEFFECTSLOTF alGetAuxiliaryEffectSlotf = NULL;
00075 LPALGETAUXILIARYEFFECTSLOTFV alGetAuxiliaryEffectSlotfv = NULL;
00076 
00077 // XRAM functions and enum values
00078 
00079 LPEAXSETBUFFERMODE eaxSetBufferMode = NULL;
00080 LPEAXGETBUFFERMODE eaxGetBufferMode = NULL;
00081 
00082 ALenum eXRAMSize = 0;
00083 ALenum eXRAMFree = 0;
00084 ALenum eXRAMAuto = 0;
00085 ALenum eXRAMHardware = 0;
00086 ALenum eXRAMAccessible = 0;
00087 
00088 
00089 // Initialization and enumeration
00090 void ALFWInit(int maxSounds)
00091 {
00092         g_pWaveLoader = new CWaves(maxSounds);
00093 }
00094 
00095 // Initialization and enumeration
00096 void ALFWUninit()
00097 {
00098         ALFWShutdown();
00099 }
00100 
00101 void ALFWShutdown()
00102 {
00103         if (g_pWaveLoader)
00104         {
00105                 delete g_pWaveLoader;
00106                 g_pWaveLoader = NULL;
00107         }
00108 
00109         //ALFWprintf("\nPress a key to quit\n");
00110         //ALchar ch = _getch();
00111 }
00112 
00113 ALboolean ALFWInitOpenAL()
00114 {
00115         ALCcontext *pContext = NULL;
00116         ALCdevice *pDevice = NULL;
00117 
00118         pDevice = alcOpenDevice(0);
00119         if(pDevice)
00120         {
00121                 pContext = alcCreateContext(pDevice, 0);
00122                 if (pContext)
00123                 {
00124                         alcMakeContextCurrent(pContext);
00125                         return AL_TRUE;
00126                 }
00127                 else
00128                 {
00129                         alcCloseDevice(pDevice);
00130                 }
00131         }
00132 
00133         return AL_FALSE;
00134 }
00135 
00136 ALboolean ALFWShutdownOpenAL()
00137 {
00138         ALCcontext *pContext;
00139         ALCdevice *pDevice;
00140 
00141         pContext = alcGetCurrentContext();
00142         pDevice = alcGetContextsDevice(pContext);
00143         
00144         alcMakeContextCurrent(0);
00145         alcDestroyContext(pContext);
00146         alcCloseDevice(pDevice);
00147 
00148         return AL_TRUE;
00149 }
00150 
00151 ALboolean ALFWLoadWaveToBuffer(const rchar *szWaveFile, ALuint uiBufferID, ALenum eXRAMBufferMode)
00152 {
00153         ALint                   ID, iDataSize, iFrequency;
00154         ALenum                  eBufferFormat;
00155         ALchar                  *pData;
00156         ALboolean               bReturn = AL_FALSE;
00157 
00158         if(g_pWaveLoader)
00159         {
00160                 if(SUCCEEDED(g_pWaveLoader->LoadWaveFile(szWaveFile, &ID)))
00161                 {
00162                         if((SUCCEEDED(g_pWaveLoader->GetWaveSize(ID, (unsigned long*)&iDataSize))) &&
00163                                 (SUCCEEDED(g_pWaveLoader->GetWaveData(ID, (void**)&pData))) &&
00164                                 (SUCCEEDED(g_pWaveLoader->GetWaveFrequency(ID, (unsigned long*)&iFrequency))) &&
00165                                 (SUCCEEDED(g_pWaveLoader->GetWaveALBufferFormat(ID, &alGetEnumValue, (unsigned long*)&eBufferFormat))))
00166                         {
00167                                 // Set XRAM Mode (if application)
00168                                 if(eaxSetBufferMode && eXRAMBufferMode)
00169                                         eaxSetBufferMode(1, &uiBufferID, eXRAMBufferMode);
00170 
00171                                 alGetError();
00172                                 alBufferData(uiBufferID, eBufferFormat, pData, iDataSize, iFrequency);
00173                                 if (alGetError() == AL_NO_ERROR)
00174                                         bReturn = AL_TRUE;
00175 
00176                                 g_pWaveLoader->DeleteWaveFile(ID);
00177                         }
00178                 }
00179         }
00180 
00181         return bReturn;
00182 }
00183 
00184 /*void ALFWprintf( const char* x, ... )
00185 {
00186     va_list args;
00187     va_start( args, x );
00188     vprintf( x, args ); 
00189     va_end( args );
00190 }
00191 
00192 ALchar fullPath[_MAX_PATH];
00193 ALchar *ALFWaddMediaPath(const ALchar *filename)
00194 {
00195         sprintf(fullPath, "%s%s", "..\\..\\Media\\", filename);
00196         return fullPath;
00197 }
00198 
00199 ALint ALFWKeyPress(void)
00200 {
00201         return _kbhit();
00202 }*/
00203 
00204 // Extension Queries
00205 
00206 ALboolean ALFWIsXRAMSupported()
00207 {
00208         ALboolean bXRAM = AL_FALSE;
00209         
00210         if (alIsExtensionPresent("EAX-RAM") == AL_TRUE)
00211         {
00212                 // Get X-RAM Function pointers
00213                 eaxSetBufferMode = (EAXSetBufferMode)alGetProcAddress("EAXSetBufferMode");
00214                 eaxGetBufferMode = (EAXGetBufferMode)alGetProcAddress("EAXGetBufferMode");
00215 
00216                 if (eaxSetBufferMode && eaxGetBufferMode)
00217                 {
00218                         eXRAMSize = alGetEnumValue("AL_EAX_RAM_SIZE");
00219                         eXRAMFree = alGetEnumValue("AL_EAX_RAM_FREE");
00220                         eXRAMAuto = alGetEnumValue("AL_STORAGE_AUTOMATIC");
00221                         eXRAMHardware = alGetEnumValue("AL_STORAGE_HARDWARE");
00222                         eXRAMAccessible = alGetEnumValue("AL_STORAGE_ACCESSIBLE");
00223 
00224                         if (eXRAMSize && eXRAMFree && eXRAMAuto && eXRAMHardware && eXRAMAccessible)
00225                                 bXRAM = AL_TRUE;
00226                 }
00227         }
00228 
00229         return bXRAM;
00230 }
00231 
00232 ALboolean ALFWIsEFXSupported()
00233 {
00234         ALCdevice *pDevice = NULL;
00235         ALCcontext *pContext = NULL;
00236         ALboolean bEFXSupport = AL_FALSE;
00237 
00238         pContext = alcGetCurrentContext();
00239         pDevice = alcGetContextsDevice(pContext);
00240 
00241         if (alcIsExtensionPresent(pDevice, (ALCchar*)ALC_EXT_EFX_NAME))
00242         {
00243                 // Get function pointers
00244                 alGenEffects = (LPALGENEFFECTS)alGetProcAddress("alGenEffects");
00245                 alDeleteEffects = (LPALDELETEEFFECTS )alGetProcAddress("alDeleteEffects");
00246                 alIsEffect = (LPALISEFFECT )alGetProcAddress("alIsEffect");
00247                 alEffecti = (LPALEFFECTI)alGetProcAddress("alEffecti");
00248                 alEffectiv = (LPALEFFECTIV)alGetProcAddress("alEffectiv");
00249                 alEffectf = (LPALEFFECTF)alGetProcAddress("alEffectf");
00250                 alEffectfv = (LPALEFFECTFV)alGetProcAddress("alEffectfv");
00251                 alGetEffecti = (LPALGETEFFECTI)alGetProcAddress("alGetEffecti");
00252                 alGetEffectiv = (LPALGETEFFECTIV)alGetProcAddress("alGetEffectiv");
00253                 alGetEffectf = (LPALGETEFFECTF)alGetProcAddress("alGetEffectf");
00254                 alGetEffectfv = (LPALGETEFFECTFV)alGetProcAddress("alGetEffectfv");
00255                 alGenFilters = (LPALGENFILTERS)alGetProcAddress("alGenFilters");
00256                 alDeleteFilters = (LPALDELETEFILTERS)alGetProcAddress("alDeleteFilters");
00257                 alIsFilter = (LPALISFILTER)alGetProcAddress("alIsFilter");
00258                 alFilteri = (LPALFILTERI)alGetProcAddress("alFilteri");
00259                 alFilteriv = (LPALFILTERIV)alGetProcAddress("alFilteriv");
00260                 alFilterf = (LPALFILTERF)alGetProcAddress("alFilterf");
00261                 alFilterfv = (LPALFILTERFV)alGetProcAddress("alFilterfv");
00262                 alGetFilteri = (LPALGETFILTERI )alGetProcAddress("alGetFilteri");
00263                 alGetFilteriv= (LPALGETFILTERIV )alGetProcAddress("alGetFilteriv");
00264                 alGetFilterf = (LPALGETFILTERF )alGetProcAddress("alGetFilterf");
00265                 alGetFilterfv= (LPALGETFILTERFV )alGetProcAddress("alGetFilterfv");
00266                 alGenAuxiliaryEffectSlots = (LPALGENAUXILIARYEFFECTSLOTS)alGetProcAddress("alGenAuxiliaryEffectSlots");
00267                 alDeleteAuxiliaryEffectSlots = (LPALDELETEAUXILIARYEFFECTSLOTS)alGetProcAddress("alDeleteAuxiliaryEffectSlots");
00268                 alIsAuxiliaryEffectSlot = (LPALISAUXILIARYEFFECTSLOT)alGetProcAddress("alIsAuxiliaryEffectSlot");
00269                 alAuxiliaryEffectSloti = (LPALAUXILIARYEFFECTSLOTI)alGetProcAddress("alAuxiliaryEffectSloti");
00270                 alAuxiliaryEffectSlotiv = (LPALAUXILIARYEFFECTSLOTIV)alGetProcAddress("alAuxiliaryEffectSlotiv");
00271                 alAuxiliaryEffectSlotf = (LPALAUXILIARYEFFECTSLOTF)alGetProcAddress("alAuxiliaryEffectSlotf");
00272                 alAuxiliaryEffectSlotfv = (LPALAUXILIARYEFFECTSLOTFV)alGetProcAddress("alAuxiliaryEffectSlotfv");
00273                 alGetAuxiliaryEffectSloti = (LPALGETAUXILIARYEFFECTSLOTI)alGetProcAddress("alGetAuxiliaryEffectSloti");
00274                 alGetAuxiliaryEffectSlotiv = (LPALGETAUXILIARYEFFECTSLOTIV)alGetProcAddress("alGetAuxiliaryEffectSlotiv");
00275                 alGetAuxiliaryEffectSlotf = (LPALGETAUXILIARYEFFECTSLOTF)alGetProcAddress("alGetAuxiliaryEffectSlotf");
00276                 alGetAuxiliaryEffectSlotfv = (LPALGETAUXILIARYEFFECTSLOTFV)alGetProcAddress("alGetAuxiliaryEffectSlotfv");
00277 
00278                 if (alGenEffects &&     alDeleteEffects && alIsEffect && alEffecti && alEffectiv &&     alEffectf &&
00279                         alEffectfv && alGetEffecti && alGetEffectiv && alGetEffectf && alGetEffectfv && alGenFilters &&
00280                         alDeleteFilters && alIsFilter && alFilteri && alFilteriv &&     alFilterf && alFilterfv &&
00281                         alGetFilteri && alGetFilteriv && alGetFilterf && alGetFilterfv && alGenAuxiliaryEffectSlots &&
00282                         alDeleteAuxiliaryEffectSlots && alIsAuxiliaryEffectSlot && alAuxiliaryEffectSloti &&
00283                         alAuxiliaryEffectSlotiv && alAuxiliaryEffectSlotf && alAuxiliaryEffectSlotfv &&
00284                         alGetAuxiliaryEffectSloti && alGetAuxiliaryEffectSlotiv && alGetAuxiliaryEffectSlotf &&
00285                         alGetAuxiliaryEffectSlotfv)
00286                         bEFXSupport = AL_TRUE;
00287         }
00288 
00289         return bEFXSupport;
00290 }

Generated on Fri Jun 18 2010 17:48:39 for Cannonball by  doxygen 1.7.0