#endif
#if defined( __APPLE__ )
-# include <OpenAL/alut.h>
+# include <ALUT/alut.h>
#else
# include <AL/alut.h>
#endif
#include <iostream>
#include <algorithm>
+#include <cstring>
#include "soundmgr_openal.hxx"
#include <simgear/misc/sg_path.hxx>
#include <simgear/math/SGMath.hxx>
+using std::string;
+using std::vector;
+
extern bool isNaN(float *v);
#define MAX_SOURCES 128
+
+#ifndef ALC_ALL_DEVICES_SPECIFIER
+# define ALC_ALL_DEVICES_SPECIFIER 0x1013
+#endif
+
//
// Sound Manager
//
}
}
_alut_init++;
+#else
+ //#error ALUT 1.1 required, ALUT 1.0 is no longer supported, please upgrade
#endif
}
_vendor = (const char *)alGetString(AL_VENDOR);
_renderer = (const char *)alGetString(AL_RENDERER);
- if ( (_vendor != "OpenAL Community" && _vendor != "Apple Computer Inc.") ||
- (_renderer != "Software" && _renderer != "OpenAL Sample Implementation")
- )
- {
+
+ if (_vendor == "Creative Labs Inc.") {
+ _bad_doppler = true;
+
+ } else if (_vendor == "OpenAL Community" && _renderer == "OpenAL Soft") {
_bad_doppler = true;
}
ALint result;
alGetSourcei( source, AL_SOURCE_STATE, &result );
- if ( result == AL_PLAYING )
+ if ( result == AL_PLAYING ) {
alSourceStop( source );
- testForALError("release source");
+ }
- alSourcei( source, AL_BUFFER, 0 );
+ alSourcei( source, AL_BUFFER, 0 ); // detach the associated buffer
+ testForALError("release_source");
_free_sources.push_back( source );
_sources_in_use.erase( it );
}
if ( sample->is_file() ) {
int freq, format;
size_t size;
- bool res;
-
- res = load(sample_name, &sample_data, &format, &size, &freq);
- if (res == false) return buffer;
+ try {
+ bool res = load(sample_name, &sample_data, &format, &size, &freq);
+ if (res == false) return NO_BUFFER;
+ } catch (sg_exception& e) {
+ SG_LOG(SG_GENERAL, SG_ALERT,
+ "failed to load sound buffer:" << e.getFormattedMessage());
+ return NO_BUFFER;
+ }
+
sample->set_frequency( freq );
sample->set_format( format );
sample->set_size( size );
- }
- else
+
+ } else {
sample_data = sample->get_data();
+ }
// create an OpenAL buffer handle
alGenBuffers(1, &buffer);
ALsizei freq = sample->get_frequency();
alBufferData( buffer, format, sample_data, size, freq );
- if ( sample->is_file() ) free(sample_data);
-
if ( !testForALError("buffer add data") ) {
sample->set_buffer(buffer);
_buffers[sample_name] = refUint(buffer);
}
}
+
+ if ( sample->is_file() ) free(sample_data);
}
else {
buffer = sample->get_buffer();
-}
+ }
return buffer;
}
void SGSoundMgr::release_buffer(SGSoundSample *sample)
{
- string sample_name = sample->get_sample_name();
- buffer_map_iterator buffer_it = _buffers.find( sample_name );
- if ( buffer_it == _buffers.end() ) {
- // buffer was not found
- return;
- }
+ if ( !sample->is_queue() )
+ {
+ string sample_name = sample->get_sample_name();
+ buffer_map_iterator buffer_it = _buffers.find( sample_name );
+ if ( buffer_it == _buffers.end() ) {
+ // buffer was not found
+ return;
+ }
- sample->no_valid_buffer();
- buffer_it->second.refctr--;
- if (buffer_it->second.refctr == 0) {
- ALuint buffer = buffer_it->second.id;
- alDeleteBuffers(1, &buffer);
- _buffers.erase( buffer_it );
- testForALError("release buffer");
+ sample->no_valid_buffer();
+ buffer_it->second.refctr--;
+ if (buffer_it->second.refctr == 0) {
+ ALuint buffer = buffer_it->second.id;
+ alDeleteBuffers(1, &buffer);
+ _buffers.erase( buffer_it );
+ testForALError("release buffer");
+ }
}
}
_at_up_vec[4] = sgv_up[1];
_at_up_vec[5] = sgv_up[2];
- // static const SGQuatd q(-0.5, -0.5, 0.5, 0.5);
- // SGQuatd hlOr = SGQuatd::fromLonLat(SGGeod::fromCart(_base_pos));
- // SGQuatd ec2body = hlOr*_orientation;
- _absolute_pos = _base_pos; // + ec2body.backTransform( _offset_pos );
+ _absolute_pos = _base_pos;
}
bool SGSoundMgr::load(string &samplepath, void **dbuf, int *fmt,
#if defined(ALUT_API_MAJOR_VERSION) && ALUT_API_MAJOR_VERSION >= 1
ALfloat freqf;
+ // ignore previous errors to prevent the system from halting on silly errors
+ alGetError();
+ alcGetError(_device);
data = alutLoadMemoryFromFile(samplepath.c_str(), &format, &size, &freqf );
freq = (ALsizei)freqf;
int error = alutGetError();