From ff1606ffafc636562b39b31cb6515f556754abfd Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Wed, 14 Jun 2023 10:12:46 -0400 Subject: [PATCH] LibWeb: Implement seeking for audio tracks --- Userland/Libraries/LibWeb/HTML/AudioTrack.cpp | 11 +++++++++++ Userland/Libraries/LibWeb/HTML/AudioTrack.h | 1 + Userland/Libraries/LibWeb/HTML/HTMLAudioElement.cpp | 7 +++++++ Userland/Libraries/LibWeb/HTML/HTMLAudioElement.h | 1 + 4 files changed, 20 insertions(+) diff --git a/Userland/Libraries/LibWeb/HTML/AudioTrack.cpp b/Userland/Libraries/LibWeb/HTML/AudioTrack.cpp index c816be4490..9f6db1f22f 100644 --- a/Userland/Libraries/LibWeb/HTML/AudioTrack.cpp +++ b/Userland/Libraries/LibWeb/HTML/AudioTrack.cpp @@ -89,6 +89,17 @@ Duration AudioTrack::duration() const return Duration::from_milliseconds(static_cast(duration * 1000.0)); } +void AudioTrack::seek(double position, MediaSeekMode seek_mode) +{ + // FIXME: Implement seeking mode. + (void)seek_mode; + + auto duration = static_cast(this->duration().to_milliseconds()) / 1000.0; + position = position / duration * static_cast(m_loader->total_samples()); + + m_loader->seek(position).release_value_but_fixme_should_propagate_errors(); +} + void AudioTrack::visit_edges(Cell::Visitor& visitor) { Base::visit_edges(visitor); diff --git a/Userland/Libraries/LibWeb/HTML/AudioTrack.h b/Userland/Libraries/LibWeb/HTML/AudioTrack.h index 82efba881a..844b579ad1 100644 --- a/Userland/Libraries/LibWeb/HTML/AudioTrack.h +++ b/Userland/Libraries/LibWeb/HTML/AudioTrack.h @@ -26,6 +26,7 @@ public: Duration position() const; Duration duration() const; + void seek(double, MediaSeekMode); String const& id() const { return m_id; } String const& kind() const { return m_kind; } diff --git a/Userland/Libraries/LibWeb/HTML/HTMLAudioElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLAudioElement.cpp index 2c4d6e0357..b2bb0ba0a2 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLAudioElement.cpp +++ b/Userland/Libraries/LibWeb/HTML/HTMLAudioElement.cpp @@ -56,4 +56,11 @@ void HTMLAudioElement::on_paused() }); } +void HTMLAudioElement::on_seek(double position, MediaSeekMode seek_mode) +{ + audio_tracks()->for_each_enabled_track([&](auto& audio_track) { + audio_track.seek(position, seek_mode); + }); +} + } diff --git a/Userland/Libraries/LibWeb/HTML/HTMLAudioElement.h b/Userland/Libraries/LibWeb/HTML/HTMLAudioElement.h index b383e1a609..08d0c92153 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLAudioElement.h +++ b/Userland/Libraries/LibWeb/HTML/HTMLAudioElement.h @@ -28,6 +28,7 @@ private: virtual void on_playing() override; virtual void on_paused() override; + virtual void on_seek(double, MediaSeekMode) override; }; }