#if defined(__APPLE__)
# include <OpenAL/al.h>
-# include <OpenAL/alut.h>
# include <OpenAL/alc.h>
#else
# include <AL/al.h>
-# include <AL/alut.h>
# include <AL/alc.h>
#endif
-#if defined (__APPLE__)
-// any C++ header file undefines isinf and isnan
-// so this should be included before <iostream>
-inline int (isinf)(double r) { return isinf(r); }
-inline int (isnan)(double r) { return isnan(r); }
+#if defined (__APPLE__)
+# ifdef __GNUC__
+# if ( __GNUC__ >= 3 ) && ( __GNUC_MINOR__ >= 3 )
+// # include <math.h>
+extern "C" int isnan (double);
+extern "C" int isinf (double);
+# else
+ // any C++ header file undefines isinf and isnan
+ // so this should be included before <iostream>
+ // the functions are STILL in libm (libSystem on mac os x)
+extern "C" int isnan (double);
+extern "C" int isinf (double);
+# endif
+# else
+// inline int (isinf)(double r) { return isinf(r); }
+// inline int (isnan)(double r) { return isnan(r); }
+# endif
#endif
-#if defined(__MINGW32__)
-#define isnan(x) _isnan(x)
+#if defined (__FreeBSD__)
+# if __FreeBSD_version < 500000
+ extern "C" {
+ inline int isnan(double r) { return !(r <= 0 || r >= 0); }
+ }
+# endif
#endif
#include STL_IOSTREAM
#include "soundmgr_openal.hxx"
+#if defined(__MINGW32__)
+#define isnan(x) _isnan(x)
+#endif
//
// Sound Manager
SG_LOG( SG_GENERAL, SG_INFO, "Initializing OpenAL sound manager" );
// initialize OpenAL
- alutInit( 0, NULL );
- alGetError();
- if ( alGetError() == AL_NO_ERROR) {
+ if ( (dev = alcOpenDevice( NULL )) != NULL
+ && ( context = alcCreateContext( dev, NULL )) != NULL ) {
working = true;
+ alcMakeContextCurrent( context );
} else {
working = false;
+ context = 0;
SG_LOG( SG_GENERAL, SG_ALERT, "Audio initialization failed!" );
}
listener_ori[4] = 1.0;
listener_ori[5] = 0.0;
+ alListenerf( AL_GAIN, 0.0f );
alListenerfv( AL_POSITION, listener_pos );
alListenerfv( AL_VELOCITY, listener_vel );
alListenerfv( AL_ORIENTATION, listener_ori );
SGSoundMgr::~SGSoundMgr() {
+ if (context)
+ alcDestroyContext( context );
//
// Remove the samples from the sample manager.
//
SGSoundSample *sample = sample_current->second;
delete sample;
}
-
- alutExit();
}
void
SGSoundMgr::pause ()
{
- ALCcontext *pCurContext = alcGetCurrentContext();
- alcSuspendContext( pCurContext );
- if ( alGetError() != AL_NO_ERROR) {
- SG_LOG( SG_GENERAL, SG_ALERT,
- "Oops AL error after soundmgr pause()!" );
+ if (context) {
+ alcSuspendContext( context );
+ if ( alGetError() != AL_NO_ERROR) {
+ SG_LOG( SG_GENERAL, SG_ALERT,
+ "Oops AL error after soundmgr pause()!" );
+ }
}
}
void
SGSoundMgr::resume ()
{
- ALCcontext *pCurContext = alcGetCurrentContext();
- alcProcessContext( pCurContext );
- if ( alGetError() != AL_NO_ERROR) {
- SG_LOG( SG_GENERAL, SG_ALERT,
- "Oops AL error after soundmgr resume()!" );
+ if (context) {
+ alcProcessContext( context );
+ if ( alGetError() != AL_NO_ERROR) {
+ SG_LOG( SG_GENERAL, SG_ALERT,
+ "Oops AL error after soundmgr resume()!" );
+ }
}
}