'lin' is a valid value for the type parameter so do not show a warning. Add a 'random' tag for pitch offset

This commit is contained in:
Erik Hofman 2020-03-20 09:56:21 +01:00
parent 6c6e74e8d1
commit b458300c02
2 changed files with 26 additions and 24 deletions

View File

@ -37,6 +37,7 @@
#include <simgear/props/props.hxx>
#include <simgear/props/condition.hxx>
#include <simgear/structure/exception.hxx>
#include <simgear/math/sg_random.h>
#include <simgear/misc/sg_path.hxx>
#include "sample_group.hxx"
@ -53,18 +54,6 @@ 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; }
static const struct {
const char *name;
double (*fn)(double);
} __sound_fn[] = {
{"inv", _snd_inv},
{"abs", _snd_abs},
{"sqrt", _snd_sqrt},
{"log", _snd_log10},
{"ln", _snd_log},
{"", NULL}
};
SGXmlSound::SGXmlSound()
: _sample(NULL),
_active(false),
@ -76,6 +65,11 @@ SGXmlSound::SGXmlSound()
_delay(0.0),
_stopping(0.0)
{
_sound_fn["inv"] = _snd_inv;
_sound_fn["abs"] = _snd_abs;
_sound_fn["sqrt"] = _snd_sqrt;
_sound_fn["log"] = _snd_log10;
_sound_fn["ln"] = _snd_log;
}
SGXmlSound::~SGXmlSound()
@ -167,13 +161,12 @@ SGXmlSound::init( SGPropertyNode *root,
}
string type_str = kids[i]->getStringValue("type", "");
if ( type_str != "" ) {
if ( type_str != "" && type_str != "lin" ) {
for (int j=0; __sound_fn[j].fn; j++)
if ( type_str == __sound_fn[j].name ) {
volume.fn = __sound_fn[j].fn;
break;
}
auto it = _sound_fn.find(type_str);
if (it != _sound_fn.end()) {
volume.fn = it->second;
}
if (!volume.fn)
SG_LOG(SG_SOUND, SG_DEV_WARN,
@ -210,6 +203,9 @@ SGXmlSound::init( SGPropertyNode *root,
for (i = 0; (i < kids.size()) && (i < SGXmlSound::MAXPROP); i++) {
_snd_prop pitch = {NULL, NULL, NULL, NULL, 1.0, 1.0, 0.0, 0.0, false};
double randomness = kids[i]->getDoubleValue("random", 0.0);
randomness *= sg_random();
SGPropertyNode *n = kids[i]->getChild("expression");
if (n != NULL) {
pitch.expr = SGReadDoubleExpression(root, n->getChild(0));
@ -232,13 +228,12 @@ SGXmlSound::init( SGPropertyNode *root,
}
string type_str = kids[i]->getStringValue("type", "");
if ( type_str != "" ) {
if ( type_str != "" && type_str != "lin" ) {
for (int j=0; __sound_fn[j].fn; j++)
if ( type_str == __sound_fn[j].name ) {
pitch.fn = __sound_fn[j].fn;
break;
}
auto it = _sound_fn.find(type_str);
if (it != _sound_fn.end()) {
pitch.fn = it->second;
}
if (!pitch.fn)
SG_LOG(SG_SOUND, SG_DEV_WARN,
@ -247,6 +242,7 @@ SGXmlSound::init( SGPropertyNode *root,
}
pitch.offset = kids[i]->getDoubleValue("offset", 1.0);
pitch.offset += randomness;
if ((pitch.min = kids[i]->getDoubleValue("min", 0.0)) < 0.0)
SG_LOG(SG_SOUND, SG_DEV_WARN,

View File

@ -26,6 +26,7 @@
#define _SG_SOUND_HXX 1
#include <map>
#include <vector>
#include <string>
@ -148,6 +149,11 @@ protected:
bool subtract;
} _snd_prop;
protected:
typedef double (*_fn_t)(double);
typedef std::map <std::string, _fn_t> _sound_fn_t;
_sound_fn_t _sound_fn;
private:
SGSampleGroup * _sgrp;