X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fsound%2Fsample_openal.cxx;h=4be9d8113f02c9c068afd605e3c7926d58bded95;hb=6ccad915373fe367f8d63eb69282146054d0a401;hp=5fc257cc7ca83982ed518f98a66a9369b4f19dfb;hpb=0d5634475c189169a12a89b64e565120cd89d4b8;p=simgear.git diff --git a/simgear/sound/sample_openal.cxx b/simgear/sound/sample_openal.cxx index 5fc257cc..4be9d811 100644 --- a/simgear/sound/sample_openal.cxx +++ b/simgear/sound/sample_openal.cxx @@ -26,6 +26,8 @@ # include #endif +#include // rand() + #include #include #include @@ -44,11 +46,11 @@ SGSoundSample::SGSoundSample() : _absolute_pos(SGVec3d::zeros()), _relative_pos(SGVec3d::zeros()), _direction(SGVec3d::zeros()), - _velocity(SGVec3d::zeros()), + _velocity(SGVec3f::zeros()), _orientation(SGQuatd::zeros()), _orivec(SGVec3f::zeros()), - _base_pos(SGGeod()), - _refname(""), + _base_pos(SGGeod::fromDeg(0,0)), + _refname(random_string()), _data(NULL), _format(AL_FORMAT_MONO8), _size(0), @@ -78,10 +80,12 @@ SGSoundSample::SGSoundSample( const char *path, const char *file ) : _absolute_pos(SGVec3d::zeros()), _relative_pos(SGVec3d::zeros()), _direction(SGVec3d::zeros()), - _velocity(SGVec3d::zeros()), + _velocity(SGVec3f::zeros()), _orientation(SGQuatd::zeros()), _orivec(SGVec3f::zeros()), - _base_pos(SGGeod()), + _base_pos(SGGeod::fromDeg(0,0)), + _refname(file), + _data(NULL), _format(AL_FORMAT_MONO8), _size(0), _freq(0), @@ -108,21 +112,54 @@ SGSoundSample::SGSoundSample( const char *path, const char *file ) : samplepath.append( file ); } _refname = samplepath.str(); +} - SG_LOG( SG_GENERAL, SG_DEBUG, "From file sounds sample = " - << samplepath.str() ); +// constructor +SGSoundSample::SGSoundSample( const unsigned char** data, + int len, int freq, int format ) : + _absolute_pos(SGVec3d::zeros()), + _relative_pos(SGVec3d::zeros()), + _direction(SGVec3d::zeros()), + _velocity(SGVec3f::zeros()), + _orientation(SGQuatd::zeros()), + _orivec(SGVec3f::zeros()), + _base_pos(SGGeod::fromDeg(0,0)), + _refname(random_string()), + _format(format), + _size(len), + _freq(freq), + _valid_buffer(false), + _buffer(SGSoundMgr::NO_BUFFER), + _valid_source(false), + _source(SGSoundMgr::NO_SOURCE), + _inner_angle(360.0), + _outer_angle(360.0), + _outer_gain(0.0), + _pitch(1.0), + _volume(1.0), + _master_volume(1.0), + _reference_dist(500.0), + _max_dist(3000.0), + _loop(AL_FALSE), + _playing(false), + _changed(true), + _static_changed(true), + _is_file(false) +{ + SG_LOG( SG_GENERAL, SG_DEBUG, "In memory sounds sample" ); + _data = (unsigned char*)*data; *data = NULL; } // constructor -SGSoundSample::SGSoundSample( unsigned char *data, int len, int freq, int format ) : +SGSoundSample::SGSoundSample( void** data, int len, int freq, int format ) : _absolute_pos(SGVec3d::zeros()), _relative_pos(SGVec3d::zeros()), _direction(SGVec3d::zeros()), - _velocity(SGVec3d::zeros()), + _velocity(SGVec3f::zeros()), _orientation(SGQuatd::zeros()), _orivec(SGVec3f::zeros()), - _base_pos(SGGeod()), - _data(data), + _base_pos(SGGeod::fromDeg(0,0)), + _refname(random_string()), _format(format), _size(len), _freq(freq), @@ -144,50 +181,51 @@ 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" ); + _data = (unsigned char*)*data; *data = NULL; } // destructor SGSoundSample::~SGSoundSample() { - if (_data != NULL) { - delete _data; - _data = NULL; - } + if (_data) free(_data); } -void SGSoundSample::set_orientation( const SGQuatd& ori ) { - _orientation = ori; - update_absolute_position(); - _changed = true; -} +void SGSoundSample::update_pos_and_orientation() { + // The rotation rotating from the earth centerd frame to + // the horizontal local frame + SGQuatd hlOr = SGQuatd::fromLonLat(_base_pos); -void SGSoundSample::set_direction( const SGVec3d& dir ) { - _direction = dir; - update_absolute_position(); - _changed = true; -} + // Compute the sounds orientation and position + // wrt the earth centered frame - that is global coorinates + SGQuatd sc2body = hlOr*_orientation; -void SGSoundSample::set_relative_position( const SGVec3f& pos ) { - _relative_pos = toVec3d(pos); - update_absolute_position(); - _changed = true; -} + // This is rotates the x-forward, y-right, z-down coordinate system where + // simulation runs into the OpenGL camera system with x-right, y-up, z-back. + SGQuatd q(-0.5, -0.5, 0.5, 0.5); -void SGSoundSample::set_position( const SGGeod& pos ) { - _base_pos = pos; - update_absolute_position(); - _changed = true; -} + // The cartesian position of the sounds base location + SGVec3d position = SGVec3d::fromGeod(_base_pos); -void SGSoundSample::update_absolute_position() { - SGQuatd orient = SGQuatd::fromLonLat(_base_pos) * _orientation; - _orivec = -toVec3f(orient.rotate(_direction)); + _absolute_pos = position; +#if 0 + if ( _relative_pos[0] || _relative_pos[1] || _relative_pos[2] ) { + _absolute_pos += (sc2body*q).backTransform(_relative_pos); + } +#endif + if ( _direction[0] || _direction[1] || _direction[2] ) { + _orivec = toVec3f( (sc2body*q).backTransform(_direction) ); + } +} - orient = SGQuatd::fromRealImag(0, _relative_pos) * _orientation; - _absolute_pos = -SGVec3d::fromGeod(_base_pos) -orient.rotate(SGVec3d::e1()); +string SGSoundSample::random_string() { + static const char *r = "0123456789abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + string rstr = "System generated name: "; + for (int i=0; i<10; i++) { + rstr.push_back( r[rand() % strlen(r)] ); + } - float vel = length(_velocity); - _velocity = toVec3d(_orivec * vel); + return rstr; } +