ladybird/Libraries/LibMedia/GenericTimeProvider.cpp
Zaggy1024 7ddbc2d7dd LibWeb+LibMedia: Wire up setting the pipeline's playback rate
However, the playback rate is still limited to 1.0 at the element,
because audio stretching is not yet implemented.
2026-06-06 19:58:17 -05:00

60 lines
1.4 KiB
C++

/*
* Copyright (c) 2025, Gregory Bertilson <gregory@ladybird.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include "GenericTimeProvider.h"
namespace Media {
GenericTimeProvider::GenericTimeProvider() = default;
GenericTimeProvider::~GenericTimeProvider() = default;
AK::Duration GenericTimeProvider::current_time() const
{
auto time = m_media_time;
if (m_monotonic_time_on_resume.has_value()) {
auto elapsed = MonotonicTime::now() - m_monotonic_time_on_resume.value();
if (m_playback_rate != 1.0f)
elapsed = AK::Duration::from_seconds_f64(elapsed.to_seconds_f64() * m_playback_rate);
time += elapsed;
}
return time;
}
void GenericTimeProvider::resume()
{
m_monotonic_time_on_resume.emplace(MonotonicTime::now());
}
void GenericTimeProvider::pause()
{
if (!m_monotonic_time_on_resume.has_value())
return;
m_media_time = current_time();
m_monotonic_time_on_resume = {};
}
void GenericTimeProvider::seek(AK::Duration time)
{
if (m_monotonic_time_on_resume.has_value())
m_monotonic_time_on_resume.emplace(MonotonicTime::now());
m_media_time = time;
}
void GenericTimeProvider::set_playback_rate(float rate)
{
VERIFY(rate >= 0);
if (m_playback_rate == rate)
return;
if (m_monotonic_time_on_resume.has_value()) {
m_media_time = current_time();
m_monotonic_time_on_resume.emplace(MonotonicTime::now());
}
m_playback_rate = rate;
}
}