# include <simgear_config.h>
#endif
+#include "xmlsound.hxx"
+
+
#include <simgear/compiler.h>
#include <string.h>
#include <simgear/debug/logstream.hxx>
+#include <simgear/props/props.hxx>
#include <simgear/props/condition.hxx>
-#include <simgear/math/SGMath.hxx>
#include <simgear/structure/exception.hxx>
#include <simgear/misc/sg_path.hxx>
-#include "xmlsound.hxx"
+#include "sample_group.hxx"
+#include "sample_openal.hxx"
+using std::string;
// static double _snd_lin(double v) { return v; }
static double _snd_inv(double v) { return (v == 0) ? 1e99 : 1/v; }
_dt_play(0.0),
_dt_stop(0.0),
_delay(0.0),
- _stopping(0.0)
+ _stopping(0.0),
+ _initialized(false)
{
}
void
SGXmlSound::init(SGPropertyNode *root, SGPropertyNode *node,
SGSampleGroup *sgrp, SGSampleGroup *avionics,
- const string &path)
+ const SGPath& currentDir)
{
//
//
_name = node->getStringValue("name", "");
- SG_LOG(SG_GENERAL, SG_DEBUG, "Loading sound information for: " << _name );
+ SG_LOG(SG_SOUND, SG_DEBUG, "Loading sound information for: " << _name );
string mode_str = node->getStringValue("mode", "");
if ( mode_str == "looped" ) {
_condition = sgReadCondition(root, condition);
if (!_property && !_condition)
- SG_LOG(SG_GENERAL, SG_WARN,
+ SG_LOG(SG_SOUND, SG_WARN,
" Neither a condition nor a property specified");
_delay = node->getDoubleValue("delay-sec", 0.0);
}
if (!volume.fn)
- SG_LOG(SG_GENERAL,SG_INFO,
+ SG_LOG(SG_SOUND,SG_INFO,
" Unknown volume type, default to 'lin'");
}
volume.offset = kids[i]->getDoubleValue("offset", 0.0);
if ((volume.min = kids[i]->getDoubleValue("min", 0.0)) < 0.0)
- SG_LOG( SG_GENERAL, SG_WARN,
+ SG_LOG( SG_SOUND, SG_WARN,
"Volume minimum value below 0. Forced to 0.");
volume.max = kids[i]->getDoubleValue("max", 0.0);
if (volume.max && (volume.max < volume.min) )
- SG_LOG(SG_GENERAL,SG_ALERT,
+ SG_LOG(SG_SOUND,SG_ALERT,
" Volume maximum below minimum. Neglected.");
_volume.push_back(volume);
}
if (!pitch.fn)
- SG_LOG(SG_GENERAL,SG_INFO,
+ SG_LOG(SG_SOUND,SG_INFO,
" Unknown pitch type, default to 'lin'");
}
pitch.offset = kids[i]->getDoubleValue("offset", 1.0);
if ((pitch.min = kids[i]->getDoubleValue("min", 0.0)) < 0.0)
- SG_LOG(SG_GENERAL,SG_WARN,
+ SG_LOG(SG_SOUND,SG_WARN,
" Pitch minimum value below 0. Forced to 0.");
pitch.max = kids[i]->getDoubleValue("max", 0.0);
if (pitch.max && (pitch.max < pitch.min) )
- SG_LOG(SG_GENERAL,SG_ALERT,
+ SG_LOG(SG_SOUND,SG_ALERT,
" Pitch maximum below minimum. Neglected");
_pitch.push_back(pitch);
//
// Initialize the sample
//
- if (is_avionics) {
+ if ((is_avionics)&&(avionics)) {
_sgrp = avionics;
} else {
_sgrp = sgrp;
}
- _sample = new SGSoundSample( path.c_str(), node->getStringValue("path", ""));
+ string soundFileStr = node->getStringValue("path", "");
+ _sample = new SGSoundSample(soundFileStr.c_str(), currentDir);
if (!_sample->file_path().exists()) {
- throw sg_io_exception("XML sound: couldn't find file: " + _sample->file_path().str());
+ throw sg_io_exception("XML sound: couldn't find file: '" + soundFileStr + "'");
}
_sample->set_relative_position( offset_pos );
if (_property)
curr_value = _property->getDoubleValue();
+ if (!_initialized)
+ {
+ // update initial value before detecting changes
+ _prev_value = curr_value;
+ _initialized = true;
+ }
+
// If a condition is defined, test whether it is FALSE,
// else
// if a property is defined then test if it's value is FALSE
if ((_mode != SGXmlSound::IN_TRANSIT) || (_stopping > MAX_TRANSIT_TIME))
{
if (_sample->is_playing()) {
- SG_LOG(SG_GENERAL, SG_DEBUG, "Stopping audio after " << _dt_play
+ SG_LOG(SG_SOUND, SG_DEBUG, "Stopping audio after " << _dt_play
<< " sec: " << _name );
_sample->stop();
double vol = volume_offset + volume;
if (vol > 1.0) {
- SG_LOG(SG_GENERAL, SG_DEBUG, "Sound volume too large for '"
+ SG_LOG(SG_SOUND, SG_DEBUG, "Sound volume too large for '"
<< _name << "': " << vol << " -> clipping to 1.0");
vol = 1.0;
}
else
_sample->play(true);
- SG_LOG(SG_GENERAL, SG_DEBUG, "Playing audio after " << _dt_stop
+ SG_LOG(SG_SOUND, SG_DEBUG, "Playing audio after " << _dt_stop
<< " sec: " << _name);
- SG_LOG(SG_GENERAL, SG_DEBUG,
+ SG_LOG(SG_SOUND, SG_DEBUG,
"Playing " << ((_mode == ONCE) ? "once" : "looped"));
_active = true;