Files
eepp/src/audio/caudiodevice.cpp
2010-12-24 00:27:04 -03:00

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;
}
}}