X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fsound%2Fsample_openal.cxx;h=3c9cb864ad81403fc1d06794c3722046bde1d35f;hb=6250f675db9fdd6f2aef7be43207cd0ac0b6baeb;hp=939e5619bde62102a21353742dcc7fce8bb7c2b7;hpb=fdfdfedf01776fafa4d769b93e95585e018a00d4;p=simgear.git diff --git a/simgear/sound/sample_openal.cxx b/simgear/sound/sample_openal.cxx index 939e5619..3c9cb864 100644 --- a/simgear/sound/sample_openal.cxx +++ b/simgear/sound/sample_openal.cxx @@ -1,8 +1,10 @@ -// sample.cxx -- Sound sample encapsulation class +// sample_openal.cxx -- Audio sample encapsulation class // // Written by Curtis Olson, started April 2004. +// Modified to match the new SoundSystem by Erik Hofman, October 2009 // // Copyright (C) 2004 Curtis L. Olson - http://www.flightgear.org/~curt +// Copyright (C) 2009 Erik Hofman // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as @@ -24,10 +26,14 @@ # include #endif +#include // rand() +#include + #include #include #include -#include +#include +#include #include "soundmgr_openal.hxx" #include "sample_openal.hxx" @@ -40,12 +46,14 @@ // empty constructor SGSoundSample::SGSoundSample() : _absolute_pos(SGVec3d::zeros()), - _relative_pos(SGVec3f::zeros()), + _relative_pos(SGVec3d::zeros()), _direction(SGVec3d::zeros()), - _velocity(SGVec3d::zeros()), - _base_pos(SGGeod()), + _velocity(SGVec3f::zeros()), _orientation(SGQuatd::zeros()), - _sample_name(""), + _orivec(SGVec3f::zeros()), + _base_pos(SGVec3d::zeros()), + _rotation(SGQuatd::zeros()), + _refname(random_string()), _data(NULL), _format(AL_FORMAT_MONO8), _size(0), @@ -66,19 +74,22 @@ SGSoundSample::SGSoundSample() : _playing(false), _changed(true), _static_changed(true), - _is_file(false), - _orivec(SGVec3f::zeros()) + _is_file(false) { } // constructor -SGSoundSample::SGSoundSample( const char *path, const char *file ) : +SGSoundSample::SGSoundSample(const char *file, const SGPath& currentDir) : _absolute_pos(SGVec3d::zeros()), - _relative_pos(SGVec3f::zeros()), + _relative_pos(SGVec3d::zeros()), _direction(SGVec3d::zeros()), - _velocity(SGVec3d::zeros()), - _base_pos(SGGeod()), + _velocity(SGVec3f::zeros()), _orientation(SGQuatd::zeros()), + _orivec(SGVec3f::zeros()), + _base_pos(SGVec3d::zeros()), + _rotation(SGQuatd::zeros()), + _refname(file), + _data(NULL), _format(AL_FORMAT_MONO8), _size(0), _freq(0), @@ -98,28 +109,60 @@ SGSoundSample::SGSoundSample( const char *path, const char *file ) : _playing(false), _changed(true), _static_changed(true), - _is_file(true), - _orivec(SGVec3f::zeros()) + _is_file(true) { - SGPath samplepath( path ); - if ( strlen(file) ) { - samplepath.append( file ); - } - _sample_name = samplepath.str(); + SGPath p = simgear::ResourceManager::instance()->findPath(file, currentDir); + _refname = p.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(SGVec3d::zeros()), + _rotation(SGQuatd::zeros()), + _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(SGVec3f::zeros()), + _relative_pos(SGVec3d::zeros()), _direction(SGVec3d::zeros()), - _velocity(SGVec3d::zeros()), - _base_pos(SGGeod()), + _velocity(SGVec3f::zeros()), _orientation(SGQuatd::zeros()), - _data(data), + _orivec(SGVec3f::zeros()), + _base_pos(SGVec3d::zeros()), + _rotation(SGQuatd::zeros()), + _refname(random_string()), _format(format), _size(len), _freq(freq), @@ -139,46 +182,49 @@ SGSoundSample::SGSoundSample( unsigned char *data, int len, int freq, int format _playing(false), _changed(true), _static_changed(true), - _is_file(false), - _orivec(SGVec3f::zeros()) + _is_file(false) { - _sample_name = "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 ) free(_data); } -void SGSoundSample::set_orientation( SGQuatd ori ) { - _orientation = ori; - update_absolute_position(); - _changed = true; -} +void SGSoundSample::update_pos_and_orientation() { + + _absolute_pos = _base_pos; + if (_relative_pos[0] || _relative_pos[1] || _relative_pos[2] ) { + _absolute_pos += _rotation.rotate( _relative_pos ); + } -void SGSoundSample::set_direction( SGVec3d dir ) { - _direction = dir; - update_absolute_position(); - _changed = true; + _orivec = SGVec3f::zeros(); + if ( _direction[0] || _direction[1] || _direction[2] ) { + _orivec = toVec3f( _rotation.rotate( _direction ) ); + } } -void SGSoundSample::set_relative_position( SGVec3f pos ) { - _relative_pos = pos; - update_absolute_position(); - _changed = true; +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)] ); + } + + return rstr; } -void SGSoundSample::set_position( SGGeod pos ) { - _base_pos = pos; - update_absolute_position(); - _changed = true; +SGPath SGSoundSample::file_path() const +{ + if (!_is_file) { + return SGPath(); + } + + return SGPath(_refname); } -void SGSoundSample::update_absolute_position() { - SGQuatd orient = SGQuatd::fromLonLat(_base_pos) * _orientation; - _orivec = -toVec3f(orient.rotate(_direction)); - _absolute_pos = -SGVec3d::fromGeod(_base_pos); - // TODO: add relative position -}