diff --git a/Libraries/LibMedia/MediaPipelineNode.h b/Libraries/LibMedia/MediaPipelineNode.h new file mode 100644 index 0000000000..b58ada503c --- /dev/null +++ b/Libraries/LibMedia/MediaPipelineNode.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2026-present, the Ladybird developers. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace Media { + +class MediaPipelineNode : public AtomicRefCounted { +public: + virtual ~MediaPipelineNode() = default; +}; + +} diff --git a/Libraries/LibMedia/PlaybackManager.cpp b/Libraries/LibMedia/PlaybackManager.cpp index 0e13200a24..5c796e23e1 100644 --- a/Libraries/LibMedia/PlaybackManager.cpp +++ b/Libraries/LibMedia/PlaybackManager.cpp @@ -11,7 +11,6 @@ #include #include #include -#include #include #include #include @@ -117,7 +116,7 @@ DecoderErrorOr PlaybackManager::prepare_playback_from_demuxer(WeakPlayback if (!self->m_audio_output_disabled && !self->m_audio_sink && !self->m_audio_tracks.is_empty()) { self->m_audio_sink = MUST(AudioMixingSink::try_create()); - self->set_time_provider(make_ref_counted>(*self->m_audio_sink)); + self->set_time_provider(*self->m_audio_sink); self->m_audio_sink->on_audio_output_error = [self](Error&& error) { if (!self) return; diff --git a/Libraries/LibMedia/Providers/MediaTimeProvider.h b/Libraries/LibMedia/Providers/MediaTimeProvider.h index 5b276118b8..ee0f1a3308 100644 --- a/Libraries/LibMedia/Providers/MediaTimeProvider.h +++ b/Libraries/LibMedia/Providers/MediaTimeProvider.h @@ -6,12 +6,12 @@ #pragma once -#include #include +#include namespace Media { -class MediaTimeProvider : public AtomicRefCounted { +class MediaTimeProvider : public virtual MediaPipelineNode { public: virtual ~MediaTimeProvider() = default; diff --git a/Libraries/LibMedia/Providers/WrapperTimeProvider.h b/Libraries/LibMedia/Providers/WrapperTimeProvider.h deleted file mode 100644 index c817d38991..0000000000 --- a/Libraries/LibMedia/Providers/WrapperTimeProvider.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2025, Gregory Bertilson - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#pragma once - -#include - -namespace Media { - -template -class WrapperTimeProvider final : public MediaTimeProvider { -public: - WrapperTimeProvider(T& inner) - : m_inner(inner) - { - } - virtual ~WrapperTimeProvider() override = default; - - virtual AK::Duration current_time() const override { return m_inner->current_time(); } - virtual void resume() override { m_inner->resume(); } - virtual void pause() override { m_inner->pause(); } - virtual void set_time(AK::Duration time) override { m_inner->set_time(time); } - -private: - NonnullRefPtr m_inner; -}; - -} diff --git a/Libraries/LibMedia/Sinks/AudioMixingSink.h b/Libraries/LibMedia/Sinks/AudioMixingSink.h index 810279373f..213a13cadc 100644 --- a/Libraries/LibMedia/Sinks/AudioMixingSink.h +++ b/Libraries/LibMedia/Sinks/AudioMixingSink.h @@ -18,7 +18,8 @@ namespace Media { -class MEDIA_API AudioMixingSink final : public AudioSink { +class MEDIA_API AudioMixingSink final : public AudioSink + , public MediaTimeProvider { class AudioMixingSinkWeakReference; private: @@ -32,13 +33,10 @@ public: virtual void set_provider(Track const&, RefPtr const&) override; virtual RefPtr provider(Track const&) const override; - // This section implements the pure virtuals in MediaTimeProvider. - // AudioMixingSink cannot inherit from MediaTimeProvider, as AudioSink and MediaTimeProvider both inherit from - // AtomicRefCounted. In order to use AudioMixingSink as a MediaTimeProvider, wrap it with WrapperTimeProvider. - AK::Duration current_time() const; - void resume(); - void pause(); - void set_time(AK::Duration); + virtual AK::Duration current_time() const override; + virtual void resume() override; + virtual void pause() override; + virtual void set_time(AK::Duration) override; void set_volume(double); diff --git a/Libraries/LibMedia/Sinks/AudioSink.h b/Libraries/LibMedia/Sinks/AudioSink.h index d55cfc8a38..1d2b04a16e 100644 --- a/Libraries/LibMedia/Sinks/AudioSink.h +++ b/Libraries/LibMedia/Sinks/AudioSink.h @@ -6,15 +6,15 @@ #pragma once -#include #include #include #include +#include #include namespace Media { -class MEDIA_API AudioSink : public AtomicRefCounted { +class MEDIA_API AudioSink : public virtual MediaPipelineNode { public: virtual ~AudioSink() = default;