From 2c17f41c61c2fcf2a64760e9ced26266de60b62b Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 17 Mar 2023 21:18:31 +0400 Subject: [PATCH] Beta version 4.6.12: Compare speed values safely. --- Telegram/SourceFiles/core/core_settings.h | 4 ++-- Telegram/SourceFiles/media/audio/media_audio.cpp | 3 ++- .../SourceFiles/media/audio/media_audio_ffmpeg_loader.cpp | 4 ++-- Telegram/SourceFiles/media/audio/media_audio_loaders.cpp | 5 +++-- Telegram/SourceFiles/media/media_common.h | 6 ++++++ Telegram/SourceFiles/media/player/media_player_button.cpp | 5 +++-- Telegram/SourceFiles/media/player/media_player_dropdown.cpp | 6 +++--- .../SourceFiles/media/streaming/media_streaming_instance.h | 2 +- .../SourceFiles/media/streaming/media_streaming_player.cpp | 2 +- .../SourceFiles/media/streaming/media_streaming_player.h | 2 +- 10 files changed, 24 insertions(+), 15 deletions(-) diff --git a/Telegram/SourceFiles/core/core_settings.h b/Telegram/SourceFiles/core/core_settings.h index a693c6748..111bf6c80 100644 --- a/Telegram/SourceFiles/core/core_settings.h +++ b/Telegram/SourceFiles/core/core_settings.h @@ -488,7 +488,7 @@ public: : 1.; } void setVideoPlaybackSpeed(float64 speed) { - if ((_videoPlaybackSpeed.enabled = (speed != 1.))) { + if ((_videoPlaybackSpeed.enabled = !Media::EqualSpeeds(speed, 1.))) { _videoPlaybackSpeed.value = speed; } } @@ -499,7 +499,7 @@ public: : 1.; } void setVoicePlaybackSpeed(float64 speed) { - if ((_voicePlaybackSpeed.enabled = (speed != 1.0))) { + if ((_voicePlaybackSpeed.enabled = !Media::EqualSpeeds(speed, 1.0))) { _voicePlaybackSpeed.value = speed; } } diff --git a/Telegram/SourceFiles/media/audio/media_audio.cpp b/Telegram/SourceFiles/media/audio/media_audio.cpp index 9c6e873a0..2fbe37665 100644 --- a/Telegram/SourceFiles/media/audio/media_audio.cpp +++ b/Telegram/SourceFiles/media/audio/media_audio.cpp @@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "media/audio/media_child_ffmpeg_loader.h" #include "media/audio/media_audio_loaders.h" #include "media/audio/media_audio_track.h" +#include "media/media_common.h" #include "media/streaming/media_streaming_utility.h" #include "webrtc/webrtc_media_devices.h" #include "data/data_document.h" @@ -800,7 +801,7 @@ void Mixer::setSpeedFromExternal(const AudioMsgId &audioId, float64 speed) { const auto track = trackForType(audioId.type()); if (track->state.id == audioId) { track->nextSpeed = speed; - if (track->speed != track->nextSpeed + if (!EqualSpeeds(track->speed, track->nextSpeed) && !IsStoppedOrStopping(track->state.state)) { track->loading = true; track->loaded = false; diff --git a/Telegram/SourceFiles/media/audio/media_audio_ffmpeg_loader.cpp b/Telegram/SourceFiles/media/audio/media_audio_ffmpeg_loader.cpp index 5f3fc7d41..bdfe863bd 100644 --- a/Telegram/SourceFiles/media/audio/media_audio_ffmpeg_loader.cpp +++ b/Telegram/SourceFiles/media/audio/media_audio_ffmpeg_loader.cpp @@ -542,7 +542,7 @@ bool AbstractAudioFFMpegLoader::ensureResampleSpaceAvailable(int samples) { bool AbstractAudioFFMpegLoader::changeSpeedFilter(float64 speed) { speed = std::clamp(speed, kSpeedMin, kSpeedMax); - if (_filterSpeed == speed) { + if (EqualSpeeds(_filterSpeed, speed)) { return false; } avfilter_graph_free(&_filterGraph); @@ -559,7 +559,7 @@ bool AbstractAudioFFMpegLoader::changeSpeedFilter(float64 speed) { void AbstractAudioFFMpegLoader::createSpeedFilter(float64 speed) { Expects(!_filterGraph); - if (speed == 1.) { + if (EqualSpeeds(speed, 1.)) { return; } const auto abuffer = avfilter_get_by_name("abuffer"); diff --git a/Telegram/SourceFiles/media/audio/media_audio_loaders.cpp b/Telegram/SourceFiles/media/audio/media_audio_loaders.cpp index 1f5dedd6e..5cff8167e 100644 --- a/Telegram/SourceFiles/media/audio/media_audio_loaders.cpp +++ b/Telegram/SourceFiles/media/audio/media_audio_loaders.cpp @@ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "media/audio/media_audio.h" #include "media/audio/media_audio_ffmpeg_loader.h" #include "media/audio/media_child_ffmpeg_loader.h" +#include "media/media_common.h" namespace Media { namespace Player { @@ -157,7 +158,7 @@ void Loaders::loadData(AudioMsgId audio, crl::time positionMs) { } const auto sampleSize = l->sampleSize(); - const auto speedChanged = (setup.newSpeed != setup.oldSpeed); + const auto speedChanged = !EqualSpeeds(setup.newSpeed, setup.oldSpeed); auto updatedWithSpeed = speedChanged ? rebufferOnSpeedChange(setup) : std::optional(); @@ -438,7 +439,7 @@ Loaders::SetupLoaderResult Loaders::setupLoader( track->state.length, track->speed); return { .loader = l, .justStarted = true }; - } else if (track->nextSpeed != track->speed) { + } else if (!EqualSpeeds(track->nextSpeed, track->speed)) { return { .loader = l, .oldSpeed = track->speed, diff --git a/Telegram/SourceFiles/media/media_common.h b/Telegram/SourceFiles/media/media_common.h index 73f99109f..c155a4084 100644 --- a/Telegram/SourceFiles/media/media_common.h +++ b/Telegram/SourceFiles/media/media_common.h @@ -7,6 +7,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once +#include "base/algorithm.h" + namespace Media { enum class RepeatMode { @@ -25,4 +27,8 @@ inline constexpr auto kSpeedMin = 0.5; inline constexpr auto kSpeedMax = 2.5; inline constexpr auto kSpedUpDefault = 1.7; +[[nodiscard]] inline bool EqualSpeeds(float64 a, float64 b) { + return int(base::SafeRound(a * 10.)) == int(base::SafeRound(b * 10.)); +} + } // namespace Media diff --git a/Telegram/SourceFiles/media/player/media_player_button.cpp b/Telegram/SourceFiles/media/player/media_player_button.cpp index 5951443c4..79691a4e7 100644 --- a/Telegram/SourceFiles/media/player/media_player_button.cpp +++ b/Telegram/SourceFiles/media/player/media_player_button.cpp @@ -7,6 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "media/player/media_player_button.h" +#include "media/media_common.h" #include "ui/effects/ripple_animation.h" #include "ui/painter.h" #include "styles/style_media_player.h" @@ -272,7 +273,7 @@ SpeedButtonLayout::SpeedButtonLayout( void SpeedButtonLayout::setSpeed(float64 speed) { speed = base::SafeRound(speed * 10.) / 10.; - if (_speed != speed) { + if (!EqualSpeeds(_speed, speed)) { _speed = speed; _text = SpeedText(_speed); _textWidth = _metrics.horizontalAdvance(_text); @@ -304,7 +305,7 @@ SpeedButton::SpeedButton(QWidget *parent, const style::MediaSpeedButton &st) } void SpeedButton::setSpeed(float64 speed, anim::type animated) { - _isDefault = (speed == 1.); + _isDefault = EqualSpeeds(speed, 1.); _layout.setSpeed(speed); update(); } diff --git a/Telegram/SourceFiles/media/player/media_player_dropdown.cpp b/Telegram/SourceFiles/media/player/media_player_dropdown.cpp index 732e63503..c00765cf8 100644 --- a/Telegram/SourceFiles/media/player/media_player_dropdown.cpp +++ b/Telegram/SourceFiles/media/player/media_player_dropdown.cpp @@ -130,7 +130,7 @@ SpeedSliderItem::SpeedSliderItem( _slider->setChangeProgressCallback([=](float64 value) { const auto speed = SliderValueToSpeed(value); - if (current() != speed) { + if (!EqualSpeeds(current(), speed)) { _last = speed; _changing.fire_copy(speed); _debounceTimer.callOnce(kSpeedDebounceTimeout); @@ -266,7 +266,7 @@ void FillSpeedMenu( check->setAttribute(Qt::WA_TransparentForMouseEvents); state->realtime.value( ) | rpl::start_with_next([=](float64 now) { - const auto chosen = (speed == now); + const auto chosen = EqualSpeeds(speed, now); const auto overriden = chosen ? iconActive : icon; raw->setIcon(overriden, overriden); raw->action()->setEnabled(!chosen); @@ -744,7 +744,7 @@ void SpeedController::toggleDefault() { } void SpeedController::setSpeed(float64 newSpeed) { - if (!(_isDefault = (newSpeed == 1.))) { + if (!(_isDefault = EqualSpeeds(newSpeed, 1.))) { _speed = newSpeed; } _speedChanged.fire(speed()); diff --git a/Telegram/SourceFiles/media/streaming/media_streaming_instance.h b/Telegram/SourceFiles/media/streaming/media_streaming_instance.h index c391244f9..126cf9db0 100644 --- a/Telegram/SourceFiles/media/streaming/media_streaming_instance.h +++ b/Telegram/SourceFiles/media/streaming/media_streaming_instance.h @@ -60,7 +60,7 @@ public: [[nodiscard]] bool paused() const; [[nodiscard]] float64 speed() const; - void setSpeed(float64 speed); // 0.5 <= speed <= 2. + void setSpeed(float64 speed); [[nodiscard]] bool waitingShown() const; [[nodiscard]] float64 waitingOpacity() const; diff --git a/Telegram/SourceFiles/media/streaming/media_streaming_player.cpp b/Telegram/SourceFiles/media/streaming/media_streaming_player.cpp index e2ca66cc1..6662ec862 100644 --- a/Telegram/SourceFiles/media/streaming/media_streaming_player.cpp +++ b/Telegram/SourceFiles/media/streaming/media_streaming_player.cpp @@ -834,7 +834,7 @@ void Player::setSpeed(float64 speed) { if (!Media::Audio::SupportsSpeedControl()) { speed = 1.; } - if (_options.speed != speed) { + if (!EqualSpeeds(_options.speed, speed)) { _options.speed = speed; if (active()) { if (_audio) { diff --git a/Telegram/SourceFiles/media/streaming/media_streaming_player.h b/Telegram/SourceFiles/media/streaming/media_streaming_player.h index 08ff3777a..148dc7a11 100644 --- a/Telegram/SourceFiles/media/streaming/media_streaming_player.h +++ b/Telegram/SourceFiles/media/streaming/media_streaming_player.h @@ -48,7 +48,7 @@ public: [[nodiscard]] bool ready() const; [[nodiscard]] float64 speed() const; - void setSpeed(float64 speed); // 0.5 <= speed <= 2. + void setSpeed(float64 speed); void setWaitForMarkAsShown(bool wait); [[nodiscard]] bool playing() const;