From dfd80b5d8bf447dca9f5e3a3ff17fa19c2f5a6c6 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 11 May 2020 17:22:39 +1000 Subject: [PATCH] AP_Notify: fixed recursion bug in tone player --- libraries/AP_Notify/MMLPlayer.cpp | 14 ++++++++++++-- libraries/AP_Notify/MMLPlayer.h | 4 ++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/libraries/AP_Notify/MMLPlayer.cpp b/libraries/AP_Notify/MMLPlayer.cpp index 359a7b9da9..76cfb5d711 100644 --- a/libraries/AP_Notify/MMLPlayer.cpp +++ b/libraries/AP_Notify/MMLPlayer.cpp @@ -21,7 +21,7 @@ void MMLPlayer::update() } } -void MMLPlayer::play(const char* string) +void MMLPlayer::prepare_to_play_string(const char* string) { stop(); @@ -36,6 +36,12 @@ void MMLPlayer::play(const char* string) _repeat = false; _playing = true; + _note_duration_us = 0; +} + +void MMLPlayer::play(const char* string) +{ + prepare_to_play_string(string); next_action(); } @@ -133,7 +139,11 @@ void MMLPlayer::next_action() char c = next_char(); if (c == '\0') { if (_repeat) { - play(_string); + // don't "play" here, as we may have been called from + // there, and it turns out infinite recursion on + // invalid strings is suboptimal. The next call to + // update() will push things out as appropriate. + prepare_to_play_string(_string); } else { stop(); } diff --git a/libraries/AP_Notify/MMLPlayer.h b/libraries/AP_Notify/MMLPlayer.h index 9ab2ff60d3..2f07b4980b 100644 --- a/libraries/AP_Notify/MMLPlayer.h +++ b/libraries/AP_Notify/MMLPlayer.h @@ -10,6 +10,10 @@ public: void stop(); private: + + // initialise ready to play string + void prepare_to_play_string(const char* string); + bool _playing; uint32_t _note_duration_us;