You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
175 lines
3.8 KiB
175 lines
3.8 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//=====================================================================================// |
|
|
|
#include "audio_pch.h" |
|
|
|
#if defined( USE_SDL ) |
|
#include "snd_dev_sdl.h" |
|
#endif |
|
#ifdef OSX |
|
#include "snd_dev_openal.h" |
|
#endif |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
bool snd_firsttime = true; |
|
|
|
/* |
|
* Global variables. Must be visible to window-procedure function |
|
* so it can unlock and free the data block after it has been played. |
|
*/ |
|
IAudioDevice *g_AudioDevice = NULL; |
|
|
|
/* |
|
================== |
|
S_BlockSound |
|
================== |
|
*/ |
|
void S_BlockSound( void ) |
|
{ |
|
if ( !g_AudioDevice ) |
|
return; |
|
|
|
g_AudioDevice->Pause(); |
|
} |
|
|
|
/* |
|
================== |
|
S_UnblockSound |
|
================== |
|
*/ |
|
void S_UnblockSound( void ) |
|
{ |
|
if ( !g_AudioDevice ) |
|
return; |
|
|
|
g_AudioDevice->UnPause(); |
|
} |
|
|
|
/* |
|
================== |
|
AutoDetectInit |
|
|
|
Try to find a sound device to mix for. |
|
Returns a CAudioNULLDevice if nothing is found. |
|
================== |
|
*/ |
|
IAudioDevice *IAudioDevice::AutoDetectInit( bool waveOnly ) |
|
{ |
|
IAudioDevice *pDevice = NULL; |
|
|
|
if ( IsPC() ) |
|
{ |
|
#if defined( WIN32 ) && !defined( USE_SDL ) |
|
if ( waveOnly ) |
|
{ |
|
pDevice = Audio_CreateWaveDevice(); |
|
if ( !pDevice ) |
|
goto NULLDEVICE; |
|
} |
|
|
|
if ( !pDevice ) |
|
{ |
|
if ( snd_firsttime ) |
|
{ |
|
pDevice = Audio_CreateDirectSoundDevice(); |
|
} |
|
} |
|
|
|
// if DirectSound didn't succeed in initializing, try to initialize |
|
// waveOut sound, unless DirectSound failed because the hardware is |
|
// already allocated (in which case the user has already chosen not |
|
// to have sound) |
|
// UNDONE: JAY: This doesn't test for the hardware being in use anymore, REVISIT |
|
if ( !pDevice ) |
|
{ |
|
pDevice = Audio_CreateWaveDevice(); |
|
} |
|
#elif defined(OSX) |
|
if ( !pDevice ) |
|
{ |
|
DevMsg( "Using OpenAL Interface\n" ); |
|
pDevice = Audio_CreateOpenALDevice(); // fall back to openAL if the audio queue fails |
|
} |
|
#elif defined( USE_SDL ) |
|
DevMsg( "Trying SDL Audio Interface\n" ); |
|
pDevice = Audio_CreateSDLAudioDevice(); |
|
#ifdef NEVER |
|
// Jul 2012. mikesart. E-mail exchange with Ryan Gordon after figuring out that |
|
// Audio_CreatePulseAudioDevice() wasn't working on Ubuntu 12.04 (lots of stuttering). |
|
// |
|
// > I installed libpulse-dev, rebuilt SDL, and now SDL is using pulse |
|
// > audio and everything is working great. However I'm wondering if we |
|
// > need to fall back to PulseAudio in our codebase if SDL is doing that |
|
// > for us. I mean, is it worth me going through and debugging our Pulse |
|
// > Audio path or should I just remove it? |
|
// |
|
// Remove it...it never worked well, and only remained in case there were |
|
// concerns about relying on SDL. The SDL codepath is way easier to read, |
|
// simpler to maintain, and handles all sorts of strange audio backends, |
|
// including Pulse. |
|
if ( !pDevice ) |
|
{ |
|
DevMsg( "Trying PulseAudio Interface\n" ); |
|
pDevice = Audio_CreatePulseAudioDevice(); // fall back to PulseAudio if SDL fails |
|
} |
|
#endif // NEVER |
|
|
|
#else |
|
#error |
|
#endif |
|
} |
|
#if defined( _X360 ) |
|
else |
|
{ |
|
pDevice = Audio_CreateXAudioDevice( true ); |
|
if ( pDevice ) |
|
{ |
|
// xaudio requires threaded mixing |
|
S_EnableThreadedMixing( true ); |
|
} |
|
} |
|
#endif |
|
|
|
#if defined( WIN32 ) && !defined( USE_SDL ) |
|
NULLDEVICE: |
|
#endif |
|
snd_firsttime = false; |
|
|
|
if ( !pDevice ) |
|
{ |
|
if ( snd_firsttime ) |
|
DevMsg( "No sound device initialized\n" ); |
|
|
|
return Audio_GetNullDevice(); |
|
} |
|
|
|
return pDevice; |
|
} |
|
|
|
/* |
|
============== |
|
SNDDMA_Shutdown |
|
|
|
Reset the sound device for exiting |
|
=============== |
|
*/ |
|
void SNDDMA_Shutdown( void ) |
|
{ |
|
if ( g_AudioDevice != Audio_GetNullDevice() ) |
|
{ |
|
if ( g_AudioDevice ) |
|
{ |
|
g_AudioDevice->Shutdown(); |
|
delete g_AudioDevice; |
|
} |
|
|
|
// the NULL device is always valid |
|
g_AudioDevice = Audio_GetNullDevice(); |
|
} |
|
} |
|
|
|
|