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.
186 lines
4.0 KiB
186 lines
4.0 KiB
![]()
4 years ago
|
//========= 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"
|
||
|
#include "snd_dev_mac_audioqueue.h"
|
||
|
|
||
|
ConVar snd_audioqueue( "snd_audioqueue", "1" );
|
||
|
|
||
|
#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 ( !CommandLine()->CheckParm( "-snd_openal" ) )
|
||
|
{
|
||
|
DevMsg( "Using AudioQueue Interface\n" );
|
||
|
pDevice = Audio_CreateMacAudioQueueDevice();
|
||
|
}
|
||
|
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();
|
||
|
}
|
||
|
}
|
||
|
|