# include <OpenAL/al.h>
# include <OpenAL/alc.h>
# include <OpenAL/alut.h>
+#elif defined(OPENALSDK)
+# include <al.h>
+# include <alc.h>
+# include <AL/alut.h>
#else
# include <AL/al.h>
# include <AL/alc.h>
if ( !_active ) return;
- // testForALError("start of update!!\n");
+ testForALError("start of update!!\n");
sample_map_iterator sample_current = _samples.begin();
sample_map_iterator sample_end = _samples.end();
alSourcei( source, AL_SOURCE_RELATIVE, AL_FALSE );
alSourcei( source, AL_LOOPING, looping );
- alSourcef( source, AL_ROLLOFF_FACTOR, 1.2 );
+ alSourcef( source, AL_ROLLOFF_FACTOR, 1.0 );
alSourcePlay( source );
testForALError("sample play");
} else {
SGSoundSample *sample = sample_current->second;
if ( sample->is_valid_source() && sample->is_playing() ) {
- unsigned int source = sample->get_source();
- alSourcePause( source );
+ alSourcePause( sample->get_source() );
}
}
testForALError("suspend");
SGSoundSample *sample = sample_current->second;
if ( sample->is_valid_source() && sample->is_playing() ) {
- unsigned int source = sample->get_source();
- alSourcePlay( source );
+ alSourcePlay( sample->get_source() );
}
}
testForALError("resume");
#if defined(__APPLE__)
# include <OpenAL/al.h>
+#elif defined(OPENALSDK)
+# include <al.h>
#else
# include <AL/al.h>
#endif
# include <simgear_config.h>
#endif
+#include <stdlib.h> // rand()
+
#include <simgear/debug/logstream.hxx>
#include <simgear/structure/exception.hxx>
#include <simgear/misc/sg_path.hxx>
_orientation(SGQuatd::zeros()),
_orivec(SGVec3f::zeros()),
_base_pos(SGGeod()),
- _refname(""),
+ _refname(random_string()),
_data(NULL),
_format(AL_FORMAT_MONO8),
_size(0),
_orientation(SGQuatd::zeros()),
_orivec(SGVec3f::zeros()),
_base_pos(SGGeod()),
+ _refname(random_string()),
_data(data),
_format(format),
_size(len),
_static_changed(true),
_is_file(false)
{
- _refname = "unknown, data supplied by caller";
SG_LOG( SG_GENERAL, SG_DEBUG, "In memory sounds sample" );
}
_orivec = -toVec3f(orient.rotate(_direction));
orient = SGQuatd::fromRealImag(0, _relative_pos) * _orientation;
- _absolute_pos = -SGVec3d::fromGeod(_base_pos) -orient.rotate(SGVec3d::e1());
+ _absolute_pos = -SGVec3d::fromGeod(_base_pos); // -orient.rotate(SGVec3d::e1());
+}
+
+string SGSoundSample::random_string() {
+ static const char *r = "0123456789abcdefghijklmnopqrstuvwxyz"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ string rstr;
+ for (int i=0; i<10; i++) {
+ rstr.push_back( r[rand() % strlen(r)] );
+ }
- float vel = length(_velocity);
- _velocity = toVec3d(_orivec * vel);
+ return rstr;
}
bool _is_file;
void update_absolute_position();
+ string random_string();
};
_at_up_vec[0] = 0.0; _at_up_vec[1] = 0.0; _at_up_vec[2] = -1.0;
_at_up_vec[3] = 0.0; _at_up_vec[4] = 1.0; _at_up_vec[5] = 0.0;
- alListenerf( AL_GAIN, 0.2f );
+ alListenerf( AL_GAIN, 0.0f );
alListenerfv( AL_ORIENTATION, _at_up_vec );
alListenerfv( AL_POSITION, SGVec3f::zeros().data() );
alListenerfv( AL_VELOCITY, SGVec3f::zeros().data() );
_active = false;
// clear any OpenAL buffers before shutting down
- buffer_map_iterator buffers_current;
- while(_buffers.size()){
- buffers_current = _buffers.begin();
+ buffer_map_iterator buffers_current = _buffers.begin();
+ buffer_map_iterator buffers_end = _buffers.end();
+ for ( ; buffers_current != buffers_end; ++buffers_current ) {
refUint ref = buffers_current->second;
ALuint buffer = ref.id;
alDeleteBuffers(1, &buffer);
- _buffers.erase( buffers_current );
}
+ _buffers.clear();
_context = alcGetCurrentContext();
_device = alcGetContextsDevice(_context);
// If this sample was read from a file we have all the information
// needed to read it again. For data buffers provided by the
// program we don't; so don't delete it's data.
- if (sample->is_file()) sample->free_data();
+ if ( sample->is_file() ) sample->free_data();
if ( !testForALError("buffer add data") ) {
sample->set_buffer(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
buffer_it->second.refctr--;
if (buffer_it->second.refctr == 0) {
ALuint buffer = buffer_it->second.id;
- _buffers.erase( buffer_it );
+ _buffers.erase( sample_name );
alDeleteBuffers(1, &buffer);
testForALError("release buffer");
}
bool SGSoundMgr::load(string &samplepath, void **dbuf, int *fmt,
size_t *sz, int *frq )
{
+ if ( !_working ) return false;
+
ALenum format;
ALsizei size;
ALsizei freq;
ALenum error = alGetError();
if ( error != AL_NO_ERROR ) {
string msg = "Failed to load wav file: ";
- msg.append(alGetErrorString(error));
+ msg.append(alGetString(error));
throw sg_io_exception(msg.c_str(), sg_location(samplepath));
return false;
}
# include <OpenAL/al.h>
# include <OpenAL/alc.h>
# include <OpenAL/alut.h>
+#elif defined(OPENALSDK)
+# include <al.h>
+# include <alc.h>
+# include <AL/alut.h>
#else
# include <AL/al.h>
# include <AL/alc.h>