const char *name;
double (*fn)(double);
} __sound_fn[] = {
-// {"lin", _snd_lin},
{"inv", _snd_inv},
{"abs", _snd_abs},
{"sqrt", _snd_sqrt},
{"log", _snd_log10},
{"ln", _snd_log},
-// {"sqr", _snd_sqr},
-// {"pow3", _snd_pow3},
{"", NULL}
};
}
void
-SGXmlSound::init(SGPropertyNode *root, SGPropertyNode *node, SGSoundMgr *sndmgr,
- const string &path)
+SGXmlSound::init(SGPropertyNode *root, SGPropertyNode *node,
+ SGSampleGroup *sgrp, const string &path)
{
//
// set global sound properties
//
- if (sndmgr->is_working() == false) {
- return;
- }
-
_name = node->getStringValue("name", "");
SG_LOG(SG_GENERAL, SG_DEBUG, "Loading sound information for: " << _name );
}
- float reference_dist = node->getDoubleValue("reference-dist", 500.0);
+ float reference_dist = node->getDoubleValue("reference-dist", 50.0);
float max_dist = node->getDoubleValue("max-dist", 3000.0);
//
//
// Relative position
//
- sgVec3 offset_pos;
- sgSetVec3( offset_pos, 0.0, 0.0, 0.0 );
- SGPropertyNode_ptr pos = node->getChild("position");
- if ( pos != NULL ) {
- offset_pos[0] = pos->getDoubleValue("x", 0.0);
- offset_pos[1] = -pos->getDoubleValue("y", 0.0);
- offset_pos[2] = pos->getDoubleValue("z", 0.0);
+ SGVec3f offset_pos = SGVec3f::zeros();
+ SGPropertyNode_ptr prop = node->getChild("position");
+ if ( prop != NULL ) {
+ offset_pos[0] = prop->getDoubleValue("x", 0.0);
+ offset_pos[1] = -prop->getDoubleValue("y", 0.0);
+ offset_pos[2] = prop->getDoubleValue("z", 0.0);
}
//
// Orientation
//
- sgVec3 dir;
- float inner, outer, outer_gain;
- sgSetVec3( dir, 0.0, 0.0, 0.0 );
- inner = outer = 360.0;
- outer_gain = 0.0;
- pos = node->getChild("orientation");
- if ( pos != NULL ) {
- dir[0] = pos->getDoubleValue("x", 0.0);
- dir[1] = -pos->getDoubleValue("y", 0.0);
- dir[2] = pos->getDoubleValue("z", 0.0);
- inner = pos->getDoubleValue("inner-angle", 360.0);
- outer = pos->getDoubleValue("outer-angle", 360.0);
- outer_gain = pos->getDoubleValue("outer-gain", 0.0);
+ SGVec3d dir = SGVec3d::zeros();
+ float inner = 360.0;
+ float outer = 360.0;
+ float outer_gain = 0.0;;
+ prop = node->getChild("orientation");
+ if ( prop != NULL ) {
+ dir = SGVec3d(-prop->getDoubleValue("x", 0.0),
+ -prop->getDoubleValue("y", 0.0),
+ -prop->getDoubleValue("z", 0.0));
+ inner = prop->getDoubleValue("inner-angle", 360.0);
+ outer = prop->getDoubleValue("outer-angle", 360.0);
+ outer_gain = prop->getDoubleValue("outer-gain", 0.0);
}
-
+
//
// Initialize the sample
//
- _mgr = sndmgr;
- if ( (_sample = _mgr->find(_name)) == NULL ) {
- // FIXME: Does it make sense to overwrite a previous entry's
- // configuration just because a new entry has the same name?
- // Note that we can't match on identical "path" because we the
- // new entry could be at a different location with different
- // configuration so we need a new sample which creates a new
- // "alSource". The semantics of what is going on here seems
- // confused and needs to be thought through more carefully.
- _sample = new SGSoundSample( path.c_str(),
- node->getStringValue("path", ""),
- false );
-
- _mgr->add( _sample, _name );
- }
-
- _sample->set_offset_pos( offset_pos );
- _sample->set_orientation(dir, inner, outer, outer_gain);
- _sample->set_volume(v);
+ _sgrp = sgrp;
+ _sample = new SGSoundSample( path.c_str(), node->getStringValue("path", ""));
+ _sample->set_relative_position( offset_pos );
+ _sample->set_direction( dir );
+ _sample->set_audio_cone( inner, outer, outer_gain );
_sample->set_reference_dist( reference_dist );
_sample->set_max_dist( max_dist );
- _sample->set_pitch(p);
+ _sample->set_volume( v );
+ _sample->set_pitch( p );
+ _sgrp->add( _sample, _name );
}
void
)
)
{
- if ((_mode != SGXmlSound::IN_TRANSIT) || (_stopping > MAX_TRANSIT_TIME)) {
+ if ((_mode != SGXmlSound::IN_TRANSIT) || (_stopping > MAX_TRANSIT_TIME))
+ {
if (_sample->is_playing()) {
SG_LOG(SG_GENERAL, SG_DEBUG, "Stopping audio after " << _dt_play
<< " sec: " << _name );