- accepted_spanevents_drul_[d] = m;
- if (current_cresc_ev_ && d == START)
- accepted_spanevents_drul_[STOP] = m;
- return true;
- }
- return false;
+IMPLEMENT_TRANSLATOR_LISTENER (Dynamic_engraver, span_dynamic);
+void
+Dynamic_engraver::listen_span_dynamic (Stream_event *ev)
+{
+ Direction d = to_dir (ev->get_property ("span-direction"));
+
+ if (d == START)
+ ASSIGN_EVENT_ONCE (accepted_spanevents_drul_[START], ev);
+
+ /* Cancel any ongoing crescendo, either explicitly by \! or
+ implicitly by a new crescendo. Also avoid warning if cresc is
+ cancelled both implicitly and explicitly. */
+ if ((d == STOP || current_cresc_ev_) && !accepted_spanevents_drul_[STOP])
+ ASSIGN_EVENT_ONCE (accepted_spanevents_drul_[STOP], ev);