Files

97 lines
2.3 KiB
C++

/*
===========================================================================
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;
}
}