RemoteMediaSessionHelper.cpp [plain text]
#include "config.h"
#include "RemoteMediaSessionHelper.h"
#if ENABLE(GPU_PROCESS) && PLATFORM(IOS_FAMILY)
#include "Connection.h"
#include "GPUConnectionToWebProcessMessages.h"
#include "RemoteMediaSessionHelperMessages.h"
#include "RemoteMediaSessionHelperProxyMessages.h"
#include "WebProcess.h"
#include <WebCore/MediaPlaybackTargetCocoa.h>
#include <WebCore/MediaPlaybackTargetContext.h>
#include <WebCore/MediaPlaybackTargetMock.h>
namespace WebKit {
using namespace WebCore;
RemoteMediaSessionHelper::RemoteMediaSessionHelper(WebProcess& process)
: m_process(process)
{
connectToGPUProcess();
}
void RemoteMediaSessionHelper::connectToGPUProcess()
{
auto& gpuProcessConnection = m_process.ensureGPUProcessConnection();
gpuProcessConnection.addClient(*this);
gpuProcessConnection.messageReceiverMap().addMessageReceiver(Messages::RemoteMediaSessionHelper::messageReceiverName(), *this);
gpuProcessConnection.connection().send(Messages::GPUConnectionToWebProcess::EnsureMediaSessionHelper(), { });
}
IPC::Connection& RemoteMediaSessionHelper::connection()
{
return m_process.ensureGPUProcessConnection().connection();
}
void RemoteMediaSessionHelper::gpuProcessConnectionDidClose(GPUProcessConnection& gpuProcessConnection)
{
gpuProcessConnection.removeClient(*this);
gpuProcessConnection.messageReceiverMap().removeMessageReceiver(*this);
connectToGPUProcess();
}
void RemoteMediaSessionHelper::startMonitoringWirelessRoutes()
{
if (m_monitoringWirelessRoutesCount++)
return;
connection().send(Messages::RemoteMediaSessionHelperProxy::StartMonitoringWirelessRoutes(), { });
}
void RemoteMediaSessionHelper::stopMonitoringWirelessRoutes()
{
if (!m_monitoringWirelessRoutesCount) {
ASSERT_NOT_REACHED();
return;
}
if (--m_monitoringWirelessRoutesCount)
return;
connection().send(Messages::RemoteMediaSessionHelperProxy::StopMonitoringWirelessRoutes(), { });
}
void RemoteMediaSessionHelper::providePresentingApplicationPID(int pid)
{
connection().send(Messages::RemoteMediaSessionHelperProxy::ProvidePresentingApplicationPID(pid), { });
}
void RemoteMediaSessionHelper::applicationWillEnterForeground(SuspendedUnderLock suspendedUnderLock)
{
for (auto& client : m_clients)
client.applicationWillEnterForeground(suspendedUnderLock);
}
void RemoteMediaSessionHelper::applicationDidEnterBackground(SuspendedUnderLock suspendedUnderLock)
{
for (auto& client : m_clients)
client.applicationDidEnterBackground(suspendedUnderLock);
}
void RemoteMediaSessionHelper::applicationWillBecomeInactive()
{
for (auto& client : m_clients)
client.applicationWillBecomeInactive();
}
void RemoteMediaSessionHelper::applicationDidBecomeActive()
{
for (auto& client : m_clients)
client.applicationDidBecomeActive();
}
void RemoteMediaSessionHelper::externalOutputDeviceAvailableDidChange(HasAvailableTargets hasAvailableTargets)
{
for (auto& client : m_clients)
client.externalOutputDeviceAvailableDidChange(hasAvailableTargets);
}
void RemoteMediaSessionHelper::isPlayingToAutomotiveHeadUnitDidChange(PlayingToAutomotiveHeadUnit playingToAutomotiveHeadUnit)
{
for (auto& client : m_clients)
client.isPlayingToAutomotiveHeadUnitDidChange(playingToAutomotiveHeadUnit);
}
void RemoteMediaSessionHelper::activeAudioRouteDidChange(ShouldPause shouldPause)
{
for (auto& client : m_clients)
client.activeAudioRouteDidChange(shouldPause);
}
void RemoteMediaSessionHelper::activeVideoRouteDidChange(SupportsAirPlayVideo supportsAirPlayVideo, MediaPlaybackTargetContext&& targetContext)
{
RefPtr<MediaPlaybackTarget> targetObject;
if (targetContext.type() == MediaPlaybackTargetContext::AVOutputContextType)
targetObject = WebCore::MediaPlaybackTargetCocoa::create(targetContext.avOutputContext());
else {
ASSERT_NOT_REACHED();
return;
}
for (auto& client : m_clients)
client.activeVideoRouteDidChange(supportsAirPlayVideo, targetObject.copyRef().releaseNonNull());
}
}
#endif