Finish AeonWave integration
This commit is contained in:
@@ -32,6 +32,9 @@ int main( int argc, char *argv[] )
|
|||||||
aax.set(AAX_INITIALIZED);
|
aax.set(AAX_INITIALIZED);
|
||||||
testForError(aax, "initialization");
|
testForError(aax, "initialization");
|
||||||
|
|
||||||
|
aax.set(AAX_PLAYING);
|
||||||
|
testForError(aax, "mixer palying");
|
||||||
|
|
||||||
aax::Emitter emitter(AAX_ABSOLUTE);
|
aax::Emitter emitter(AAX_ABSOLUTE);
|
||||||
aax.add(emitter);
|
aax.add(emitter);
|
||||||
testForError(aax, "emitter registering");
|
testForError(aax, "emitter registering");
|
||||||
@@ -63,5 +66,19 @@ int main( int argc, char *argv[] )
|
|||||||
std::cout << "Vendor: " << _vendor << std::endl;
|
std::cout << "Vendor: " << _vendor << std::endl;
|
||||||
std::cout << "Renderer: " << _renderer << std::endl;
|
std::cout << "Renderer: " << _renderer << std::endl;
|
||||||
|
|
||||||
|
aax::Matrix64 mtx64;
|
||||||
|
mtx64.translate(-5000.0, 12500.0, 1000.0);
|
||||||
|
|
||||||
|
aax::Matrix mtx = mtx64.toMatrix();
|
||||||
|
emitter.matrix(mtx);
|
||||||
|
|
||||||
|
mtx.translate(-5.0, 2.0, 1.0);
|
||||||
|
mtx.inverse();
|
||||||
|
aax.sensor_matrix(mtx);
|
||||||
|
|
||||||
|
aax.set(AAX_PLAYING);
|
||||||
|
emitter.set(AAX_PLAYING);
|
||||||
|
aax.set(AAX_UPDATE);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,7 +71,9 @@ class SGSoundMgr::SoundManagerPrivate
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SoundManagerPrivate() :
|
SoundManagerPrivate() :
|
||||||
|
_absolute_pos(SGVec3d::zeros()),
|
||||||
_base_pos(SGVec3d::zeros()),
|
_base_pos(SGVec3d::zeros()),
|
||||||
|
_orientation(SGQuatd::zeros()),
|
||||||
_buffer_id(0),
|
_buffer_id(0),
|
||||||
_source_id(0)
|
_source_id(0)
|
||||||
{
|
{
|
||||||
@@ -88,19 +90,24 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void init() {
|
void init() {
|
||||||
_mtx64 = aax::Matrix64();
|
_mtx = aax::Matrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
void update_pos_and_orientation()
|
void update_pos_and_orientation()
|
||||||
{
|
{
|
||||||
SGVec3d sgv_at = _orientation.backTransform(-SGVec3d::e3());
|
SGVec3d sgv_at = _orientation.backTransform(-SGVec3d::e3());
|
||||||
SGVec3d sgv_up = _orientation.backTransform(SGVec3d::e2());
|
SGVec3d sgv_up = _orientation.backTransform(SGVec3d::e2());
|
||||||
_mtx64.set(_base_pos.data(), sgv_at.data(), sgv_up.data());
|
SGVec3f pos = SGVec3f::zeros();
|
||||||
|
|
||||||
|
_mtx.set(pos.data(), toVec3f(sgv_at).data(), toVec3f(sgv_up).data());
|
||||||
|
|
||||||
|
_absolute_pos = _base_pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
aax::AeonWave _aax;
|
aax::AeonWave _aax;
|
||||||
aax::Matrix64 _mtx64;
|
aax::Matrix _mtx;
|
||||||
|
|
||||||
|
SGVec3d _absolute_pos;
|
||||||
SGVec3d _base_pos;
|
SGVec3d _base_pos;
|
||||||
SGQuatd _orientation;
|
SGQuatd _orientation;
|
||||||
|
|
||||||
@@ -140,7 +147,8 @@ SGSoundMgr::SGSoundMgr() :
|
|||||||
_vendor("unknown"),
|
_vendor("unknown"),
|
||||||
_active(false),
|
_active(false),
|
||||||
_changed(true),
|
_changed(true),
|
||||||
_volume(0.0)
|
_volume(0.0),
|
||||||
|
_velocity(SGVec3d::zeros())
|
||||||
{
|
{
|
||||||
d.reset(new SoundManagerPrivate);
|
d.reset(new SoundManagerPrivate);
|
||||||
d->_base_pos = SGVec3d::fromGeod(_geod_pos);
|
d->_base_pos = SGVec3d::fromGeod(_geod_pos);
|
||||||
@@ -328,19 +336,18 @@ void SGSoundMgr::update( double dt )
|
|||||||
TRY( dsp.set(AAX_SOUND_VELOCITY, 340.3f) );
|
TRY( dsp.set(AAX_SOUND_VELOCITY, 340.3f) );
|
||||||
TRY( d->_aax.set(dsp) );
|
TRY( d->_aax.set(dsp) );
|
||||||
#endif
|
#endif
|
||||||
|
aax::Matrix mtx = d->_mtx;
|
||||||
|
mtx.inverse();
|
||||||
|
TRY( d->_aax.sensor_matrix(mtx) );
|
||||||
|
|
||||||
SGQuatd hlOr = SGQuatd::fromLonLat( _geod_pos );
|
SGQuatd hlOr = SGQuatd::fromLonLat( _geod_pos );
|
||||||
SGVec3d velocity = SGVec3d::zeros();
|
SGVec3d velocity = SGVec3d::zeros();
|
||||||
if ( _velocity[0] || _velocity[1] || _velocity[2] ) {
|
if ( _velocity[0] || _velocity[1] || _velocity[2] ) {
|
||||||
velocity = SGVec3d( _velocity*SG_FEET_TO_METER );
|
velocity = hlOr.backTransform(_velocity*SG_FEET_TO_METER);
|
||||||
velocity = hlOr.backTransform(velocity);
|
|
||||||
}
|
}
|
||||||
aax::Vector vel(velocity.data());
|
aax::Vector vel( toVec3f(velocity).data() );
|
||||||
TRY( d->_aax.sensor_velocity(vel) );
|
TRY( d->_aax.sensor_velocity(vel) );
|
||||||
|
|
||||||
aax::Matrix mtx = d->_mtx64.toMatrix();
|
|
||||||
TRY( d->_aax.sensor_matrix(mtx) );
|
|
||||||
|
|
||||||
testForError("update");
|
testForError("update");
|
||||||
_changed = false;
|
_changed = false;
|
||||||
}
|
}
|
||||||
@@ -416,11 +423,7 @@ void SGSoundMgr::set_volume( float v )
|
|||||||
unsigned int SGSoundMgr::request_source()
|
unsigned int SGSoundMgr::request_source()
|
||||||
{
|
{
|
||||||
unsigned int id = d->_source_id++;
|
unsigned int id = d->_source_id++;
|
||||||
#if 0
|
|
||||||
d->_sources.insert( std::make_pair(id, aax::Emitter(AAX_ABSOLUTE)) );
|
d->_sources.insert( std::make_pair(id, aax::Emitter(AAX_ABSOLUTE)) );
|
||||||
#else
|
|
||||||
d->_sources[id] = aax::Emitter(AAX_ABSOLUTE);
|
|
||||||
#endif
|
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -431,7 +434,11 @@ void SGSoundMgr::release_source( unsigned int source )
|
|||||||
if ( source_it != d->_sources.end() )
|
if ( source_it != d->_sources.end() )
|
||||||
{
|
{
|
||||||
aax::Emitter& emitter = source_it->second;
|
aax::Emitter& emitter = source_it->second;
|
||||||
TRY( emitter.set(AAX_STOPPED) );
|
enum aaxState state = emitter.state();
|
||||||
|
if (state == AAX_PLAYING || state == AAX_SUSPENDED) {
|
||||||
|
TRY( emitter.set(AAX_STOPPED) );
|
||||||
|
TRY( d->_aax.remove(emitter) );
|
||||||
|
}
|
||||||
TRY( emitter.remove_buffer() );
|
TRY( emitter.remove_buffer() );
|
||||||
d->_sources.erase(source_it);
|
d->_sources.erase(source_it);
|
||||||
}
|
}
|
||||||
@@ -561,16 +568,31 @@ void SGSoundMgr::sample_play( SGSoundSample *sample )
|
|||||||
aax::Emitter& emitter = d->get_emitter(sample->get_source());
|
aax::Emitter& emitter = d->get_emitter(sample->get_source());
|
||||||
|
|
||||||
if ( !sample->is_queue() ) {
|
if ( !sample->is_queue() ) {
|
||||||
unsigned int buffer = request_buffer(sample);
|
unsigned int bufid = request_buffer(sample);
|
||||||
TRY( emitter.add(d->get_buffer(buffer)) );
|
if (bufid == SGSoundMgr::FAILED_BUFFER ||
|
||||||
|
bufid == SGSoundMgr::NO_BUFFER)
|
||||||
|
{
|
||||||
|
release_source(sample->get_source());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
aax::Buffer& buffer = d->get_buffer(bufid);
|
||||||
|
if (buffer) {
|
||||||
|
TRY( emitter.add(buffer) );
|
||||||
|
} else
|
||||||
|
SG_LOG( SG_SOUND, SG_ALERT, "No such buffer!");
|
||||||
}
|
}
|
||||||
|
|
||||||
aax::dsp dsp = emitter.get(AAX_DISTANCE_FILTER);
|
aax::dsp dsp = emitter.get(AAX_DISTANCE_FILTER);
|
||||||
TRY( dsp.set(AAX_ROLLOFF_FACTOR, 0.3f) );
|
TRY( dsp.set(AAX_ROLLOFF_FACTOR, 0.3f) );
|
||||||
|
TRY( dsp.set(AAX_AL_INVERSE_DISTANCE_CLAMPED) );
|
||||||
TRY( emitter.set(dsp) );
|
TRY( emitter.set(dsp) );
|
||||||
|
|
||||||
TRY( emitter.set(AAX_LOOPING, sample->is_looping()) );
|
TRY( emitter.set(AAX_LOOPING, sample->is_looping()) );
|
||||||
TRY( emitter.set(AAX_POSITION, AAX_ABSOLUTE) );
|
TRY( emitter.set(AAX_POSITION, AAX_ABSOLUTE) );
|
||||||
|
|
||||||
|
TRY( d->_aax.add(emitter) );
|
||||||
|
TRY( emitter.set(AAX_INITIALIZED) );
|
||||||
TRY( emitter.set(AAX_PLAYING) );
|
TRY( emitter.set(AAX_PLAYING) );
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -585,6 +607,7 @@ void SGSoundMgr::sample_stop( SGSoundSample *sample )
|
|||||||
#ifdef ENABLE_SOUND
|
#ifdef ENABLE_SOUND
|
||||||
aax::Emitter& emitter = d->get_emitter(source);
|
aax::Emitter& emitter = d->get_emitter(source);
|
||||||
TRY( emitter.set(AAX_STOPPED) );
|
TRY( emitter.set(AAX_STOPPED) );
|
||||||
|
TRY( d->_aax.remove(emitter) );
|
||||||
#endif
|
#endif
|
||||||
stopped = is_sample_stopped(sample);
|
stopped = is_sample_stopped(sample);
|
||||||
}
|
}
|
||||||
@@ -604,6 +627,7 @@ void SGSoundMgr::sample_destroy( SGSoundSample *sample )
|
|||||||
if ( sample->is_playing() ) {
|
if ( sample->is_playing() ) {
|
||||||
aax::Emitter& emitter = d->get_emitter(source);
|
aax::Emitter& emitter = d->get_emitter(source);
|
||||||
TRY( emitter.set(AAX_STOPPED) );
|
TRY( emitter.set(AAX_STOPPED) );
|
||||||
|
TRY( d->_aax.remove(emitter) );
|
||||||
}
|
}
|
||||||
release_source( source );
|
release_source( source );
|
||||||
#endif
|
#endif
|
||||||
@@ -633,11 +657,11 @@ void SGSoundMgr::update_sample_config( SGSoundSample *sample, SGVec3d& position,
|
|||||||
aax::Emitter& emitter = d->get_emitter(sample->get_source());
|
aax::Emitter& emitter = d->get_emitter(sample->get_source());
|
||||||
aax::dsp dsp;
|
aax::dsp dsp;
|
||||||
|
|
||||||
aax::Vector64 pos = position.data();
|
aax::Vector pos = toVec3f(position).data();
|
||||||
aax::Vector64 ori = orientation.data();
|
aax::Vector ori = orientation.data();
|
||||||
aax::Vector vel = velocity.data();
|
aax::Vector vel = velocity.data();
|
||||||
d->_mtx64.set(pos, ori);
|
|
||||||
aax::Matrix mtx = d->_mtx64;
|
aax::Matrix mtx(pos, ori);
|
||||||
TRY( emitter.matrix(mtx) );
|
TRY( emitter.matrix(mtx) );
|
||||||
TRY( emitter.velocity(vel) );
|
TRY( emitter.velocity(vel) );
|
||||||
|
|
||||||
@@ -727,7 +751,7 @@ void SGSoundMgr::set_orientation( const SGQuatd& ori )
|
|||||||
|
|
||||||
const SGVec3d& SGSoundMgr::get_position() const
|
const SGVec3d& SGSoundMgr::get_position() const
|
||||||
{
|
{
|
||||||
return d->_base_pos;
|
return d->_absolute_pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SGSoundMgr::set_position( const SGVec3d& pos, const SGGeod& pos_geod )
|
void SGSoundMgr::set_position( const SGVec3d& pos, const SGGeod& pos_geod )
|
||||||
@@ -738,6 +762,6 @@ void SGSoundMgr::set_position( const SGVec3d& pos, const SGGeod& pos_geod )
|
|||||||
SGVec3f SGSoundMgr::get_direction() const
|
SGVec3f SGSoundMgr::get_direction() const
|
||||||
{
|
{
|
||||||
aaxVec3f pos, at, up;
|
aaxVec3f pos, at, up;
|
||||||
d->_mtx64.get(pos, at, up);
|
d->_mtx.get(pos, at, up);
|
||||||
return SGVec3f( at );
|
return SGVec3f( at );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -126,10 +126,6 @@ public:
|
|||||||
*/
|
*/
|
||||||
void set_position( const SGVec3d& pos, const SGGeod& pos_geod );
|
void set_position( const SGVec3d& pos, const SGGeod& pos_geod );
|
||||||
|
|
||||||
void set_position_offset( const SGVec3d& pos ) {
|
|
||||||
_offset_pos = pos.data(); _changed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the position of the sound manager.
|
* Get the position of the sound manager.
|
||||||
* This is in the same coordinate system as OpenGL; y=up, z=back, x=right
|
* This is in the same coordinate system as OpenGL; y=up, z=back, x=right
|
||||||
@@ -145,7 +141,7 @@ public:
|
|||||||
* @param vel Velocity vector
|
* @param vel Velocity vector
|
||||||
*/
|
*/
|
||||||
void set_velocity( const SGVec3d& vel ) {
|
void set_velocity( const SGVec3d& vel ) {
|
||||||
_velocity = vel.data(); _changed = true;
|
_velocity = vel; _changed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -154,7 +150,7 @@ public:
|
|||||||
*
|
*
|
||||||
* @return Velocity vector of the OpenAL listener
|
* @return Velocity vector of the OpenAL listener
|
||||||
*/
|
*/
|
||||||
inline SGVec3f get_velocity() { SGVec3d f(_velocity); return toVec3f(f); }
|
inline SGVec3f get_velocity() { return toVec3f(_velocity); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the orientation of the sound manager
|
* Set the orientation of the sound manager
|
||||||
@@ -329,11 +325,10 @@ private:
|
|||||||
float _volume;
|
float _volume;
|
||||||
|
|
||||||
// Position of the listener.
|
// Position of the listener.
|
||||||
aax::Vector64 _offset_pos;
|
|
||||||
SGGeod _geod_pos;
|
SGGeod _geod_pos;
|
||||||
|
|
||||||
// Velocity of the listener.
|
// Velocity of the listener.
|
||||||
aax::Vector64 _velocity;
|
SGVec3d _velocity;
|
||||||
|
|
||||||
bool testForError(void *p, std::string s);
|
bool testForError(void *p, std::string s);
|
||||||
|
|
||||||
|
|||||||
@@ -123,10 +123,6 @@ public:
|
|||||||
*/
|
*/
|
||||||
void set_position( const SGVec3d& pos, const SGGeod& pos_geod );
|
void set_position( const SGVec3d& pos, const SGGeod& pos_geod );
|
||||||
|
|
||||||
void set_position_offset( const SGVec3d& pos ) {
|
|
||||||
_offset_pos = pos; _changed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the position of the sound manager.
|
* Get the position of the sound manager.
|
||||||
* This is in the same coordinate system as OpenGL; y=up, z=back, x=right
|
* This is in the same coordinate system as OpenGL; y=up, z=back, x=right
|
||||||
@@ -340,7 +336,6 @@ private:
|
|||||||
float _volume;
|
float _volume;
|
||||||
|
|
||||||
// Position of the listener.
|
// Position of the listener.
|
||||||
SGVec3d _offset_pos;
|
|
||||||
SGGeod _geod_pos;
|
SGGeod _geod_pos;
|
||||||
|
|
||||||
// Velocity of the listener.
|
// Velocity of the listener.
|
||||||
|
|||||||
Reference in New Issue
Block a user