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.;
}
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;
}
}

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_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;

View File

@ -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");

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_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<Mixer::Track::WithSpeed>();
@ -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,

View File

@ -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

View File

@ -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();
}

View File

@ -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());

View File

@ -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;

View File

@ -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) {

View File

@ -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;