mirror of
https://github.com/SpartanJ/eepp.git
synced 2026-05-31 10:36:30 +03:00
127 lines
3.2 KiB
C++
Executable File
127 lines
3.2 KiB
C++
Executable File
#include "caudiodevice.hpp"
|
|
#include "caudiolistener.hpp"
|
|
|
|
namespace EE { namespace Audio {
|
|
|
|
cAudioDevice * cAudioDevice::mInstance = NULL;
|
|
|
|
cAudioDevice::cAudioDevice() :
|
|
mDevice(NULL),
|
|
mContext(NULL),
|
|
mRefCount(0)
|
|
{
|
|
PrintInfo();
|
|
|
|
// Create the device
|
|
mDevice = alcOpenDevice( NULL );
|
|
|
|
if ( mDevice ) {
|
|
mContext = alcCreateContext( mDevice, NULL );
|
|
|
|
if ( mContext ) {
|
|
// Set the context as the current one (we'll only need one)
|
|
alcMakeContextCurrent( mContext );
|
|
|
|
// Initialize the listener, located at the origin and looking along the Z axis
|
|
cAudioListener::instance()->SetPosition(0.f, 0.f, 0.f);
|
|
cAudioListener::instance()->SetTarget(0.f, 0.f, -1.f);
|
|
|
|
cLog::instance()->Write( "OpenAL current device: " );
|
|
cLog::instance()->Write( "\t" + std::string( (const char *)alcGetString(mDevice, ALC_DEVICE_SPECIFIER) ) );
|
|
} else {
|
|
cLog::instance()->Write("Failed to create the audio context");
|
|
}
|
|
} else {
|
|
cLog::instance()->Write("Failed to open the audio device");
|
|
}
|
|
}
|
|
|
|
void cAudioDevice::PrintInfo() {
|
|
cLog::instance()->Write( "OpenAL devices detected:" );
|
|
|
|
if ( alcIsExtensionPresent( NULL, (const ALCchar *) "ALC_ENUMERATION_EXT" ) == AL_TRUE ) {
|
|
const char *s = (const char *) alcGetString(NULL, ALC_DEVICE_SPECIFIER);
|
|
|
|
while (*s != '\0') {
|
|
cLog::instance()->Write( "\t" + std::string( s ) );
|
|
while (*s++ != '\0');
|
|
}
|
|
} else {
|
|
cLog::instance()->Write( "OpenAL device enumeration isn't available." );
|
|
}
|
|
|
|
cLog::instance()->Write( "OpenAL default device: " );
|
|
cLog::instance()->Write( "\t" + std::string( (const char *)alcGetString(NULL, ALC_DEFAULT_DEVICE_SPECIFIER) ) );
|
|
}
|
|
|
|
cAudioDevice::~cAudioDevice() {
|
|
// Destroy the context
|
|
alcMakeContextCurrent( NULL );
|
|
|
|
if ( mContext )
|
|
alcDestroyContext( mContext );
|
|
|
|
// Destroy the device
|
|
if ( mDevice )
|
|
alcCloseDevice( mDevice );
|
|
}
|
|
|
|
bool cAudioDevice::isCreated() {
|
|
return mContext && mDevice;
|
|
}
|
|
|
|
cAudioDevice * cAudioDevice::instance() {
|
|
// Create the audio device if it doesn't exist
|
|
if ( NULL == mInstance )
|
|
mInstance = eeNew( cAudioDevice, () );
|
|
|
|
return mInstance;
|
|
}
|
|
|
|
void cAudioDevice::AddReference() {
|
|
cAudioDevice::instance();
|
|
|
|
// Increase the references count
|
|
mInstance->mRefCount++;
|
|
}
|
|
|
|
void cAudioDevice::RemoveReference() {
|
|
// Decrease the references count
|
|
mInstance->mRefCount--;
|
|
|
|
// Destroy the audio device if the references count reaches 0
|
|
if (mInstance->mRefCount == 0) {
|
|
eeDelete( mInstance );
|
|
mInstance = NULL;
|
|
}
|
|
}
|
|
|
|
ALCdevice * cAudioDevice::GetDevice() const {
|
|
return mDevice;
|
|
}
|
|
|
|
bool cAudioDevice::IsExtensionSupported( const std::string& extension ) {
|
|
cAudioDevice::instance();
|
|
|
|
if ( ( extension.length() > 2 ) && ( extension.substr(0, 3) == "ALC" ) )
|
|
return alcIsExtensionPresent( mDevice, extension.c_str() ) != AL_FALSE;
|
|
else
|
|
return alIsExtensionPresent( extension.c_str() ) != AL_FALSE;
|
|
}
|
|
|
|
ALenum cAudioDevice::GetFormatFromChannelsCount(unsigned int ChannelsCount) const {
|
|
cAudioDevice::instance();
|
|
|
|
switch (ChannelsCount) {
|
|
case 1 : return AL_FORMAT_MONO16;
|
|
case 2 : return AL_FORMAT_STEREO16;
|
|
case 4 : return alGetEnumValue("AL_FORMAT_QUAD16");
|
|
case 6 : return alGetEnumValue("AL_FORMAT_51CHN16");
|
|
case 7 : return alGetEnumValue("AL_FORMAT_61CHN16");
|
|
case 8 : return alGetEnumValue("AL_FORMAT_71CHN16");
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
}}
|