X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FInstrumentation%2Fmk_viii.cxx;h=9b0ee2b480428d5d32f0c16010907d18e914071d;hb=d15d2ad2703e0572e3b9a24d238d6089be1ec6b9;hp=8fb871a4ab5d853a94b4e30faa4d7f901d0d4f66;hpb=118d8fbca5d98e994d572e4c922f76ba2cab9e52;p=flightgear.git diff --git a/src/Instrumentation/mk_viii.cxx b/src/Instrumentation/mk_viii.cxx index 8fb871a4a..9b0ee2b48 100644 --- a/src/Instrumentation/mk_viii.cxx +++ b/src/Instrumentation/mk_viii.cxx @@ -16,7 +16,7 @@ // // 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., 675 Mass Ave, Cambridge, MA 02139, USA. +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. // /////////////////////////////////////////////////////////////////////////////// // @@ -70,6 +70,7 @@ #include #include #include +#include #include using std::string; @@ -210,17 +211,6 @@ MK_VIII::PropertiesHandler::init () mk_node(vs) = fgGetNode("/velocities/vertical-speed-fps", true); } -void -MK_VIII::PropertiesHandler::unbind () -{ - vector::iterator iter; - - for (iter = tied_properties.begin(); iter != tied_properties.end(); iter++) - (*iter)->untie(); - - tied_properties.clear(); -} - /////////////////////////////////////////////////////////////////////////////// // PowerHandler /////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// @@ -1858,7 +1848,8 @@ MK_VIII::IOHandler::tie_input (SGPropertyNode *node, bool *input, bool *feed) { - mk->properties_handler.tie(node, (string("inputs/discretes/") + name).c_str(), RawValueMethodsData(*this, input, &MK_VIII::IOHandler::get_discrete_input, &MK_VIII::IOHandler::set_discrete_input)); + mk->properties_handler.tie(node, (string("inputs/discretes/") + name).c_str(), + FGVoicePlayer::RawValueMethodsData(*this, input, &MK_VIII::IOHandler::get_discrete_input, &MK_VIII::IOHandler::set_discrete_input)); if (feed) mk->properties_handler.tie(node, (string("input-feeders/discretes/") + name).c_str(), SGRawValuePointer(feed)); } @@ -2144,256 +2135,50 @@ MK_VIII::IOHandler::set_present_status (bool value) /////////////////////////////////////////////////////////////////////////////// -// VoicePlayer //////////////////////////////////////////////////////////////// +// MK_VIII::VoicePlayer /////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// -void -MK_VIII::VoicePlayer::Speaker::bind (SGPropertyNode *node) -{ - // uses xmlsound property names - tie(node, "volume", &volume); - tie(node, "pitch", &pitch); -} - -void -MK_VIII::VoicePlayer::Speaker::update_configuration () -{ - map< string, SGSharedPtr >::iterator iter; - for (iter = player->samples.begin(); iter != player->samples.end(); iter++) - { - SGSoundSample *sample = (*iter).second; - - sample->set_pitch(pitch); - } - - if (player->voice) - player->voice->volume_changed(); -} - -MK_VIII::VoicePlayer::Voice::~Voice () -{ - for (iter = elements.begin(); iter != elements.end(); iter++) - delete *iter; // we owned the element - elements.clear(); -} - -void -MK_VIII::VoicePlayer::Voice::play () -{ - iter = elements.begin(); - element = *iter; - - element->play(get_volume()); -} - -void -MK_VIII::VoicePlayer::Voice::stop (bool now) -{ - if (element) - { - if (now || element->silence) - { - element->stop(); - element = NULL; - } - else - iter = elements.end() - 1; // stop after the current element finishes - } -} - -void -MK_VIII::VoicePlayer::Voice::set_volume (float _volume) -{ - volume = _volume; - volume_changed(); -} - -void -MK_VIII::VoicePlayer::Voice::volume_changed () -{ - if (element) - element->set_volume(get_volume()); -} - -void -MK_VIII::VoicePlayer::Voice::update () -{ - if (element) - { - if (! element->is_playing()) - { - if (++iter == elements.end()) - element = NULL; - else - { - element = *iter; - element->play(get_volume()); - } - } - } -} - -MK_VIII::VoicePlayer::~VoicePlayer () -{ - vector::iterator iter1; - for (iter1 = _voices.begin(); iter1 != _voices.end(); iter1++) - delete *iter1; - _voices.clear(); - samples.clear(); -} - void MK_VIII::VoicePlayer::init () { -#define STDPAUSE 0.75 // [SPEC] 6.4.4: "the standard 0.75 second delay" - - SGSoundMgr *smgr = globals->get_soundmgr(); - _sgr = smgr->find("avionics", true); - _sgr->tie_to_listener(); - - make_voice(&voices.application_data_base_failed, "application-data-base-failed"); - make_voice(&voices.bank_angle, "bank-angle"); - make_voice(&voices.bank_angle_bank_angle, "bank-angle", "bank-angle"); - make_voice(&voices.bank_angle_bank_angle_3, "bank-angle", "bank-angle", 3.0); - make_voice(&voices.bank_angle_inop, "bank-angle-inop"); - make_voice(&voices.bank_angle_pause_bank_angle, "bank-angle", STDPAUSE, "bank-angle"); - make_voice(&voices.bank_angle_pause_bank_angle_3, "bank-angle", STDPAUSE, "bank-angle", 3.0); - make_voice(&voices.callouts_inop, "callouts-inop"); - make_voice(&voices.configuration_type_invalid, "configuration-type-invalid"); - make_voice(&voices.dont_sink, "dont-sink"); - make_voice(&voices.dont_sink_pause_dont_sink, "dont-sink", STDPAUSE, "dont-sink"); - make_voice(&voices.five_hundred_above, "500-above"); - make_voice(&voices.glideslope, "glideslope"); - make_voice(&voices.glideslope_inop, "glideslope-inop"); - make_voice(&voices.gpws_inop, "gpws-inop"); - make_voice(&voices.hard_glideslope, "glideslope", "glideslope", 3.0); - make_voice(&voices.minimums, "minimums"); - make_voice(&voices.minimums_minimums, "minimums", "minimums"); - make_voice(&voices.pull_up, "pull-up"); - make_voice(&voices.sink_rate, "sink-rate"); - make_voice(&voices.sink_rate_pause_sink_rate, "sink-rate", STDPAUSE, "sink-rate"); - make_voice(&voices.soft_glideslope, new Voice::SampleElement(get_sample("glideslope"), modify_amplitude(1.0, -6))); - make_voice(&voices.terrain, "terrain"); - make_voice(&voices.terrain_pause_terrain, "terrain", STDPAUSE, "terrain"); - make_voice(&voices.too_low_flaps, "too-low-flaps"); - make_voice(&voices.too_low_gear, "too-low-gear"); - make_voice(&voices.too_low_terrain, "too-low-terrain"); - - for (unsigned i = 0; i < n_altitude_callouts; i++) - { - std::ostringstream name; - name << "altitude-" << mk->mode6_handler.altitude_callout_definitions[i]; - make_voice(&voices.altitude_callouts[i], name.str().c_str()); - } - - speaker.update_configuration(); -} - -SGSoundSample * -MK_VIII::VoicePlayer::get_sample (const char *name) -{ - std::ostringstream refname; - refname << mk->name << "[" << mk->num << "]" << "/" << name; - - SGSoundSample *sample = _sgr->find(refname.str()); - if (! sample) - { - string filename = "Sounds/mk-viii/" + string(name) + ".wav"; - try - { - sample = new SGSoundSample(filename.c_str(), SGPath()); - } - catch (const sg_exception &e) - { - SG_LOG(SG_INSTR, SG_ALERT, "Error loading MK VIII sound sample \"" + filename + "\": " + e.getFormattedMessage()); - exit(1); - } - - _sgr->add(sample, refname.str()); - samples[refname.str()] = sample; - } - - return sample; -} - -void -MK_VIII::VoicePlayer::play (Voice *_voice, unsigned int flags) -{ - if (!_voice) - return; - if (test_bits(flags, PLAY_NOW) || ! voice || voice->element->silence) - { - if (voice) - voice->stop(true); - - voice = _voice; - looped = test_bits(flags, PLAY_LOOPED); - - next_voice = NULL; - next_looped = false; - - voice->play(); - } - else - { - next_voice = _voice; - next_looped = test_bits(flags, PLAY_LOOPED); - } -} - -void -MK_VIII::VoicePlayer::stop (unsigned int flags) -{ - if (voice) - { - voice->stop(test_bits(flags, STOP_NOW)); - if (voice->element) - looped = false; - else - voice = NULL; - next_voice = NULL; - } -} - -void -MK_VIII::VoicePlayer::set_volume (float _volume) -{ - volume = _volume; - if (voice) - voice->volume_changed(); -} - -void -MK_VIII::VoicePlayer::update () -{ - if (voice) - { - voice->update(); - - if (next_voice) - { - if (! voice->element || voice->element->silence) - { - voice = next_voice; - looped = next_looped; - - next_voice = NULL; - next_looped = false; - - voice->play(); - } - } - else - { - if (! voice->element) - { - if (looped) - voice->play(); - else - voice = NULL; - } - } - } + FGVoicePlayer::init(); + +#define STDPAUSE 0.75 // [SPEC] 6.4.4: "the standard 0.75 second delay" + make_voice(&voices.application_data_base_failed, "application-data-base-failed"); + make_voice(&voices.bank_angle, "bank-angle"); + make_voice(&voices.bank_angle_bank_angle, "bank-angle", "bank-angle"); + make_voice(&voices.bank_angle_bank_angle_3, "bank-angle", "bank-angle", 3.0); + make_voice(&voices.bank_angle_inop, "bank-angle-inop"); + make_voice(&voices.bank_angle_pause_bank_angle, "bank-angle", STDPAUSE, "bank-angle"); + make_voice(&voices.bank_angle_pause_bank_angle_3, "bank-angle", STDPAUSE, "bank-angle", 3.0); + make_voice(&voices.callouts_inop, "callouts-inop"); + make_voice(&voices.configuration_type_invalid, "configuration-type-invalid"); + make_voice(&voices.dont_sink, "dont-sink"); + make_voice(&voices.dont_sink_pause_dont_sink, "dont-sink", STDPAUSE, "dont-sink"); + make_voice(&voices.five_hundred_above, "500-above"); + make_voice(&voices.glideslope, "glideslope"); + make_voice(&voices.glideslope_inop, "glideslope-inop"); + make_voice(&voices.gpws_inop, "gpws-inop"); + make_voice(&voices.hard_glideslope, "glideslope", "glideslope", 3.0); + make_voice(&voices.minimums, "minimums"); + make_voice(&voices.minimums_minimums, "minimums", "minimums"); + make_voice(&voices.pull_up, "pull-up"); + make_voice(&voices.sink_rate, "sink-rate"); + make_voice(&voices.sink_rate_pause_sink_rate, "sink-rate", STDPAUSE, "sink-rate"); + make_voice(&voices.soft_glideslope, new Voice::SampleElement(get_sample("glideslope"), modify_amplitude(1.0, -6))); + make_voice(&voices.terrain, "terrain"); + make_voice(&voices.terrain_pause_terrain, "terrain", STDPAUSE, "terrain"); + make_voice(&voices.too_low_flaps, "too-low-flaps"); + make_voice(&voices.too_low_gear, "too-low-gear"); + make_voice(&voices.too_low_terrain, "too-low-terrain"); + + for (unsigned i = 0; i < n_altitude_callouts; i++) + { + std::ostringstream name; + name << "altitude-" << MK_VIII::Mode6Handler::altitude_callout_definitions[i]; + make_voice(&voices.altitude_callouts[i], name.str().c_str()); + } + speaker.update_configuration(); } /////////////////////////////////////////////////////////////////////////////// @@ -4949,7 +4734,7 @@ MK_VIII::bind () configuration_module.bind(node); power_handler.bind(node); io_handler.bind(node); - voice_player.bind(node); + voice_player.bind(node, "Sounds/mk-viii/"); } void