QALC_IMP #undef QAL #define QAL(type, func) type q##func QAL_IMP #undef QAL void QAL_Shutdown(void) { if (context) { qalcMakeContextCurrent(NULL); qalcDestroyContext(context); context = NULL; } if (device) { qalcCloseDevice(device); device = NULL; } #define QAL(type, func) q##func = NULL QALC_IMP QAL_IMP #undef QAL if (handle) { Sys_FreeLibrary(handle); handle = NULL; } if (al_driver) al_driver->flags &= ~CVAR_SOUND; if (al_device) al_device->flags &= ~CVAR_SOUND; }
/* ================= S_AL_Shutdown ================= */ static void S_AL_Shutdown( void ) { // Shut down everything int i; for (i = 0; i < MAX_RAW_STREAMS; i++) S_AL_StreamDie(i); S_AL_StopBackgroundTrack( ); S_AL_SrcShutdown( ); S_AL_BufferShutdown( ); qalcDestroyContext(alContext); qalcCloseDevice(alDevice); #ifdef USE_VOIP if (alCaptureDevice != NULL) { qalcCaptureStop(alCaptureDevice); qalcCaptureCloseDevice(alCaptureDevice); alCaptureDevice = NULL; Com_Printf( "OpenAL capture device closed.\n" ); } #endif for (i = 0; i < MAX_RAW_STREAMS; i++) { streamSourceHandles[i] = -1; streamPlaying[i] = qfalse; streamSources[i] = 0; } QAL_Shutdown(); }
/* ================= S_AL_Shutdown ================= */ static void S_AL_Shutdown( void ) { // Shut down everything S_AL_StreamDie( ); S_AL_StopBackgroundTrack( ); S_AL_SrcShutdown( ); S_AL_BufferShutdown( ); qalcDestroyContext(alContext); qalcCloseDevice(alDevice); QAL_Shutdown(); }
/* * S_Shutdown */ void S_Shutdown( qboolean verbose ) { S_StopStream(); S_StopBackgroundTrack(); #ifdef ENABLE_PLAY trap_Cmd_RemoveCommand( "play" ); #endif trap_Cmd_RemoveCommand( "music" ); trap_Cmd_RemoveCommand( "stopmusic" ); trap_Cmd_RemoveCommand( "prevmusic" ); trap_Cmd_RemoveCommand( "nextmusic" ); trap_Cmd_RemoveCommand( "pausemusic" ); trap_Cmd_RemoveCommand( "soundlist" ); trap_Cmd_RemoveCommand( "s_devices" ); S_ShutdownSources(); S_ShutdownBuffers(); S_ShutdownDecoders( verbose ); if( alContext ) { if( !snd_shutdown_bug ) qalcMakeContextCurrent( NULL ); qalcDestroyContext( alContext ); alContext = NULL; } if( alDevice ) { qalcCloseDevice( alDevice ); alDevice = NULL; } QAL_Shutdown(); S_MemFreePool( &soundpool ); }
void QAL_Shutdown (void) { if (context) { qalcMakeContextCurrent (NULL); qalcDestroyContext (context); context = NULL; } if (device) { qalcCloseDevice (device); device = NULL; } #define QAL(type,func) q##func = NULL; QALC_IMP QAL_IMP #undef QAL Sys_FreeLibrary (handle); handle = NULL; }
void SndAl_Shutdown( void ) { // Remove commands si.Cmd_RemoveCommand( "music" ); si.Cmd_RemoveCommand( "play" ); // Shut down everything al_stream_die(); SndAl_StopBackgroundTrack(); al_src_shutdown(); al_buf_shutdown(); if ( !snd_shutdown_bug ) { qalcMakeContextCurrent( NULL ); } qalcDestroyContext( alContext ); qalcCloseDevice( alDevice ); #ifdef USE_VOIP if ( alCaptureDevice != NULL ) { qalcCaptureStop( alCaptureDevice ); qalcCaptureCloseDevice( alCaptureDevice ); alCaptureDevice = NULL; si.Printf( PRINT_ALL, "OpenAL capture device closed.\n" ); } #endif #ifdef USE_OPENAL_DLOPEN QAL_Shutdown(); #endif }
/* * S_Shutdown */ static void S_Shutdown( qboolean verbose ) { S_StopStreams(); S_LockBackgroundTrack( qfalse ); S_StopBackgroundTrack(); S_ShutdownSources(); S_ShutdownDecoders( verbose ); if( alContext ) { if( !snd_shutdown_bug ) qalcMakeContextCurrent( NULL ); qalcDestroyContext( alContext ); alContext = NULL; } if( alDevice ) { qalcCloseDevice( alDevice ); alDevice = NULL; } }
/* * S_Init */ qboolean S_Init( void *hwnd, int maxEntities, qboolean verbose ) { int numDevices; int userDeviceNum = -1; char *devices, *defaultDevice; soundpool = S_MemAllocPool( "OpenAL sound module" ); alDevice = NULL; alContext = NULL; #ifdef OPENAL_RUNTIME if( !QAL_Init( ALDRIVER, verbose ) ) { #ifdef ALDRIVER_ALT if( !QAL_Init( ALDRIVER_ALT, verbose ) ) #endif { Com_Printf( "Failed to load OpenAL library: %s\n", ALDRIVER ); goto fail_no_device; } } #endif // get system default device identifier defaultDevice = ( char * )qalcGetString( NULL, ALC_DEFAULT_DEVICE_SPECIFIER ); if( !defaultDevice ) { Com_Printf( "Failed to get openAL default device\n" ); goto fail_no_device; } s_openAL_device = trap_Cvar_Get( "s_openAL_device", ALDEVICE_DEFAULT ? ALDEVICE_DEFAULT : defaultDevice, CVAR_ARCHIVE|CVAR_LATCH_SOUND ); devices = ( char * )qalcGetString( NULL, ALC_DEVICE_SPECIFIER ); for( numDevices = 0; *devices; devices += strlen( devices ) + 1, numDevices++ ) { if( !Q_stricmp( s_openAL_device->string, devices ) ) { userDeviceNum = numDevices; // force case sensitive if( strcmp( s_openAL_device->string, devices ) ) trap_Cvar_ForceSet( "s_openAL_device", devices ); } } if( !numDevices ) { Com_Printf( "Failed to get openAL devices\n" ); goto fail_no_device; } // the device assigned by the user is not available if( userDeviceNum == -1 ) { Com_Printf( "'s_openAL_device': incorrect device name, reseting to default\n" ); trap_Cvar_ForceSet( "s_openAL_device", ALDEVICE_DEFAULT ? ALDEVICE_DEFAULT : defaultDevice ); devices = ( char * )qalcGetString( NULL, ALC_DEVICE_SPECIFIER ); for( numDevices = 0; *devices; devices += strlen( devices ) + 1, numDevices++ ) { if( !Q_stricmp( s_openAL_device->string, devices ) ) userDeviceNum = numDevices; } if( userDeviceNum == -1 ) trap_Cvar_ForceSet( "s_openAL_device", defaultDevice ); } alDevice = qalcOpenDevice( (const ALchar *)s_openAL_device->string ); if( !alDevice ) { Com_Printf( "Failed to open device\n" ); goto fail_no_device; } // Create context alContext = qalcCreateContext( alDevice, NULL ); if( !alContext ) { Com_Printf( "Failed to create context\n" ); goto fail; } qalcMakeContextCurrent( alContext ); if( verbose ) { Com_Printf( "OpenAL initialized\n" ); if( numDevices ) { int i; Com_Printf( " Devices: " ); devices = ( char * )qalcGetString( NULL, ALC_DEVICE_SPECIFIER ); for( i = 0; *devices; devices += strlen( devices ) + 1, i++ ) Com_Printf( "%s%s", devices, ( i < numDevices - 1 ) ? ", " : "" ); Com_Printf( "\n" ); if( defaultDevice && *defaultDevice ) Com_Printf( " Default system device: %s\n", defaultDevice ); Com_Printf( "\n" ); } Com_Printf( " Device: %s\n", qalcGetString( alDevice, ALC_DEVICE_SPECIFIER ) ); Com_Printf( " Vendor: %s\n", qalGetString( AL_VENDOR ) ); Com_Printf( " Version: %s\n", qalGetString( AL_VERSION ) ); Com_Printf( " Renderer: %s\n", qalGetString( AL_RENDERER ) ); Com_Printf( " Extensions: %s\n", qalGetString( AL_EXTENSIONS ) ); } // Check for Linux shutdown race condition if( !Q_stricmp( qalGetString( AL_VENDOR ), "J. Valenzuela" ) ) snd_shutdown_bug = qtrue; s_volume = trap_Cvar_Get( "s_volume", "0.8", CVAR_ARCHIVE ); s_musicvolume = trap_Cvar_Get( "s_musicvolume", "0.5", CVAR_ARCHIVE ); s_doppler = trap_Cvar_Get( "s_doppler", "1.0", CVAR_ARCHIVE ); s_sound_velocity = trap_Cvar_Get( "s_sound_velocity", "10976", CVAR_DEVELOPER ); s_stereo2mono = trap_Cvar_Get ( "s_stereo2mono", "0", CVAR_ARCHIVE ); qalDopplerFactor( s_doppler->value ); qalDopplerVelocity( s_sound_velocity->value > 0.0f ? s_sound_velocity->value : 0.0f ); if( qalSpeedOfSound ) // opelAL 1.1 only. alDopplerVelocity being deprecated qalSpeedOfSound( s_sound_velocity->value > 0.0f ? s_sound_velocity->value : 0.0f ); s_doppler->modified = qfalse; S_SetAttenuationModel( S_DEFAULT_ATTENUATION_MODEL, S_DEFAULT_ATTENUATION_MAXDISTANCE, S_DEFAULT_ATTENUATION_REFDISTANCE ); S_LockBackgroundTrack( qfalse ); if( !S_InitDecoders( verbose ) ) { Com_Printf( "Failed to init decoders\n" ); goto fail; } if( !S_InitBuffers() ) { Com_Printf( "Failed to init buffers\n" ); goto fail; } if( !S_InitSources( maxEntities, verbose ) ) { Com_Printf( "Failed to init sources\n" ); goto fail; } #ifdef ENABLE_PLAY trap_Cmd_AddCommand( "play", S_Play ); #endif trap_Cmd_AddCommand( "music", S_Music ); trap_Cmd_AddCommand( "stopmusic", S_StopMusic ); trap_Cmd_AddCommand( "prevmusic", S_PrevMusic ); trap_Cmd_AddCommand( "nextmusic", S_NextMusic ); trap_Cmd_AddCommand( "pausemusic", S_PauseMusic ); trap_Cmd_AddCommand( "soundlist", S_SoundList ); trap_Cmd_AddCommand( "s_devices", S_ListDevices ); return qtrue; fail: if( alContext ) { if( !snd_shutdown_bug ) qalcMakeContextCurrent( NULL ); qalcDestroyContext( alContext ); alContext = NULL; } if( alDevice ) { qalcCloseDevice( alDevice ); alDevice = NULL; } fail_no_device: S_MemFreePool( &soundpool ); return qfalse; }