summaryrefslogtreecommitdiff
path: root/engine/audio/private/snd_win.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engine/audio/private/snd_win.cpp')
-rw-r--r--engine/audio/private/snd_win.cpp185
1 files changed, 185 insertions, 0 deletions
diff --git a/engine/audio/private/snd_win.cpp b/engine/audio/private/snd_win.cpp
new file mode 100644
index 0000000..742f559
--- /dev/null
+++ b/engine/audio/private/snd_win.cpp
@@ -0,0 +1,185 @@
+//========= 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();
+ }
+}
+