LibMedia: Remove WrapperTimeProvider in favor of diamond inheritance

This commit is contained in:
Zaggy1024 2026-04-25 18:21:16 -05:00 committed by Gregory Bertilson
parent dd626013b9
commit 5d761397da
6 changed files with 29 additions and 45 deletions

View file

@ -0,0 +1,18 @@
/*
* Copyright (c) 2026-present, the Ladybird developers.
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/AtomicRefCounted.h>
namespace Media {
class MediaPipelineNode : public AtomicRefCounted<MediaPipelineNode> {
public:
virtual ~MediaPipelineNode() = default;
};
}

View file

@ -11,7 +11,6 @@
#include <LibMedia/Providers/AudioDataProvider.h>
#include <LibMedia/Providers/GenericTimeProvider.h>
#include <LibMedia/Providers/VideoDataProvider.h>
#include <LibMedia/Providers/WrapperTimeProvider.h>
#include <LibMedia/Sinks/AudioMixingSink.h>
#include <LibMedia/Sinks/DisplayingVideoSink.h>
#include <LibMedia/Track.h>
@ -117,7 +116,7 @@ DecoderErrorOr<void> 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<WrapperTimeProvider<AudioMixingSink>>(*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;

View file

@ -6,12 +6,12 @@
#pragma once
#include <AK/AtomicRefCounted.h>
#include <AK/Time.h>
#include <LibMedia/MediaPipelineNode.h>
namespace Media {
class MediaTimeProvider : public AtomicRefCounted<MediaTimeProvider> {
class MediaTimeProvider : public virtual MediaPipelineNode {
public:
virtual ~MediaTimeProvider() = default;

View file

@ -1,31 +0,0 @@
/*
* Copyright (c) 2025, Gregory Bertilson <gregory@ladybird.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <LibMedia/Providers/MediaTimeProvider.h>
namespace Media {
template<typename T>
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<T> m_inner;
};
}

View file

@ -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<AudioDataProvider> const&) override;
virtual RefPtr<AudioDataProvider> 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);

View file

@ -6,15 +6,15 @@
#pragma once
#include <AK/AtomicRefCounted.h>
#include <LibMedia/AudioBlock.h>
#include <LibMedia/Export.h>
#include <LibMedia/Forward.h>
#include <LibMedia/MediaPipelineNode.h>
#include <LibMedia/Track.h>
namespace Media {
class MEDIA_API AudioSink : public AtomicRefCounted<AudioSink> {
class MEDIA_API AudioSink : public virtual MediaPipelineNode {
public:
virtual ~AudioSink() = default;