~aleteoryx/muditaos

d111ce083880951229ee08a8f924544ef8072022 — Tigran Soghbatyan 4 years ago fd6767c
[BH-1273] Fix audio asset playback stop

Make sure apps are only stopping their own audio playbacks
18 files changed, 55 insertions(+), 15 deletions(-)

M products/BellHybrid/apps/Application.cpp
M products/BellHybrid/apps/application-bell-background-sounds/ApplicationBellBackgroundSounds.cpp
M products/BellHybrid/apps/application-bell-background-sounds/include/application-bell-background-sounds/ApplicationBellBackgroundSounds.hpp
M products/BellHybrid/apps/application-bell-background-sounds/widgets/BGSoundsPlayer.cpp
M products/BellHybrid/apps/application-bell-powernap/ApplicationBellPowerNap.cpp
M products/BellHybrid/apps/application-bell-powernap/include/application-bell-powernap/ApplicationBellPowerNap.hpp
M products/BellHybrid/apps/application-bell-powernap/presenter/PowerNapProgressPresenter.cpp
M products/BellHybrid/apps/application-bell-settings/ApplicationBellSettings.cpp
M products/BellHybrid/apps/application-bell-settings/include/application-bell-settings/ApplicationBellSettings.hpp
M products/BellHybrid/apps/application-bell-settings/presenter/BedtimeSettingsPresenter.cpp
M products/BellHybrid/apps/application-bell-settings/presenter/alarm_settings/AlarmSettingsPresenter.cpp
M products/BellHybrid/apps/application-bell-settings/presenter/alarm_settings/PrewakeUpPresenter.cpp
M products/BellHybrid/apps/application-bell-settings/presenter/alarm_settings/SnoozePresenter.cpp
M products/BellHybrid/apps/common/include/common/models/AbstractAudioModel.hpp
M products/BellHybrid/apps/common/include/common/models/AudioModel.hpp
M products/BellHybrid/apps/common/src/AudioModel.cpp
M products/BellHybrid/apps/include/Application.hpp
M products/BellHybrid/services/audio/ServiceAudio.cpp
M products/BellHybrid/apps/Application.cpp => products/BellHybrid/apps/Application.cpp +0 -1
@@ 117,7 117,6 @@ namespace app
    void Application::onStop()
    {
        stopIdleTimer();
        stopAllAudio();
    }

    void Application::stopAllAudio()

M products/BellHybrid/apps/application-bell-background-sounds/ApplicationBellBackgroundSounds.cpp => products/BellHybrid/apps/application-bell-background-sounds/ApplicationBellBackgroundSounds.cpp +6 -0
@@ 108,4 108,10 @@ namespace app
        }
        return ApplicationCommon::handleSwitchWindow(msgl);
    }

    void ApplicationBellBackgroundSounds::onStop()
    {
        Application::onStop();
        audioModel->stopPlayedByThis({});
    }
} // namespace app

M products/BellHybrid/apps/application-bell-background-sounds/include/application-bell-background-sounds/ApplicationBellBackgroundSounds.hpp => products/BellHybrid/apps/application-bell-background-sounds/include/application-bell-background-sounds/ApplicationBellBackgroundSounds.hpp +1 -0
@@ 26,6 26,7 @@ namespace app
        std::unique_ptr<AbstractAudioModel> audioModel;
        std::unique_ptr<bgSounds::BGSoundsPlayer> player;

        void onStop() override;
        sys::MessagePointer handleSwitchWindow(sys::Message *msgl) override;

      public:

M products/BellHybrid/apps/application-bell-background-sounds/widgets/BGSoundsPlayer.cpp => products/BellHybrid/apps/application-bell-background-sounds/widgets/BGSoundsPlayer.cpp +1 -1
@@ 28,7 28,7 @@ namespace app::bgSounds
    void BGSoundsPlayer::stop(AbstractAudioModel::OnStateChangeCallback &&callback)
    {
        paused = false;
        audioModel.stop(std::move(callback));
        audioModel.stopPlayedByThis(std::move(callback));
    }
    void BGSoundsPlayer::pause(AbstractAudioModel::OnStateChangeCallback &&callback)
    {

M products/BellHybrid/apps/application-bell-powernap/ApplicationBellPowerNap.cpp => products/BellHybrid/apps/application-bell-powernap/ApplicationBellPowerNap.cpp +6 -0
@@ 73,4 73,10 @@ namespace app

        return handleAsyncResponse(resp);
    }

    void ApplicationBellPowerNap::onStop()
    {
        Application::onStop();
        audioModel->stopPlayedByThis({});
    }
} // namespace app

M products/BellHybrid/apps/application-bell-powernap/include/application-bell-powernap/ApplicationBellPowerNap.hpp => products/BellHybrid/apps/application-bell-powernap/include/application-bell-powernap/ApplicationBellPowerNap.hpp +1 -0
@@ 24,6 24,7 @@ namespace app
    {
      private:
        std::unique_ptr<AbstractAudioModel> audioModel;
        void onStop() override;

      public:
        ApplicationBellPowerNap(std::string name                    = applicationBellPowerNapName,

M products/BellHybrid/apps/application-bell-powernap/presenter/PowerNapProgressPresenter.cpp => products/BellHybrid/apps/application-bell-powernap/presenter/PowerNapProgressPresenter.cpp +1 -1
@@ 65,7 65,7 @@ namespace app::powernap
    }
    void PowerNapProgressPresenter::onNapAlarmFinished()
    {
        audioModel.stop({});
        audioModel.stopPlayedByThis({});
        getView()->napEnded();
    }


M products/BellHybrid/apps/application-bell-settings/ApplicationBellSettings.cpp => products/BellHybrid/apps/application-bell-settings/ApplicationBellSettings.cpp +6 -0
@@ 239,4 239,10 @@ namespace app
        }
        return handleAsyncResponse(resp);
    }

    void ApplicationBellSettings::onStop()
    {
        Application::onStop();
        audioModel->stopPlayedByThis({});
    }
} // namespace app

M products/BellHybrid/apps/application-bell-settings/include/application-bell-settings/ApplicationBellSettings.hpp => products/BellHybrid/apps/application-bell-settings/include/application-bell-settings/ApplicationBellSettings.hpp +1 -0
@@ 29,6 29,7 @@ namespace app
    {
      private:
        std::unique_ptr<AbstractAudioModel> audioModel;
        void onStop() override;

      public:
        ApplicationBellSettings(std::string name                    = applicationBellSettingsName,

M products/BellHybrid/apps/application-bell-settings/presenter/BedtimeSettingsPresenter.cpp => products/BellHybrid/apps/application-bell-settings/presenter/BedtimeSettingsPresenter.cpp +1 -1
@@ 61,7 61,7 @@ namespace app::bell_settings

    void BedtimeSettingsPresenter::stopSound()
    {
        this->audioModel.stop({});
        this->audioModel.stopPlayedByThis({});
    }
    void BedtimeSettingsPresenter::exitWithoutSave()
    {

M products/BellHybrid/apps/application-bell-settings/presenter/alarm_settings/AlarmSettingsPresenter.cpp => products/BellHybrid/apps/application-bell-settings/presenter/alarm_settings/AlarmSettingsPresenter.cpp +1 -1
@@ 57,7 57,7 @@ namespace app::bell_settings
    }
    void AlarmSettingsPresenter::stopSound()
    {
        this->audioModel.stop({});
        this->audioModel.stopPlayedByThis({});
    }
    void AlarmSettingsPresenter::exitWithoutSave()
    {

M products/BellHybrid/apps/application-bell-settings/presenter/alarm_settings/PrewakeUpPresenter.cpp => products/BellHybrid/apps/application-bell-settings/presenter/alarm_settings/PrewakeUpPresenter.cpp +1 -1
@@ 61,7 61,7 @@ namespace app::bell_settings
    }
    void PrewakeUpWindowPresenter::stopSound()
    {
        this->audioModel.stop({});
        this->audioModel.stopPlayedByThis({});
    }
    void PrewakeUpWindowPresenter::exitWithoutSave()
    {

M products/BellHybrid/apps/application-bell-settings/presenter/alarm_settings/SnoozePresenter.cpp => products/BellHybrid/apps/application-bell-settings/presenter/alarm_settings/SnoozePresenter.cpp +1 -1
@@ 58,7 58,7 @@ namespace app::bell_settings
    }
    void SnoozePresenter::stopSound()
    {
        audioModel.stop({});
        audioModel.stopPlayedByThis({});
    }
    void SnoozePresenter::eraseProviderData()
    {

M products/BellHybrid/apps/common/include/common/models/AbstractAudioModel.hpp => products/BellHybrid/apps/common/include/common/models/AbstractAudioModel.hpp +2 -1
@@ 36,7 36,8 @@ namespace app
        virtual std::optional<Volume> getVolume(PlaybackType playbackType)                                  = 0;
        virtual void getVolume(PlaybackType playbackType, OnGetValueCallback &&callback)                    = 0;
        virtual void play(const std::string &filePath, PlaybackType type, OnStateChangeCallback &&callback) = 0;
        virtual void stop(OnStateChangeCallback &&callback)                                                 = 0;
        virtual void stopAny(OnStateChangeCallback &&callback)                                              = 0;
        virtual void stopPlayedByThis(OnStateChangeCallback &&callback)                                     = 0;
        virtual void pause(OnStateChangeCallback &&callback)                                                = 0;
        virtual void resume(OnStateChangeCallback &&callback)                                               = 0;
        virtual void setPlaybackFinishedCb(OnPlaybackFinishedCallback &&callback)                           = 0;

M products/BellHybrid/apps/common/include/common/models/AudioModel.hpp => products/BellHybrid/apps/common/include/common/models/AudioModel.hpp +4 -1
@@ 18,13 18,16 @@ namespace app
        std::optional<Volume> getVolume(PlaybackType playbackType) override;
        void getVolume(PlaybackType playbackType, OnGetValueCallback &&callback) override;
        void play(const std::string &filePath, PlaybackType type, OnStateChangeCallback &&callback) override;
        void stop(OnStateChangeCallback &&callback) override;
        void stopAny(OnStateChangeCallback &&callback) override;
        void stopPlayedByThis(OnStateChangeCallback &&callback) override;
        void pause(OnStateChangeCallback &&callback) override;
        void resume(OnStateChangeCallback &&callback) override;
        void setPlaybackFinishedCb(OnPlaybackFinishedCallback &&callback) override;
        bool hasPlaybackFinished() override;

      private:
        audio::Token lastPlayedToken = audio::Token::MakeBadToken();
        void stop(audio::Token token, OnStateChangeCallback &&callback);
        std::function<void()> playbackFinishedCallback{nullptr};
        bool playbackFinishedFlag{false};
        ApplicationCommon *app{};

M products/BellHybrid/apps/common/src/AudioModel.cpp => products/BellHybrid/apps/common/src/AudioModel.cpp +15 -4
@@ 76,8 76,9 @@ namespace app
        playbackFinishedFlag = false;
        auto msg  = std::make_unique<service::AudioStartPlaybackRequest>(filePath, convertPlaybackType(type));
        auto task = app::AsyncRequest::createFromMessage(std::move(msg), service::audioServiceName);
        auto cb   = [_callback = callback](auto response) {
            auto result = dynamic_cast<service::AudioStartPlaybackResponse *>(response);
        auto cb              = [_callback = callback, this](auto response) {
            auto result     = dynamic_cast<service::AudioStartPlaybackResponse *>(response);
            lastPlayedToken = result->token;
            if (result == nullptr) {
                return false;
            }


@@ 91,9 92,14 @@ namespace app
        task->execute(app, this, std::move(cb));
    }

    void AudioModel::stop(OnStateChangeCallback &&callback)
    void AudioModel::stopAny(OnStateChangeCallback &&callback)
    {
        stop(audio::Token(), std::move(callback));
    }

    void AudioModel::stop(audio::Token token, OnStateChangeCallback &&callback)
    {
        auto msg  = std::make_unique<service::AudioStopRequest>();
        auto msg  = std::make_unique<service::AudioStopRequest>(token);
        auto task = app::AsyncRequest::createFromMessage(std::move(msg), service::audioServiceName);
        auto cb   = [_callback = callback](auto response) {
            auto result = dynamic_cast<service::AudioStopResponse *>(response);


@@ 109,6 115,11 @@ namespace app
        task->execute(app, this, std::move(cb));
    }

    void AudioModel::stopPlayedByThis(OnStateChangeCallback &&callback)
    {
        stop(lastPlayedToken, std::move(callback));
    }

    void AudioModel::setVolume(AbstractAudioModel::Volume volume,
                               PlaybackType playbackType,
                               OnStateChangeCallback &&callback)

M products/BellHybrid/apps/include/Application.hpp => products/BellHybrid/apps/include/Application.hpp +1 -1
@@ 21,6 21,7 @@ namespace app
        void restartIdleTimer();
        void stopIdleTimer();
        void stopAllAudio();
        virtual void onStop();

      private:
        sys::MessagePointer handleKBDKeyEvent(sys::Message *msgl) override;


@@ 31,7 32,6 @@ namespace app

        virtual void onKeyPressed();
        virtual void onStart();
        virtual void onStop();
        bool idleTimerActiveFlag = true;
    };
} // namespace app

M products/BellHybrid/services/audio/ServiceAudio.cpp => products/BellHybrid/services/audio/ServiceAudio.cpp +6 -1
@@ 157,7 157,12 @@ namespace service

        for (auto &input : audioMux.GetAllInputs()) {
            auto t = input.token;
            retCodes.emplace_back(t, stopInput(&input));
            if (token.IsValid() && t == token) {
                retCodes.emplace_back(t, stopInput(&input));
            }
            if (token.IsUninitialized()) {
                retCodes.emplace_back(t, stopInput(&input));
            }
        }

        // on failure return first false code