PlatformMediaSession.h [plain text]
#ifndef PlatformMediaSession_h
#define PlatformMediaSession_h
#include "MediaProducer.h"
#include "Timer.h"
#include <wtf/Noncopyable.h>
#include <wtf/text/WTFString.h>
#if ENABLE(WIRELESS_PLAYBACK_TARGET)
#include "MediaPlaybackTargetClient.h"
#endif
namespace WebCore {
class Document;
class MediaPlaybackTarget;
class PlatformMediaSessionClient;
class PlatformMediaSession
#if ENABLE(WIRELESS_PLAYBACK_TARGET)
: public MediaPlaybackTargetClient
#endif
{
public:
static std::unique_ptr<PlatformMediaSession> create(PlatformMediaSessionClient&);
PlatformMediaSession(PlatformMediaSessionClient&);
virtual ~PlatformMediaSession();
enum MediaType {
None = 0,
Video,
Audio,
WebAudio,
};
MediaType mediaType() const;
MediaType presentationType() const;
enum State {
Idle,
Playing,
Paused,
Interrupted,
};
State state() const { return m_state; }
void setState(State);
enum InterruptionType {
SystemSleep,
EnteringBackground,
SystemInterruption,
SuspendedUnderLock,
};
enum EndInterruptionFlags {
NoFlags = 0,
MayResumePlaying = 1 << 0,
};
void beginInterruption(InterruptionType);
void endInterruption(EndInterruptionFlags);
bool clientWillBeginPlayback();
bool clientWillPausePlayback();
void pauseSession();
void visibilityChanged();
String title() const;
double duration() const;
double currentTime() const;
enum RemoteControlCommandType {
NoCommand,
PlayCommand,
PauseCommand,
StopCommand,
TogglePlayPauseCommand,
BeginSeekingBackwardCommand,
EndSeekingBackwardCommand,
BeginSeekingForwardCommand,
EndSeekingForwardCommand,
};
bool canReceiveRemoteControlCommands() const;
void didReceiveRemoteControlCommand(RemoteControlCommandType);
enum DisplayType {
Normal,
Fullscreen,
Optimized,
};
DisplayType displayType() const;
bool isHidden() const;
virtual bool canPlayToWirelessPlaybackTarget() const { return false; }
virtual bool isPlayingToWirelessPlaybackTarget() const { return m_isPlayingToWirelessPlaybackTarget; }
void isPlayingToWirelessPlaybackTargetChanged(bool);
#if ENABLE(WIRELESS_PLAYBACK_TARGET)
virtual void setPlaybackTarget(Ref<MediaPlaybackTarget>&&) override { }
virtual void externalOutputDeviceAvailableDidChange(bool) override { }
virtual void setShouldPlayToPlaybackTarget(bool) override { }
#endif
#if PLATFORM(IOS)
virtual bool requiresPlaybackTargetRouteMonitoring() const { return false; }
#endif
protected:
PlatformMediaSessionClient& client() const { return m_client; }
private:
void clientDataBufferingTimerFired();
void updateClientDataBuffering();
PlatformMediaSessionClient& m_client;
Timer m_clientDataBufferingTimer;
State m_state;
State m_stateToRestore;
int m_interruptionCount { 0 };
bool m_notifyingClient;
bool m_isPlayingToWirelessPlaybackTarget { false };
friend class PlatformMediaSessionManager;
};
class PlatformMediaSessionClient {
WTF_MAKE_NONCOPYABLE(PlatformMediaSessionClient);
public:
PlatformMediaSessionClient() { }
virtual PlatformMediaSession::MediaType mediaType() const = 0;
virtual PlatformMediaSession::MediaType presentationType() const = 0;
virtual PlatformMediaSession::DisplayType displayType() const { return PlatformMediaSession::Normal; }
virtual void mayResumePlayback(bool shouldResume) = 0;
virtual void suspendPlayback() = 0;
virtual String mediaSessionTitle() const;
virtual double mediaSessionDuration() const;
virtual double mediaSessionCurrentTime() const;
virtual bool canReceiveRemoteControlCommands() const = 0;
virtual void didReceiveRemoteControlCommand(PlatformMediaSession::RemoteControlCommandType) = 0;
virtual void setShouldBufferData(bool) { }
virtual bool elementIsHidden() const { return false; }
virtual bool shouldOverrideBackgroundPlaybackRestriction(PlatformMediaSession::InterruptionType) const = 0;
virtual void wirelessRoutesAvailableDidChange() { }
virtual void setWirelessPlaybackTarget(Ref<MediaPlaybackTarget>&&) { }
virtual bool canPlayToWirelessPlaybackTarget() const { return false; }
virtual bool isPlayingToWirelessPlaybackTarget() const { return false; }
virtual void setShouldPlayToPlaybackTarget(bool) { }
virtual const Document* hostingDocument() const = 0;
protected:
virtual ~PlatformMediaSessionClient() { }
};
}
#endif // PlatformMediaSession_h