do not yet add the relative sound position to the absolute position, it's generating NaN's at the moment. Fix a bunch of other small bugs
This commit is contained in:
@@ -14,6 +14,10 @@ static unsigned int sleep(unsigned int secs) { return 0; }
|
||||
# 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>
|
||||
|
||||
@@ -111,7 +111,7 @@ void SGSampleGroup::update( double dt ) {
|
||||
|
||||
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();
|
||||
@@ -141,7 +141,7 @@ void SGSampleGroup::update( double dt ) {
|
||||
|
||||
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 {
|
||||
@@ -247,8 +247,7 @@ SGSampleGroup::suspend ()
|
||||
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");
|
||||
@@ -264,8 +263,7 @@ SGSampleGroup::resume ()
|
||||
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");
|
||||
|
||||
@@ -35,6 +35,8 @@
|
||||
|
||||
#if defined(__APPLE__)
|
||||
# include <OpenAL/al.h>
|
||||
#elif defined(OPENALSDK)
|
||||
# include <al.h>
|
||||
#else
|
||||
# include <AL/al.h>
|
||||
#endif
|
||||
|
||||
@@ -26,6 +26,8 @@
|
||||
# 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>
|
||||
@@ -48,7 +50,7 @@ SGSoundSample::SGSoundSample() :
|
||||
_orientation(SGQuatd::zeros()),
|
||||
_orivec(SGVec3f::zeros()),
|
||||
_base_pos(SGGeod()),
|
||||
_refname(""),
|
||||
_refname(random_string()),
|
||||
_data(NULL),
|
||||
_format(AL_FORMAT_MONO8),
|
||||
_size(0),
|
||||
@@ -122,6 +124,7 @@ SGSoundSample::SGSoundSample( unsigned char *data, int len, int freq, int format
|
||||
_orientation(SGQuatd::zeros()),
|
||||
_orivec(SGVec3f::zeros()),
|
||||
_base_pos(SGGeod()),
|
||||
_refname(random_string()),
|
||||
_data(data),
|
||||
_format(format),
|
||||
_size(len),
|
||||
@@ -144,7 +147,6 @@ SGSoundSample::SGSoundSample( unsigned char *data, int len, int freq, int format
|
||||
_static_changed(true),
|
||||
_is_file(false)
|
||||
{
|
||||
_refname = "unknown, data supplied by caller";
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, "In memory sounds sample" );
|
||||
}
|
||||
|
||||
@@ -186,8 +188,16 @@ void SGSoundSample::update_absolute_position() {
|
||||
_orivec = -toVec3f(orient.rotate(_direction));
|
||||
|
||||
orient = SGQuatd::fromRealImag(0, _relative_pos) * _orientation;
|
||||
_absolute_pos = -SGVec3d::fromGeod(_base_pos) -orient.rotate(SGVec3d::e1());
|
||||
|
||||
float vel = length(_velocity);
|
||||
_velocity = toVec3d(_orivec * vel);
|
||||
_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)] );
|
||||
}
|
||||
|
||||
return rstr;
|
||||
}
|
||||
|
||||
@@ -465,6 +465,7 @@ private:
|
||||
bool _is_file;
|
||||
|
||||
void update_absolute_position();
|
||||
string random_string();
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -120,7 +120,7 @@ void SGSoundMgr::init() {
|
||||
_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() );
|
||||
@@ -170,14 +170,14 @@ void SGSoundMgr::stop() {
|
||||
_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);
|
||||
@@ -435,7 +435,7 @@ unsigned int SGSoundMgr::request_buffer(SGSoundSample *sample)
|
||||
// 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);
|
||||
@@ -452,7 +452,6 @@ unsigned int SGSoundMgr::request_buffer(SGSoundSample *sample)
|
||||
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
|
||||
@@ -463,7 +462,7 @@ void SGSoundMgr::release_buffer(SGSoundSample *sample)
|
||||
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");
|
||||
}
|
||||
@@ -472,6 +471,8 @@ void SGSoundMgr::release_buffer(SGSoundSample *sample)
|
||||
bool SGSoundMgr::load(string &samplepath, void **dbuf, int *fmt,
|
||||
size_t *sz, int *frq )
|
||||
{
|
||||
if ( !_working ) return false;
|
||||
|
||||
ALenum format;
|
||||
ALsizei size;
|
||||
ALsizei freq;
|
||||
@@ -500,7 +501,7 @@ bool SGSoundMgr::load(string &samplepath, void **dbuf, int *fmt,
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -49,6 +49,10 @@
|
||||
# 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>
|
||||
|
||||
Reference in New Issue
Block a user