From f733611213ef77b1e3180ff6b982f5f0e20cd14e Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Wed, 4 Feb 2026 21:48:02 +0100 Subject: [PATCH] Fix various issues with audio and video playback #3716 --- .../Engine/Audio/OpenAL/AudioBackendOAL.cpp | 2 +- .../Audio/XAudio2/AudioBackendXAudio2.cpp | 4 ++-- Source/Engine/Video/MF/VideoBackendMF.cpp | 22 +++++++++---------- Source/Engine/Video/VideoPlayer.cpp | 4 +++- 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/Source/Engine/Audio/OpenAL/AudioBackendOAL.cpp b/Source/Engine/Audio/OpenAL/AudioBackendOAL.cpp index 86e828028..2891cec02 100644 --- a/Source/Engine/Audio/OpenAL/AudioBackendOAL.cpp +++ b/Source/Engine/Audio/OpenAL/AudioBackendOAL.cpp @@ -400,7 +400,7 @@ void AudioBackendOAL::Source_IsLoopingChanged(uint32 sourceID, bool loop) void AudioBackendOAL::Source_SpatialSetupChanged(uint32 sourceID, bool spatial, float attenuation, float minDistance, float doppler) { ALC::Locker.Lock(); - const bool pan = ALC::SourcesData[sourceID].Spatial; + const float pan = ALC::SourcesData[sourceID].Pan; ALC::Locker.Unlock(); if (spatial) { diff --git a/Source/Engine/Audio/XAudio2/AudioBackendXAudio2.cpp b/Source/Engine/Audio/XAudio2/AudioBackendXAudio2.cpp index 9600a93fb..6cba1302b 100644 --- a/Source/Engine/Audio/XAudio2/AudioBackendXAudio2.cpp +++ b/Source/Engine/Audio/XAudio2/AudioBackendXAudio2.cpp @@ -672,7 +672,7 @@ bool AudioBackendXAudio2::Base_Init() HRESULT hr = XAudio2Create(&XAudio2::Instance, 0, XAUDIO2_DEFAULT_PROCESSOR); if (FAILED(hr)) { - LOG(Error, "Failed to initalize XAudio2. Error: 0x{0:x}", hr); + LOG(Error, "Failed to initialize XAudio2. Error: 0x{0:x}", hr); return true; } XAudio2::Instance->RegisterForCallbacks(&XAudio2::Callback); @@ -681,7 +681,7 @@ bool AudioBackendXAudio2::Base_Init() hr = XAudio2::Instance->CreateMasteringVoice(&XAudio2::MasteringVoice); if (FAILED(hr)) { - LOG(Error, "Failed to initalize XAudio2 mastering voice. Error: 0x{0:x}", hr); + LOG(Error, "Failed to initialize XAudio2 mastering voice. Error: 0x{0:x}", hr); return true; } XAUDIO2_VOICE_DETAILS details; diff --git a/Source/Engine/Video/MF/VideoBackendMF.cpp b/Source/Engine/Video/MF/VideoBackendMF.cpp index df24f5eed..3e738d09f 100644 --- a/Source/Engine/Video/MF/VideoBackendMF.cpp +++ b/Source/Engine/Video/MF/VideoBackendMF.cpp @@ -47,6 +47,8 @@ struct VideoPlayerMF namespace MF { Array Players; + TimeSpan UpdateDeltaTime; + double UpdateTime; bool Configure(VideoBackendPlayer& player, VideoPlayerMF& playerMF, DWORD streamIndex) { @@ -395,13 +397,6 @@ namespace MF if (!playerMF.Playing && !playerMF.Seek) return; - bool useTimeScale = true; -#if USE_EDITOR - if (!Editor::IsPlayMode) - useTimeScale = false; -#endif - TimeSpan dt = useTimeScale ? Time::Update.DeltaTime : Time::Update.UnscaledDeltaTime; - // Update playback time if (playerMF.FirstFrame) { @@ -410,9 +405,9 @@ namespace MF } else if (playerMF.Playing) { - playerMF.Time += dt; + playerMF.Time += UpdateDeltaTime; } - if (playerMF.Time > player.Duration) + if (playerMF.Time > player.Duration && player.Duration.Ticks != 0) { if (playerMF.Loop) { @@ -452,7 +447,7 @@ namespace MF } // Update streams - if (ReadStream(player, playerMF, MF_SOURCE_READER_FIRST_VIDEO_STREAM, dt)) + if (ReadStream(player, playerMF, MF_SOURCE_READER_FIRST_VIDEO_STREAM, UpdateDeltaTime)) { // Failed to pick a valid sample so try again with seeking playerMF.Seek = 1; @@ -464,7 +459,7 @@ namespace MF } } if (player.AudioInfo.BitDepth != 0) - ReadStream(player, playerMF, MF_SOURCE_READER_FIRST_AUDIO_STREAM, dt); + ReadStream(player, playerMF, MF_SOURCE_READER_FIRST_AUDIO_STREAM, UpdateDeltaTime); player.Tick(); } @@ -610,12 +605,17 @@ bool VideoBackendMF::Base_Init() VIDEO_API_MF_ERROR(MFStartup, hr); return true; } + MF::UpdateTime = Platform::GetTimeSeconds(); return false; } void VideoBackendMF::Base_Update(TaskGraph* graph) { + double time = Platform::GetTimeSeconds(); + MF::UpdateDeltaTime = TimeSpan::FromSeconds(time - MF::UpdateTime); + MF::UpdateTime = time; + // Schedule work to update all videos in async Function job; job.Bind(MF::UpdatePlayer); diff --git a/Source/Engine/Video/VideoPlayer.cpp b/Source/Engine/Video/VideoPlayer.cpp index 59f8d2438..363779038 100644 --- a/Source/Engine/Video/VideoPlayer.cpp +++ b/Source/Engine/Video/VideoPlayer.cpp @@ -133,7 +133,9 @@ void VideoPlayer::SetTime(float time) if (_state == States::Stopped || _player.Backend == nullptr) return; TimeSpan timeSpan = TimeSpan::FromSeconds(time); - timeSpan.Ticks = Math::Clamp(timeSpan.Ticks, 0, _player.Duration.Ticks); + timeSpan.Ticks = Math::Max(timeSpan.Ticks, 0); + if (_player.Duration.Ticks > 0) + timeSpan.Ticks = Math::Min(timeSpan.Ticks, _player.Duration.Ticks); _player.Backend->Player_Seek(_player, timeSpan); }