Beta version 4.6.12: Compare speed values safely.

This commit is contained in:
John Preston 2023-03-17 21:18:31 +04:00
parent 1f2836af59
commit 2c17f41c61
10 changed files with 24 additions and 15 deletions

View file

@ -488,7 +488,7 @@ public:
: 1.; : 1.;
} }
void setVideoPlaybackSpeed(float64 speed) { void setVideoPlaybackSpeed(float64 speed) {
if ((_videoPlaybackSpeed.enabled = (speed != 1.))) { if ((_videoPlaybackSpeed.enabled = !Media::EqualSpeeds(speed, 1.))) {
_videoPlaybackSpeed.value = speed; _videoPlaybackSpeed.value = speed;
} }
} }
@ -499,7 +499,7 @@ public:
: 1.; : 1.;
} }
void setVoicePlaybackSpeed(float64 speed) { void setVoicePlaybackSpeed(float64 speed) {
if ((_voicePlaybackSpeed.enabled = (speed != 1.0))) { if ((_voicePlaybackSpeed.enabled = !Media::EqualSpeeds(speed, 1.0))) {
_voicePlaybackSpeed.value = speed; _voicePlaybackSpeed.value = speed;
} }
} }

View file

@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "media/audio/media_child_ffmpeg_loader.h" #include "media/audio/media_child_ffmpeg_loader.h"
#include "media/audio/media_audio_loaders.h" #include "media/audio/media_audio_loaders.h"
#include "media/audio/media_audio_track.h" #include "media/audio/media_audio_track.h"
#include "media/media_common.h"
#include "media/streaming/media_streaming_utility.h" #include "media/streaming/media_streaming_utility.h"
#include "webrtc/webrtc_media_devices.h" #include "webrtc/webrtc_media_devices.h"
#include "data/data_document.h" #include "data/data_document.h"
@ -800,7 +801,7 @@ void Mixer::setSpeedFromExternal(const AudioMsgId &audioId, float64 speed) {
const auto track = trackForType(audioId.type()); const auto track = trackForType(audioId.type());
if (track->state.id == audioId) { if (track->state.id == audioId) {
track->nextSpeed = speed; track->nextSpeed = speed;
if (track->speed != track->nextSpeed if (!EqualSpeeds(track->speed, track->nextSpeed)
&& !IsStoppedOrStopping(track->state.state)) { && !IsStoppedOrStopping(track->state.state)) {
track->loading = true; track->loading = true;
track->loaded = false; track->loaded = false;

View file

@ -542,7 +542,7 @@ bool AbstractAudioFFMpegLoader::ensureResampleSpaceAvailable(int samples) {
bool AbstractAudioFFMpegLoader::changeSpeedFilter(float64 speed) { bool AbstractAudioFFMpegLoader::changeSpeedFilter(float64 speed) {
speed = std::clamp(speed, kSpeedMin, kSpeedMax); speed = std::clamp(speed, kSpeedMin, kSpeedMax);
if (_filterSpeed == speed) { if (EqualSpeeds(_filterSpeed, speed)) {
return false; return false;
} }
avfilter_graph_free(&_filterGraph); avfilter_graph_free(&_filterGraph);
@ -559,7 +559,7 @@ bool AbstractAudioFFMpegLoader::changeSpeedFilter(float64 speed) {
void AbstractAudioFFMpegLoader::createSpeedFilter(float64 speed) { void AbstractAudioFFMpegLoader::createSpeedFilter(float64 speed) {
Expects(!_filterGraph); Expects(!_filterGraph);
if (speed == 1.) { if (EqualSpeeds(speed, 1.)) {
return; return;
} }
const auto abuffer = avfilter_get_by_name("abuffer"); const auto abuffer = avfilter_get_by_name("abuffer");

View file

@ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "media/audio/media_audio.h" #include "media/audio/media_audio.h"
#include "media/audio/media_audio_ffmpeg_loader.h" #include "media/audio/media_audio_ffmpeg_loader.h"
#include "media/audio/media_child_ffmpeg_loader.h" #include "media/audio/media_child_ffmpeg_loader.h"
#include "media/media_common.h"
namespace Media { namespace Media {
namespace Player { namespace Player {
@ -157,7 +158,7 @@ void Loaders::loadData(AudioMsgId audio, crl::time positionMs) {
} }
const auto sampleSize = l->sampleSize(); const auto sampleSize = l->sampleSize();
const auto speedChanged = (setup.newSpeed != setup.oldSpeed); const auto speedChanged = !EqualSpeeds(setup.newSpeed, setup.oldSpeed);
auto updatedWithSpeed = speedChanged auto updatedWithSpeed = speedChanged
? rebufferOnSpeedChange(setup) ? rebufferOnSpeedChange(setup)
: std::optional<Mixer::Track::WithSpeed>(); : std::optional<Mixer::Track::WithSpeed>();
@ -438,7 +439,7 @@ Loaders::SetupLoaderResult Loaders::setupLoader(
track->state.length, track->state.length,
track->speed); track->speed);
return { .loader = l, .justStarted = true }; return { .loader = l, .justStarted = true };
} else if (track->nextSpeed != track->speed) { } else if (!EqualSpeeds(track->nextSpeed, track->speed)) {
return { return {
.loader = l, .loader = l,
.oldSpeed = track->speed, .oldSpeed = track->speed,

View file

@ -7,6 +7,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/ */
#pragma once #pragma once
#include "base/algorithm.h"
namespace Media { namespace Media {
enum class RepeatMode { enum class RepeatMode {
@ -25,4 +27,8 @@ inline constexpr auto kSpeedMin = 0.5;
inline constexpr auto kSpeedMax = 2.5; inline constexpr auto kSpeedMax = 2.5;
inline constexpr auto kSpedUpDefault = 1.7; 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 } // namespace Media

View file

@ -7,6 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/ */
#include "media/player/media_player_button.h" #include "media/player/media_player_button.h"
#include "media/media_common.h"
#include "ui/effects/ripple_animation.h" #include "ui/effects/ripple_animation.h"
#include "ui/painter.h" #include "ui/painter.h"
#include "styles/style_media_player.h" #include "styles/style_media_player.h"
@ -272,7 +273,7 @@ SpeedButtonLayout::SpeedButtonLayout(
void SpeedButtonLayout::setSpeed(float64 speed) { void SpeedButtonLayout::setSpeed(float64 speed) {
speed = base::SafeRound(speed * 10.) / 10.; speed = base::SafeRound(speed * 10.) / 10.;
if (_speed != speed) { if (!EqualSpeeds(_speed, speed)) {
_speed = speed; _speed = speed;
_text = SpeedText(_speed); _text = SpeedText(_speed);
_textWidth = _metrics.horizontalAdvance(_text); _textWidth = _metrics.horizontalAdvance(_text);
@ -304,7 +305,7 @@ SpeedButton::SpeedButton(QWidget *parent, const style::MediaSpeedButton &st)
} }
void SpeedButton::setSpeed(float64 speed, anim::type animated) { void SpeedButton::setSpeed(float64 speed, anim::type animated) {
_isDefault = (speed == 1.); _isDefault = EqualSpeeds(speed, 1.);
_layout.setSpeed(speed); _layout.setSpeed(speed);
update(); update();
} }

View file

@ -130,7 +130,7 @@ SpeedSliderItem::SpeedSliderItem(
_slider->setChangeProgressCallback([=](float64 value) { _slider->setChangeProgressCallback([=](float64 value) {
const auto speed = SliderValueToSpeed(value); const auto speed = SliderValueToSpeed(value);
if (current() != speed) { if (!EqualSpeeds(current(), speed)) {
_last = speed; _last = speed;
_changing.fire_copy(speed); _changing.fire_copy(speed);
_debounceTimer.callOnce(kSpeedDebounceTimeout); _debounceTimer.callOnce(kSpeedDebounceTimeout);
@ -266,7 +266,7 @@ void FillSpeedMenu(
check->setAttribute(Qt::WA_TransparentForMouseEvents); check->setAttribute(Qt::WA_TransparentForMouseEvents);
state->realtime.value( state->realtime.value(
) | rpl::start_with_next([=](float64 now) { ) | rpl::start_with_next([=](float64 now) {
const auto chosen = (speed == now); const auto chosen = EqualSpeeds(speed, now);
const auto overriden = chosen ? iconActive : icon; const auto overriden = chosen ? iconActive : icon;
raw->setIcon(overriden, overriden); raw->setIcon(overriden, overriden);
raw->action()->setEnabled(!chosen); raw->action()->setEnabled(!chosen);
@ -744,7 +744,7 @@ void SpeedController::toggleDefault() {
} }
void SpeedController::setSpeed(float64 newSpeed) { void SpeedController::setSpeed(float64 newSpeed) {
if (!(_isDefault = (newSpeed == 1.))) { if (!(_isDefault = EqualSpeeds(newSpeed, 1.))) {
_speed = newSpeed; _speed = newSpeed;
} }
_speedChanged.fire(speed()); _speedChanged.fire(speed());

View file

@ -60,7 +60,7 @@ public:
[[nodiscard]] bool paused() const; [[nodiscard]] bool paused() const;
[[nodiscard]] float64 speed() const; [[nodiscard]] float64 speed() const;
void setSpeed(float64 speed); // 0.5 <= speed <= 2. void setSpeed(float64 speed);
[[nodiscard]] bool waitingShown() const; [[nodiscard]] bool waitingShown() const;
[[nodiscard]] float64 waitingOpacity() const; [[nodiscard]] float64 waitingOpacity() const;

View file

@ -834,7 +834,7 @@ void Player::setSpeed(float64 speed) {
if (!Media::Audio::SupportsSpeedControl()) { if (!Media::Audio::SupportsSpeedControl()) {
speed = 1.; speed = 1.;
} }
if (_options.speed != speed) { if (!EqualSpeeds(_options.speed, speed)) {
_options.speed = speed; _options.speed = speed;
if (active()) { if (active()) {
if (_audio) { if (_audio) {

View file

@ -48,7 +48,7 @@ public:
[[nodiscard]] bool ready() const; [[nodiscard]] bool ready() const;
[[nodiscard]] float64 speed() const; [[nodiscard]] float64 speed() const;
void setSpeed(float64 speed); // 0.5 <= speed <= 2. void setSpeed(float64 speed);
void setWaitForMarkAsShown(bool wait); void setWaitForMarkAsShown(bool wait);
[[nodiscard]] bool playing() const; [[nodiscard]] bool playing() const;