From 0f113060e960704fee562400a4cd656db2d0993f Mon Sep 17 00:00:00 2001 From: Erik Hofman Date: Tue, 3 Nov 2015 14:51:01 +0100 Subject: [PATCH] First implementation of an environment audio fx module --- src/Sound/CMakeLists.txt | 2 + src/Sound/fg_environmentfx.cxx | 158 +++++++++++++++++++++++++++++++++ src/Sound/fg_environmentfx.hxx | 68 ++++++++++++++ src/Sound/fg_fx.hxx | 2 +- 4 files changed, 229 insertions(+), 1 deletion(-) create mode 100644 src/Sound/fg_environmentfx.cxx create mode 100644 src/Sound/fg_environmentfx.hxx diff --git a/src/Sound/CMakeLists.txt b/src/Sound/CMakeLists.txt index 8b342435f..2803dfe23 100644 --- a/src/Sound/CMakeLists.txt +++ b/src/Sound/CMakeLists.txt @@ -5,6 +5,7 @@ set(SOURCES soundgenerator.cxx beacon.cxx fg_fx.cxx + fg_environmentfx.cxx morse.cxx sample_queue.cxx voice.cxx @@ -17,6 +18,7 @@ set(HEADERS soundgenerator.hxx beacon.hxx fg_fx.hxx + fg_environmentfx.hxx morse.hxx sample_queue.hxx voice.hxx diff --git a/src/Sound/fg_environmentfx.cxx b/src/Sound/fg_environmentfx.cxx new file mode 100644 index 000000000..12dc4aaca --- /dev/null +++ b/src/Sound/fg_environmentfx.cxx @@ -0,0 +1,158 @@ +// fg_environmentfx.cxx -- Sound effect management class implementation +// +// Started by David Megginson, October 2001 +// (Reuses some code from main.cxx, probably by Curtis Olson) +// +// Copyright (C) 2001 Curtis L. Olson - http://www.flightgear.org/~curt +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +// $Id$ + +#ifdef _MSC_VER +#pragma warning (disable: 4786) +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "fg_environmentfx.hxx" + +#include
+#include
+ +// #include +// #include +#include +#include + + +static std::string _refname = "EnvironmentFX"; + + +FGEnvironmentFX::FGEnvironmentFX() +{ + _enabled = fgGetNode("/sim/sound/environment/enabled", true); + _volume = fgGetNode("/sim/sound/environment/volume", true); + _smgr->add(this, _refname); +} + +FGEnvironmentFX::~FGEnvironmentFX() +{ +} + +void FGEnvironmentFX::unbind() +{ + if (_smgr) { + _smgr->remove(_refname); + } +} + +void FGEnvironmentFX::init() +{ + if (!_smgr) { + return; + } +} + +void FGEnvironmentFX::reinit() +{ + init(); +} + +void FGEnvironmentFX::update (double dt) +{ + if (!_smgr) { + return; + } + + if ( _enabled->getBoolValue() ) { + set_volume( _volume->getDoubleValue() ); + resume(); + + SGSampleGroup::update(dt); + } + else { + suspend(); + } +} + +void FGEnvironmentFX::add(std::string& path_str, const std::string& refname) +{ + if (!_smgr) { + return; + } + + SGPath path = globals->resolve_resource_path(path_str); + if (path.isNull()) + { + SG_LOG(SG_SOUND, SG_ALERT, "File not found: '" << path_str); + return; + } + SG_LOG(SG_SOUND, SG_INFO, "Reading sound from " << path.str()); + + SGSharedPtr sample; + sample = new SGSoundSample("", path); + if (sample->file_path().exists()) { + SGSampleGroup::add( sample, refname ); + } + else + { + throw sg_io_exception("Environment FX: couldn't find file: '" + path.str() + "'"); + delete sample; + } +} + +void FGEnvironmentFX::position(const std::string& refname, const SGVec3d& pos) +{ + SGSoundSample* sample = SGSampleGroup::find(refname); + if (sample) + { + sample->set_position( pos ); + } +} + +void FGEnvironmentFX::pitch(const std::string& refname, float pitch) +{ + SGSoundSample* sample = SGSampleGroup::find(refname); + if (sample) + { + sample->set_volume( pitch ); + } +} + +void FGEnvironmentFX::volume(const std::string& refname, float volume) +{ + SGSoundSample* sample = SGSampleGroup::find(refname); + if (sample) + { + sample->set_volume( volume ); + } +} + +void FGEnvironmentFX::properties(const std::string& refname, float reference_dist, float max_dist ) +{ + SGSoundSample* sample = SGSampleGroup::find(refname); + if (sample) + { + sample->set_reference_dist( reference_dist ); + if (max_dist > 0) { + sample->set_max_dist( max_dist ); + } + } +} + +// end of fg_environmentfx.cxx diff --git a/src/Sound/fg_environmentfx.hxx b/src/Sound/fg_environmentfx.hxx new file mode 100644 index 000000000..59e1a9706 --- /dev/null +++ b/src/Sound/fg_environmentfx.hxx @@ -0,0 +1,68 @@ +// fg_environmentfx.hxx -- Sound effect management class +// +// Started by David Megginson, October 2001 +// (Reuses some code from main.cxx, probably by Curtis Olson) +// +// Copyright (C) 2001 Curtis L. Olson - http://www.flightgear.org/~curt +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +// $Id$ + +#ifndef __FGENVIRONMENTFX_HXX +#define __FGENVIRONMENTFX_HXX 1 + +#include + +#include + +#include +#include +#include + +class SGXmlSound; + + +/** + * Container for FlightGear envirnonmetal sound effects. + */ +class FGEnvironmentFX : public SGSampleGroup +{ + +public: + + FGEnvironmentFX(); + ~FGEnvironmentFX(); + + void init (); + void reinit(); + void update (double dt); + void unbind(); + + void add(std::string& path_str, const std::string& refname); + void position(const std::string& refname, const SGVec3d& pos); + void pitch(const std::string& refname, float pitch); + void volume(const std::string& refname, float volume); + void properties(const std::string& refname, float reference_dist, float max_dist = -1 ); + +private: + SGPropertyNode_ptr _enabled; + SGPropertyNode_ptr _volume; +}; + + +#endif + +// end of fg_environmentfx.hxx diff --git a/src/Sound/fg_fx.hxx b/src/Sound/fg_fx.hxx index 1f5336e35..798d07cef 100644 --- a/src/Sound/fg_fx.hxx +++ b/src/Sound/fg_fx.hxx @@ -35,7 +35,7 @@ class SGXmlSound; /** - * Generator for FlightGear sound effects. + * Generator for FlightGear model sound effects. * * This module uses a FGSampleGroup class to generate sound effects based * on current flight conditions. The sound manager must be initialized -- 2.39.2