X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fsound%2Fxmlsound.cxx;h=479e312361d34c7bd631e1266a7034f6f2cf4a0a;hb=6cd8db7b28b675f75ab22c2073832980d9f8d6a4;hp=9fe4fdb1e92b407a169ed165e3c1165c23a2a02a;hpb=babf58f8d2700b3ba84089e7b59f8838c685d6ca;p=simgear.git diff --git a/simgear/sound/xmlsound.cxx b/simgear/sound/xmlsound.cxx index 9fe4fdb1..479e3123 100644 --- a/simgear/sound/xmlsound.cxx +++ b/simgear/sound/xmlsound.cxx @@ -41,8 +41,8 @@ static double _snd_inv(double v) { return (v == 0) ? 1e99 : 1/v; } static double _snd_abs(double v) { return (v >= 0) ? v : -v; } static double _snd_sqrt(double v) { return sqrt(fabs(v)); } -static double _snd_log10(double v) { return log10(fabs(v)); } -static double _snd_log(double v) { return log(fabs(v)); } +static double _snd_log10(double v) { return log10(fabs(v)+1e-9); } +static double _snd_log(double v) { return log(fabs(v)+1e-9); } // static double _snd_sqr(double v) { return v*v; } // static double _snd_pow3(double v) { return v*v*v; } @@ -82,7 +82,8 @@ SGXmlSound::~SGXmlSound() void SGXmlSound::init(SGPropertyNode *root, SGPropertyNode *node, - SGSampleGroup *sgrp, const string &path) + SGSampleGroup *sgrp, SGSampleGroup *avionics, + const string &path) { // @@ -101,11 +102,13 @@ SGXmlSound::init(SGPropertyNode *root, SGPropertyNode *node, } else { _mode = SGXmlSound::ONCE; - - if ( strcmp(mode_str, "") ) - SG_LOG(SG_GENERAL,SG_INFO, "Unknown sound mode for '" << _name << "', default to 'once'"); } + bool is_avionics = false; + const char *type_str = node->getStringValue("type", "fx"); + if ( !strcmp(type_str, "avionics") ) + is_avionics = true; + _property = root->getNode(node->getStringValue("property", ""), true); SGPropertyNode *condition = node->getChild("condition"); if (condition != NULL) @@ -171,9 +174,10 @@ SGXmlSound::init(SGPropertyNode *root, SGPropertyNode *node, } - float reference_dist = node->getDoubleValue("reference-dist", 500.0); - float max_dist = node->getDoubleValue("max-dist", 3000.0); - + // rule of thumb: make reference distance a 100th of the maximum distance. + float reference_dist = node->getDoubleValue("reference-dist", 60.0); + float max_dist = node->getDoubleValue("max-dist", 6000.0); + // // set pitch properties // @@ -232,40 +236,44 @@ SGXmlSound::init(SGPropertyNode *root, SGPropertyNode *node, SGVec3f offset_pos = SGVec3f::zeros(); SGPropertyNode_ptr prop = node->getChild("position"); if ( prop != NULL ) { - offset_pos[0] = prop->getDoubleValue("x", 0.0); + offset_pos[0] = -prop->getDoubleValue("x", 0.0); offset_pos[1] = -prop->getDoubleValue("y", 0.0); - offset_pos[2] = prop->getDoubleValue("z", 0.0); + offset_pos[2] = -prop->getDoubleValue("z", 0.0); } // // Orientation // SGVec3f dir = SGVec3f::zeros(); - float inner, outer, outer_gain; - inner = outer = 360.0; - outer_gain = 0.0; + float inner = 360.0; + float outer = 360.0; + float outer_gain = 0.0; prop = node->getChild("orientation"); if ( prop != NULL ) { - dir[0] = prop->getDoubleValue("x", 0.0); - dir[1] = -prop->getDoubleValue("y", 0.0); - dir[2] = 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); + dir = SGVec3f(-prop->getFloatValue("x", 0.0), + -prop->getFloatValue("y", 0.0), + -prop->getFloatValue("z", 0.0)); + inner = prop->getFloatValue("inner-angle", 360.0); + outer = prop->getFloatValue("outer-angle", 360.0); + outer_gain = prop->getFloatValue("outer-gain", 0.0); } - + // // Initialize the sample // - _sgrp = sgrp; + if (is_avionics) { + _sgrp = avionics; + } else { + _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_audio_cone( inner, outer, outer_gain ); _sample->set_reference_dist( reference_dist ); _sample->set_max_dist( max_dist ); - _sample->set_volume(v); - _sample->set_pitch(p); + _sample->set_volume( v ); + _sample->set_pitch( p ); _sgrp->add( _sample, _name ); }