wolf3d-ios/wolf3d/code/env/openal_main.c

257 lines
5.3 KiB
C
Raw Permalink Normal View History

/*
Copyright (C) 2004 Michael Liebscher
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/*
* openal_main.c: Interface to Sound Device.
*
* Author: Michael Liebscher <johnnycanuck@users.sourceforge.net>
* Date: 2004
*
*/
#include "../wolfiphone.h"
#ifdef _WIN32
#define OPENAL_DLL_NAME "openal32.dll"
#elif __unix__
#define OPENAL_DLL_NAME "libopenal.so"
#elif IPHONE
#define OPENAL_DLL_NAME "/System/Library/Frameworks/OpenAL.framework/OpenAL"
#else
#error "Please define OPENAL_DLL_NAME"
#endif
PRIVATE ALCcontext *Context;
PRIVATE ALCdevice *Device;
cvar_t *s_driver;
cvar_t *s_device;
char *deviceList;
char *sound_devices[ 12 ];
W16 numSoundDevices, numDefaultSoundDevice;
/*
-----------------------------------------------------------------------------
Function: Sound_Device_getDeviceList -Get OpenAL device list.
Parameters: Nothing.
Returns: Nothing.
Notes:
-----------------------------------------------------------------------------
*/
PRIVATE void Sound_Device_getDeviceList( void )
{
char deviceName[ 256 ];
ALboolean isExtensionPresent = AL_FALSE;
my_strlcpy( deviceName, s_device->string, sizeof( deviceName ) );
isExtensionPresent = pfalcIsExtensionPresent( NULL, (ALubyte*)"ALC_ENUMERATION_EXT");
ALC_CheckErrors();
if( isExtensionPresent == AL_TRUE )
{
// try out enumeration extension
deviceList = (char *)pfalcGetString( NULL, ALC_DEVICE_SPECIFIER );
ALC_CheckErrors();
for( numSoundDevices = 0 ; numSoundDevices < 12 ; ++numSoundDevices )
{
sound_devices[ numSoundDevices ] = NULL;
}
for( numSoundDevices = 0 ; numSoundDevices < 12 ; ++numSoundDevices )
{
sound_devices[ numSoundDevices ] = deviceList;
if( strcmp( sound_devices[ numSoundDevices ], deviceName ) == 0 )
{
numDefaultSoundDevice = numSoundDevices;
}
deviceList += strlen( deviceList );
if( deviceList[ 0 ] == 0 )
{
if( deviceList[ 1 ] == 0 )
{
break;
}
else
{
deviceList += 1;
}
}
} // End for numSoundDevices = 0 ; numSoundDevices < 12 ; ++numSoundDevices
}
}
/*
-----------------------------------------------------------------------------
Function: Sound_Device_Register -Register OpenAL cvars.
Parameters: Nothing.
Returns: Nothing.
Notes:
-----------------------------------------------------------------------------
*/
PRIVATE void Sound_Device_Register( void )
{
s_driver = Cvar_Get( "s_driver", OPENAL_DLL_NAME, CVAR_ARCHIVE );
s_device = Cvar_Get( "s_device", "", CVAR_LATCH | CVAR_ARCHIVE );
}
/*
-----------------------------------------------------------------------------
Function: Sound_Device_Setup -Setup OpenAL sound device.
Parameters: Nothing.
Returns: true on success, otherwise false.
Notes: Call Sound_Device_Shutdown() when you are done.
-----------------------------------------------------------------------------
*/
PUBLIC _boolean Sound_Device_Setup( void )
{
Com_Printf( "...Initializing AudioSession\n" );
SysIPhoneInitAudioSession();
Com_Printf( "...Initializing OpenAL subsystem\n" );
Sound_Device_Register();
// Initialize our OpenAL dynamic bindings
if( ! OpenAL_Init( s_driver->string ) )
{
Com_Printf( "[%s]: Dynamic binding of (%s) failed\n", "openal_main.c", s_driver->string );
goto failed;
}
Sound_Device_getDeviceList();
Device = pfalcOpenDevice( (ALCubyte *)( (s_device->string[ 0 ]) ? s_device->string : NULL ) );
if( Device == NULL )
{
Com_Printf( "Failed to Initialize OpenAL\n" );
goto failed;
}
// Create context(s)
Context = pfalcCreateContext( Device, NULL );
if( Context == NULL )
{
Com_Printf( "Failed to initialize OpenAL\n" );
goto failed;
}
// Set active context
pfalcGetError( Device );
pfalcMakeContextCurrent( Context );
if( pfalcGetError( Device ) != ALC_NO_ERROR )
{
Com_Printf( "Failed to Make Context Current\n" );
goto failed;
}
return true;
failed:
if( Context )
{
pfalcDestroyContext( Context );
ALC_CheckErrors();
Context = NULL;
}
if( Device )
{
pfalcCloseDevice( Device );
ALC_CheckErrors();
Device = NULL;
}
OpenAL_Shutdown();
return false;
}
/*
-----------------------------------------------------------------------------
Function: Sound_Device_Shutdown -Shutdown OpenAL sound device.
Parameters: Nothing.
Returns: Nothing.
Notes:
-----------------------------------------------------------------------------
*/
PUBLIC void Sound_Device_Shutdown( void )
{
if( Context )
{
pfalcMakeContextCurrent( NULL );
ALC_CheckErrors();
pfalcDestroyContext( Context );
ALC_CheckErrors();
Context = NULL;
}
if( Device )
{
pfalcCloseDevice( Device );
ALC_CheckErrors();
Device = NULL;
}
OpenAL_Shutdown();
}