/* =========================================================================== IceTech GPL Source Code Copyright (C) 2026 Justin Marshall =========================================================================== */ #include "precompiled.h" #pragma hdrstop #include "../../sound/snd_local.h" #include "win_local.h" #include "../../openal/idal.cpp" /* =============== idAudioHardwareWIN32 OpenAL owns the Windows playback device. The sound system still asks for an idAudioHardware object so shared mixer timing and speaker-count code can run. =============== */ class idAudioHardwareWIN32 : public idAudioHardware { public: idAudioHardwareWIN32() { numSpeakers = idSoundSystemLocal::s_numberOfSpeakers.GetInteger(); if ( numSpeakers != 6 ) { numSpeakers = 2; } } virtual bool Initialize() { return true; } virtual bool Lock( void **pDSLockedBuffer, ulong *dwDSLockedBufferSize ) { *pDSLockedBuffer = NULL; *dwDSLockedBufferSize = 0; return false; } virtual bool Unlock( void *pDSLockedBuffer, dword dwDSLockedBufferSize ) { return false; } virtual bool GetCurrentPosition( ulong *pdwCurrentWriteCursor ) { *pdwCurrentWriteCursor = 0; return false; } virtual bool Flush( void ) { return true; } virtual void Write( bool flushing ) {} virtual int GetNumberOfSpeakers( void ) { return numSpeakers; } virtual int GetMixBufferSize( void ) { return MIXBUFFER_SAMPLES * numSpeakers * sizeof( short ); } virtual short *GetMixBuffer( void ) { return NULL; } private: int numSpeakers; }; idAudioHardware *idAudioHardware::Alloc() { return new idAudioHardwareWIN32; } idAudioHardware::~idAudioHardware() {} static HMODULE hOpenAL = NULL; /* =============== Sys_LoadOpenAL =============== */ bool Sys_LoadOpenAL( void ) { const char *sym; if ( hOpenAL ) { return true; } hOpenAL = LoadLibraryA( idSoundSystemLocal::s_libOpenAL.GetString() ); if ( !hOpenAL ) { common->Warning( "LoadLibrary %s failed.", idSoundSystemLocal::s_libOpenAL.GetString() ); return false; } if ( ( sym = InitializeIDAL( hOpenAL ) ) ) { common->Warning( "GetProcAddress %s failed.", sym ); FreeLibrary( hOpenAL ); hOpenAL = NULL; return false; } return true; } /* =============== Sys_FreeOpenAL =============== */ void Sys_FreeOpenAL( void ) { if ( hOpenAL ) { FreeLibrary( hOpenAL ); hOpenAL = NULL; } }