Files
ladybird/Libraries/LibMedia/PlaybackStates/PlayingStateHandler.h
Aliaksandr Kalenik 3a56e9580a LibMedia: Add "buffering" playback state
`IncrementallyPopulatedStream::Cursor` now tracks whether it's currently
blocked inside a wait for more bytes, allowing higher layers to
distinguish "no frames yet" from "decoder is idle".

Enter buffering when `DisplayingVideoSink` runs out of frames and the
associated `VideoDataProvider` is blocked waiting for data to arrive.
Exit buffering once decoding refills the frame queue.

For now, buffering behaves like paused, but it gives us an explicit
state to hook UI into.
2025-12-16 02:42:48 -06:00

56 lines
1.2 KiB
C++

/*
* Copyright (c) 2025, Gregory Bertilson <zaggy1024@gmail.com>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <LibMedia/PlaybackManager.h>
#include <LibMedia/PlaybackStates/BufferingStateHandler.h>
#include <LibMedia/PlaybackStates/Forward.h>
#include <LibMedia/PlaybackStates/PausedStateHandler.h>
namespace Media {
class PlayingStateHandler final : public PlaybackStateHandler {
public:
PlayingStateHandler(PlaybackManager& manager)
: PlaybackStateHandler(manager)
{
}
virtual ~PlayingStateHandler() override = default;
virtual void on_enter() override
{
manager().m_time_provider->resume();
}
virtual void on_exit() override
{
manager().m_time_provider->pause();
}
virtual void play() override { }
virtual void pause() override
{
manager().replace_state_handler<PausedStateHandler>();
}
virtual bool is_playing() override
{
return true;
}
virtual PlaybackState state() override
{
return PlaybackState::Playing;
}
virtual void enter_buffering() override
{
manager().replace_state_handler<BufferingStateHandler>(true);
}
virtual void exit_buffering() override { }
};
}