~aleteoryx/muditaos

a9b9921f017bb5d3ad4deed446e5024dd04d76d1 — Maciej Gibowicz 1 year, 4 months ago 747ae02
[BH-2067] Fix fade in for relaxation after pausing a song

When we stopped the song at the beginning of the relaxation, it had no
effect to fade in that was still running in the background, meaning that
when we resumed playback, we had a sudden increase in volume
additionally, after pausing and resuming relaxation, the fade out
appeared too quickly
M products/BellHybrid/services/audio/ServiceAudio.cpp => products/BellHybrid/services/audio/ServiceAudio.cpp +10 -0
@@ 378,6 378,11 @@ namespace service
    auto Audio::handlePause() -> std::unique_ptr<AudioResponseMessage>
    {
        auto retCode = audio::RetCode::InvokedInIncorrectState;

        if (volumeFade->IsActive()) {
            volumeFade->Pause();
        }

        if (const auto activeInput = audioMux.GetActiveInput(); activeInput) {
            auto playbackType = (*activeInput)->audio->GetCurrentOperationPlaybackType();
            if (isResumable(playbackType)) {


@@ 394,6 399,11 @@ namespace service
    auto Audio::handleResume() -> std::unique_ptr<AudioResponseMessage>
    {
        auto retCode = audio::RetCode::InvokedInIncorrectState;

        if (!volumeFade->IsActive()) {
            volumeFade->Resume();
        }

        if (const auto activeInput = audioMux.GetActiveInput();
            activeInput && activeInput.value()->audio->GetCurrentOperationState() == audio::Operation::State::Paused) {
            retCode = activeInput.value()->audio->Resume();

M products/BellHybrid/services/audio/VolumeFade.cpp => products/BellHybrid/services/audio/VolumeFade.cpp +26 -5
@@ 42,6 42,7 @@ namespace audio
        currentVolume      = minVolume + fadeStep;
        phase              = Phase::FadeIn;
        timestamp          = std::chrono::system_clock::now();
        timeElapsed        = std::chrono::milliseconds::zero();
        fadeInterval       = calculateFadeInterval(fadeParams.maxFadeDuration);

        if (this->fadeParams.mode == audio::Fade::InOut && this->fadeParams.playbackDuration.has_value()) {


@@ 72,6 73,24 @@ namespace audio
        phase = Phase::Idle;
    }

    void VolumeFade::Pause()
    {
        timerHandle.stop();
        timeElapsed +=
            std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - timestamp);
    }

    void VolumeFade::Resume()
    {
        timestamp = std::chrono::system_clock::now();
        if (phase == Phase::Wait) {
            RestartWaitingTimer();
        }
        else {
            timerHandle.start();
        }
    }

    void VolumeFade::SetVolume(float volume)
    {
        if (IsFadePhaseActive()) {


@@ 82,7 101,9 @@ namespace audio
            if (setVolumeCallback != nullptr) {
                setVolumeCallback(currentVolume);
            }
            RestartWaitingTimer();
            if (IsActive()) {
                RestartWaitingTimer();
            }
        }
    }



@@ 158,8 179,8 @@ namespace audio
    void VolumeFade::RestartWaitingTimer()
    {
        const auto now         = std::chrono::system_clock::now();
        const auto timeElapsed = std::chrono::duration_cast<std::chrono::seconds>(now - timestamp);
        timerHandle.restart(calculateWaitingTimerPeriod(timeElapsed));
        const auto totalTimeElapsed = std::chrono::duration_cast<std::chrono::seconds>(timeElapsed + (now - timestamp));
        timerHandle.restart(calculateWaitingTimerPeriod(totalTimeElapsed));
    }

    std::chrono::milliseconds VolumeFade::calculateFadeInterval(std::chrono::seconds maxDuration)


@@ 173,7 194,7 @@ namespace audio
        return std::max(calculatedTime, minFadeInterval);
    }

    std::chrono::milliseconds VolumeFade::calculateWaitingTimerPeriod(std::chrono::seconds timeElapsed)
    std::chrono::milliseconds VolumeFade::calculateWaitingTimerPeriod(std::chrono::seconds totalTimeElapsed)
    {
        using floatToMs = std::chrono::duration<float, std::chrono::milliseconds::period>;
        if (!fadeParams.playbackDuration.has_value()) {


@@ 181,7 202,7 @@ namespace audio
        }
        const auto timeRequired   = floatToMs(currentVolume / fadeStep) * fadeInterval.count();
        const auto calculatedTime = std::chrono::duration_cast<std::chrono::milliseconds>(
            fadeParams.playbackDuration.value() - timeElapsed - timeRequired);
            fadeParams.playbackDuration.value() - totalTimeElapsed - timeRequired);
        return std::max(calculatedTime, minFadeInterval);
    }


M products/BellHybrid/services/audio/include/audio/VolumeFade.hpp => products/BellHybrid/services/audio/include/audio/VolumeFade.hpp +3 -0
@@ 19,6 19,8 @@ namespace audio
        void Start(float targetVolume, float minVolume, float maxVolume, audio::FadeParams fadeParams);
        void Restart();
        void Stop();
        void Pause();
        void Resume();
        void SetVolume(float volume);
        bool IsActive();



@@ 41,6 43,7 @@ namespace audio
        SetCallback setVolumeCallback;
        Phase phase{Phase::Idle};
        std::chrono::time_point<std::chrono::system_clock> timestamp;
        std::chrono::milliseconds timeElapsed;

        void PerformNextFadeStep();
        void RestartWaitingTimer();