X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fsound%2Fsample_openal.cxx;h=95a6077559822deda6ff7e0f99a67cfc02eba758;hb=a62f11c5509f8d7b2a4c3b587c0e7af8d4f5a39b;hp=91b08527b712554d44d50b8b11f2247fb3daf15e;hpb=5f9befebaed1c185a196acd709b2677247461a0f;p=simgear.git diff --git a/simgear/sound/sample_openal.cxx b/simgear/sound/sample_openal.cxx index 91b08527..95a60775 100644 --- a/simgear/sound/sample_openal.cxx +++ b/simgear/sound/sample_openal.cxx @@ -26,16 +26,22 @@ # include #endif -#include // rand() +#include // rand(), free() +#include +#include #include #include #include -#include +#include #include "soundmgr_openal.hxx" #include "sample_openal.hxx" +#include "soundmgr_openal_private.hxx" +#define AL_FALSE 0 + +using std::string; // // SGSoundSample @@ -43,22 +49,24 @@ // empty constructor SGSoundSample::SGSoundSample() : + _format(AL_FORMAT_MONO8), + _size(0), + _freq(0), + _changed(true), + _valid_source(false), + _source(SGSoundMgr::NO_SOURCE), _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(SGVec3d::zeros()), + _rotation(SGQuatd::zeros()), _refname(random_string()), _data(NULL), - _format(AL_FORMAT_MONO8), - _size(0), - _freq(0), _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), @@ -69,28 +77,36 @@ SGSoundSample::SGSoundSample() : _max_dist(3000.0), _loop(AL_FALSE), _playing(false), - _changed(true), _static_changed(true), - _is_file(false) + _out_of_range(false), + _is_file(false), + _use_pos_props(false) { + _pos_prop[0] = 0; + _pos_prop[1] = 0; + _pos_prop[2] = 0; } // constructor -SGSoundSample::SGSoundSample( const char *path, const char *file ) : +SGSoundSample::SGSoundSample(const char *file, const SGPath& currentDir) : + _format(AL_FORMAT_MONO8), + _size(0), + _freq(0), + _changed(true), + _valid_source(false), + _source(SGSoundMgr::NO_SOURCE), _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()), - _format(AL_FORMAT_MONO8), - _size(0), - _freq(0), + _base_pos(SGVec3d::zeros()), + _rotation(SGQuatd::zeros()), + _refname(file), + _data(NULL), _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), @@ -101,39 +117,79 @@ SGSoundSample::SGSoundSample( const char *path, const char *file ) : _max_dist(3000.0), _loop(AL_FALSE), _playing(false), - _changed(true), _static_changed(true), - _is_file(true) + _out_of_range(false), + _is_file(true), + _use_pos_props(false) { - SGPath samplepath( path ); - if ( strlen(file) ) { - samplepath.append( file ); - } - _refname = samplepath.str(); - - SG_LOG( SG_GENERAL, SG_DEBUG, "From file sounds sample = " - << samplepath.str() ); + SGPath p = simgear::ResourceManager::instance()->findPath(file, currentDir); + _refname = p.str(); + _pos_prop[0] = 0; + _pos_prop[1] = 0; + _pos_prop[2] = 0; } // constructor -SGSoundSample::SGSoundSample( std::auto_ptr& data, +SGSoundSample::SGSoundSample( const unsigned char** data, int len, int freq, int format ) : + _format(format), + _size(len), + _freq(freq), + _changed(true), + _valid_source(false), + _source(SGSoundMgr::NO_SOURCE), _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(SGVec3d::zeros()), + _rotation(SGQuatd::zeros()), _refname(random_string()), - _data(data.release()), + _valid_buffer(false), + _buffer(SGSoundMgr::NO_BUFFER), + _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), + _static_changed(true), + _out_of_range(false), + _is_file(false), + _use_pos_props(false) +{ + SG_LOG( SG_SOUND, SG_DEBUG, "In memory sounds sample" ); + _data = (unsigned char*)*data; *data = NULL; + _pos_prop[0] = 0; + _pos_prop[1] = 0; + _pos_prop[2] = 0; +} + +// constructor +SGSoundSample::SGSoundSample( void** data, int len, int freq, int format ) : _format(format), _size(len), _freq(freq), - _valid_buffer(false), - _buffer(SGSoundMgr::NO_BUFFER), + _changed(true), _valid_source(false), _source(SGSoundMgr::NO_SOURCE), + _absolute_pos(SGVec3d::zeros()), + _relative_pos(SGVec3d::zeros()), + _direction(SGVec3d::zeros()), + _velocity(SGVec3f::zeros()), + _orientation(SGQuatd::zeros()), + _orivec(SGVec3f::zeros()), + _base_pos(SGVec3d::zeros()), + _rotation(SGQuatd::zeros()), + _refname(random_string()), + _valid_buffer(false), + _buffer(SGSoundMgr::NO_BUFFER), _inner_angle(360.0), _outer_angle(360.0), _outer_gain(0.0), @@ -144,57 +200,65 @@ SGSoundSample::SGSoundSample( std::auto_ptr& data, _max_dist(3000.0), _loop(AL_FALSE), _playing(false), - _changed(true), _static_changed(true), - _is_file(false) + _out_of_range(false), + _is_file(false), + _use_pos_props(false) { - SG_LOG( SG_GENERAL, SG_DEBUG, "In memory sounds sample" ); + SG_LOG( SG_SOUND, SG_DEBUG, "In memory sounds sample" ); + _data = (unsigned char*)*data; *data = NULL; + _pos_prop[0] = 0; + _pos_prop[1] = 0; + _pos_prop[2] = 0; } // destructor SGSoundSample::~SGSoundSample() { + if ( _data != NULL ) free(_data); } -void SGSoundSample::set_orientation( const SGQuatd& ori ) { - _orientation = ori; - update_absolute_position(); - _changed = true; -} - -void SGSoundSample::set_direction( const SGVec3d& dir ) { - _direction = dir; - update_absolute_position(); - _changed = true; -} - -void SGSoundSample::set_relative_position( const SGVec3f& pos ) { - _relative_pos = toVec3d(pos); - update_absolute_position(); - _changed = true; -} - -void SGSoundSample::set_position( const SGGeod& pos ) { - _base_pos = pos; - update_absolute_position(); - _changed = true; -} +void SGSoundSample::update_pos_and_orientation() { -void SGSoundSample::update_absolute_position() { - SGQuatd orient = SGQuatd::fromLonLat(_base_pos) * _orientation; - _orivec = -toVec3f(orient.rotate(-SGVec3d::e1())); + if (_use_pos_props) { + if (_pos_prop[0]) _absolute_pos[0] = _pos_prop[0]->getDoubleValue(); + if (_pos_prop[1]) _absolute_pos[1] = _pos_prop[1]->getDoubleValue(); + if (_pos_prop[2]) _absolute_pos[2] = _pos_prop[2]->getDoubleValue(); + } + else { + _absolute_pos = _base_pos; + if (_relative_pos[0] || _relative_pos[1] || _relative_pos[2] ) { + _absolute_pos += _rotation.rotate( _relative_pos ); + } + } - orient = SGQuatd::fromRealImag(0, _relative_pos) * _orientation; - _absolute_pos = -SGVec3d::fromGeod(_base_pos); // -orient.rotate(SGVec3d::e1()); + _orivec = SGVec3f::zeros(); + if ( _direction[0] || _direction[1] || _direction[2] ) { + _orivec = toVec3f( _rotation.rotate( _direction ) ); + } } string SGSoundSample::random_string() { static const char *r = "0123456789abcdefghijklmnopqrstuvwxyz" "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - string rstr; + string rstr = "System generated name: "; for (int i=0; i<10; i++) { rstr.push_back( r[rand() % strlen(r)] ); } return rstr; } + +SGPath SGSoundSample::file_path() const +{ + if (!_is_file) { + return SGPath(); + } + + return SGPath(_refname); +} + +void SGSoundSample::free_data() +{ + if ( _data != NULL ) free( _data ); _data = NULL; +}