Title: [253705] trunk
Revision
253705
Author
you...@apple.com
Date
2019-12-18 11:40:07 -0800 (Wed, 18 Dec 2019)

Log Message

Add support for Audio Capture in GPUProcess
https://bugs.webkit.org/show_bug.cgi?id=205056

Reviewed by Eric Carlson.

Source/WebCore:

Export some WebCore headers.
Allow disabling the audio session debug assert in the GPU process.
No change of behavior.

* WebCore.xcodeproj/project.pbxproj:
* platform/mediastream/mac/BaseAudioSharedUnit.cpp:
(WebCore::BaseAudioSharedUnit::startUnit):
* platform/mediastream/mac/BaseAudioSharedUnit.h:
(WebCore::BaseAudioSharedUnit::setDisableAudioSessionCheck):
* platform/mediastream/mac/MockAudioSharedUnit.h:

Source/WebKit:

Make UserMediaCaptureManager and Proxy able to work with GPU process.
Add support for capturing audio in the GPU process, this is limited to mock audio sources for now
as we do not support AudioSession in the GPU process.
Covered by rebased test.

* GPUProcess/GPUConnectionToWebProcess.cpp:
(WebKit::GPUConnectionToWebProcess::GPUConnectionToWebProcess):
(WebKit::GPUConnectionToWebProcess::didReceiveMessage):
(WebKit::GPUConnectionToWebProcess::didReceiveSyncMessage):
* GPUProcess/GPUConnectionToWebProcess.h:
* GPUProcess/GPUProcess.cpp:
(WebKit::GPUProcess::setMockCaptureDevicesEnabled):
* GPUProcess/GPUProcess.h:
* GPUProcess/GPUProcess.messages.in:
* UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp:
(WebKit::UserMediaCaptureManagerProxy::UserMediaCaptureManagerProxy):
(WebKit::UserMediaCaptureManagerProxy::~UserMediaCaptureManagerProxy):
(WebKit::UserMediaCaptureManagerProxy::createMediaSourceForCaptureDeviceWithConstraints):
(WebKit::UserMediaCaptureManagerProxy::applyConstraints):
(WebKit::UserMediaCaptureManagerProxy::clone):
* UIProcess/Cocoa/UserMediaCaptureManagerProxy.h:
(WebKit::UserMediaCaptureManagerProxy::didReceiveMessageFromGPUProcess):
(WebKit::UserMediaCaptureManagerProxy::didReceiveSyncMessageFromGPUProcess):
* UIProcess/UserMediaPermissionRequestManagerProxy.cpp:
(WebKit::UserMediaPermissionRequestManagerProxy::syncWithWebCorePrefs const):
* UIProcess/WebProcessPool.h:
* UIProcess/WebProcessProxy.cpp:
* WebProcess/GPU/GPUProcessConnection.cpp:
(WebKit::GPUProcessConnection::didReceiveMessage):
* WebProcess/GPU/GPUProcessConnection.h:
* WebProcess/cocoa/UserMediaCaptureManager.cpp:
(WebKit::UserMediaCaptureManager::Source::setShouldCaptureInGPUProcess):
(WebKit::UserMediaCaptureManager::Source::shouldCaptureInGPUProcess const):
(WebKit::UserMediaCaptureManager::Source::requestToEnd):
(WebKit::UserMediaCaptureManager::createCaptureSource):
(WebKit::UserMediaCaptureManager::sourceStopped):
(WebKit::UserMediaCaptureManager::captureFailed):
(WebKit::UserMediaCaptureManager::Source::connection):
(WebKit::UserMediaCaptureManager::Source::startProducingData):
(WebKit::UserMediaCaptureManager::Source::stopProducingData):
(WebKit::UserMediaCaptureManager::Source::capabilities):
(WebKit::UserMediaCaptureManager::Source::applyConstraints):
(WebKit::UserMediaCaptureManager::sourceEnded):
(WebKit::UserMediaCaptureManager::Source::hasEnded):
(WebKit::UserMediaCaptureManager::Source::stopBeingObserved):
(WebKit::UserMediaCaptureManager::AudioFactory::createAudioCaptureSource):
* WebProcess/cocoa/UserMediaCaptureManager.h:
(WebKit::UserMediaCaptureManager::didReceiveMessageFromGPUProcess):

LayoutTests:

* fast/mediastream/captureAudioInGPUProcess-expected.txt:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (253704 => 253705)


--- trunk/LayoutTests/ChangeLog	2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/LayoutTests/ChangeLog	2019-12-18 19:40:07 UTC (rev 253705)
@@ -1,3 +1,12 @@
+2019-12-18  youenn fablet  <you...@apple.com>
+
+        Add support for Audio Capture in GPUProcess
+        https://bugs.webkit.org/show_bug.cgi?id=205056
+
+        Reviewed by Eric Carlson.
+
+        * fast/mediastream/captureAudioInGPUProcess-expected.txt:
+
 2019-12-18  Chris Dumez  <cdu...@apple.com>
 
         Unreviewed, rebaseline all service workers tests and unskip 2 that no longer time out.

Modified: trunk/LayoutTests/fast/mediastream/captureAudioInGPUProcess-expected.txt (253704 => 253705)


--- trunk/LayoutTests/fast/mediastream/captureAudioInGPUProcess-expected.txt	2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/LayoutTests/fast/mediastream/captureAudioInGPUProcess-expected.txt	2019-12-18 19:40:07 UTC (rev 253705)
@@ -1,5 +1,4 @@
-CONSOLE MESSAGE: Failed to create MediaStream audio source: Audio capture in GPUProcess is not implemented
 
 
-FAIL Play audio captured in GPU process promise_test: Unhandled rejection with value: object "NotReadableError: The I/O read operation failed."
+PASS Play audio captured in GPU process 
 

Modified: trunk/Source/WebCore/ChangeLog (253704 => 253705)


--- trunk/Source/WebCore/ChangeLog	2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebCore/ChangeLog	2019-12-18 19:40:07 UTC (rev 253705)
@@ -1,3 +1,21 @@
+2019-12-18  youenn fablet  <you...@apple.com>
+
+        Add support for Audio Capture in GPUProcess
+        https://bugs.webkit.org/show_bug.cgi?id=205056
+
+        Reviewed by Eric Carlson.
+
+        Export some WebCore headers.
+        Allow disabling the audio session debug assert in the GPU process.
+        No change of behavior.
+
+        * WebCore.xcodeproj/project.pbxproj:
+        * platform/mediastream/mac/BaseAudioSharedUnit.cpp:
+        (WebCore::BaseAudioSharedUnit::startUnit):
+        * platform/mediastream/mac/BaseAudioSharedUnit.h:
+        (WebCore::BaseAudioSharedUnit::setDisableAudioSessionCheck):
+        * platform/mediastream/mac/MockAudioSharedUnit.h:
+
 2019-12-18  Eric Carlson  <eric.carl...@apple.com>
 
         Remove unused MediaPlayer methods

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (253704 => 253705)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2019-12-18 19:40:07 UTC (rev 253705)
@@ -1051,6 +1051,8 @@
 		4129C9AB1F59C573009D7403 /* ReadableStreamSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 418C395B1C8F0A610051C8A3 /* ReadableStreamSource.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		4129C9AF1F59CF5B009D7403 /* ReadableStreamSink.h in Headers */ = {isa = PBXBuildFile; fileRef = 4129C9801F5861C7009D7403 /* ReadableStreamSink.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		412DE4B8219285C00075F3A7 /* RTCRtpCapabilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 412DE4B6219285BF0075F3A7 /* RTCRtpCapabilities.h */; };
+		412DEF1D23A9186600D840F6 /* MockAudioSharedUnit.h in Headers */ = {isa = PBXBuildFile; fileRef = 0744ECEB1E0C4AE5000D0944 /* MockAudioSharedUnit.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		412DEF1F23A918A300D840F6 /* BaseAudioSharedUnit.h in Headers */ = {isa = PBXBuildFile; fileRef = 4177F51E2382545E00C04486 /* BaseAudioSharedUnit.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		4133CB8B20F80E9900E89B11 /* MediaStreamAudioSourceCocoa.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4133CB8920F80E8600E89B11 /* MediaStreamAudioSourceCocoa.cpp */; };
 		4136C57A2398E5BE002497D3 /* InternalsMapLike.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4136C5782398E5B5002497D3 /* InternalsMapLike.cpp */; };
 		4136C57C2398ECCF002497D3 /* JSInternalsMapLike.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2D6F3E921C1F85550061DBD6 /* JSInternalsMapLike.cpp */; };
@@ -29112,6 +29114,7 @@
 				51A1B87D2087C4C000979A75 /* BackForwardItemIdentifier.h in Headers */,
 				BC124EE80C2641CD009E2349 /* BarProp.h in Headers */,
 				460BB6161D0A1BF000221812 /* Base64Utilities.h in Headers */,
+				412DEF1F23A918A300D840F6 /* BaseAudioSharedUnit.h in Headers */,
 				379E61CA126CA5C400B63E8D /* BaseButtonInputType.h in Headers */,
 				379E61CC126CA5C400B63E8D /* BaseCheckableInputType.h in Headers */,
 				F5E0C65C1643C42C00D6CB69 /* BaseChooserOnlyDateAndTimeInputType.h in Headers */,
@@ -31491,6 +31494,7 @@
 				53B895AF19DC7ED9009CAA93 /* Microtasks.h in Headers */,
 				BC772C4F0C4EB3040083285F /* MIMETypeRegistry.h in Headers */,
 				52F10866162B6DA8009AC81E /* MixedContentChecker.h in Headers */,
+				412DEF1D23A9186600D840F6 /* MockAudioSharedUnit.h in Headers */,
 				CDF2B0111820540600F2B424 /* MockBox.h in Headers */,
 				CDF4B7241E03BF8100E235A2 /* MockCDMFactory.h in Headers */,
 				CDF4B7201E03BF6F00E235A2 /* MockCDMFactory.idl in Headers */,

Modified: trunk/Source/WebCore/platform/mediastream/mac/BaseAudioSharedUnit.cpp (253704 => 253705)


--- trunk/Source/WebCore/platform/mediastream/mac/BaseAudioSharedUnit.cpp	2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebCore/platform/mediastream/mac/BaseAudioSharedUnit.cpp	2019-12-18 19:40:07 UTC (rev 253705)
@@ -93,8 +93,10 @@
 OSStatus BaseAudioSharedUnit::startUnit()
 {
 #if PLATFORM(IOS_FAMILY)
-    PlatformMediaSessionManager::sharedManager().sessionCanProduceAudioChanged();
-    ASSERT(AudioSession::sharedSession().category() == AudioSession::PlayAndRecord);
+    if (!m_disableAudioSessionCheck) {
+        PlatformMediaSessionManager::sharedManager().sessionCanProduceAudioChanged();
+        ASSERT(AudioSession::sharedSession().category() == AudioSession::PlayAndRecord);
+    }
 #endif
 
     if (auto error = startInternal()) {

Modified: trunk/Source/WebCore/platform/mediastream/mac/BaseAudioSharedUnit.h (253704 => 253705)


--- trunk/Source/WebCore/platform/mediastream/mac/BaseAudioSharedUnit.h	2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebCore/platform/mediastream/mac/BaseAudioSharedUnit.h	2019-12-18 19:40:07 UTC (rev 253705)
@@ -76,6 +76,8 @@
 
     virtual CapabilityValueOrRange sampleRateCapacities() const = 0;
 
+    void setDisableAudioSessionCheck(bool value) { m_disableAudioSessionCheck = value; };
+
 protected:
     void forEachClient(const Function<void(CoreAudioCaptureSource&)>&) const;
     bool hasClients() const { return !m_clients.isEmpty(); }
@@ -103,6 +105,7 @@
 
     HashSet<CoreAudioCaptureSource*> m_clients;
     mutable RecursiveLock m_clientsLock;
+    bool m_disableAudioSessionCheck { false };
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/platform/mediastream/mac/MockAudioSharedUnit.h (253704 => 253705)


--- trunk/Source/WebCore/platform/mediastream/mac/MockAudioSharedUnit.h	2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebCore/platform/mediastream/mac/MockAudioSharedUnit.h	2019-12-18 19:40:07 UTC (rev 253705)
@@ -44,7 +44,7 @@
 
 class MockAudioSharedUnit final : public BaseAudioSharedUnit {
 public:
-    static MockAudioSharedUnit& singleton();
+    WEBCORE_EXPORT static MockAudioSharedUnit& singleton();
     MockAudioSharedUnit();
 
 private:

Modified: trunk/Source/WebKit/ChangeLog (253704 => 253705)


--- trunk/Source/WebKit/ChangeLog	2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebKit/ChangeLog	2019-12-18 19:40:07 UTC (rev 253705)
@@ -1,3 +1,59 @@
+2019-12-18  youenn fablet  <you...@apple.com>
+
+        Add support for Audio Capture in GPUProcess
+        https://bugs.webkit.org/show_bug.cgi?id=205056
+
+        Reviewed by Eric Carlson.
+
+        Make UserMediaCaptureManager and Proxy able to work with GPU process.
+        Add support for capturing audio in the GPU process, this is limited to mock audio sources for now
+        as we do not support AudioSession in the GPU process.
+        Covered by rebased test.
+
+        * GPUProcess/GPUConnectionToWebProcess.cpp:
+        (WebKit::GPUConnectionToWebProcess::GPUConnectionToWebProcess):
+        (WebKit::GPUConnectionToWebProcess::didReceiveMessage):
+        (WebKit::GPUConnectionToWebProcess::didReceiveSyncMessage):
+        * GPUProcess/GPUConnectionToWebProcess.h:
+        * GPUProcess/GPUProcess.cpp:
+        (WebKit::GPUProcess::setMockCaptureDevicesEnabled):
+        * GPUProcess/GPUProcess.h:
+        * GPUProcess/GPUProcess.messages.in:
+        * UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp:
+        (WebKit::UserMediaCaptureManagerProxy::UserMediaCaptureManagerProxy):
+        (WebKit::UserMediaCaptureManagerProxy::~UserMediaCaptureManagerProxy):
+        (WebKit::UserMediaCaptureManagerProxy::createMediaSourceForCaptureDeviceWithConstraints):
+        (WebKit::UserMediaCaptureManagerProxy::applyConstraints):
+        (WebKit::UserMediaCaptureManagerProxy::clone):
+        * UIProcess/Cocoa/UserMediaCaptureManagerProxy.h:
+        (WebKit::UserMediaCaptureManagerProxy::didReceiveMessageFromGPUProcess):
+        (WebKit::UserMediaCaptureManagerProxy::didReceiveSyncMessageFromGPUProcess):
+        * UIProcess/UserMediaPermissionRequestManagerProxy.cpp:
+        (WebKit::UserMediaPermissionRequestManagerProxy::syncWithWebCorePrefs const):
+        * UIProcess/WebProcessPool.h:
+        * UIProcess/WebProcessProxy.cpp:
+        * WebProcess/GPU/GPUProcessConnection.cpp:
+        (WebKit::GPUProcessConnection::didReceiveMessage):
+        * WebProcess/GPU/GPUProcessConnection.h:
+        * WebProcess/cocoa/UserMediaCaptureManager.cpp:
+        (WebKit::UserMediaCaptureManager::Source::setShouldCaptureInGPUProcess):
+        (WebKit::UserMediaCaptureManager::Source::shouldCaptureInGPUProcess const):
+        (WebKit::UserMediaCaptureManager::Source::requestToEnd):
+        (WebKit::UserMediaCaptureManager::createCaptureSource):
+        (WebKit::UserMediaCaptureManager::sourceStopped):
+        (WebKit::UserMediaCaptureManager::captureFailed):
+        (WebKit::UserMediaCaptureManager::Source::connection):
+        (WebKit::UserMediaCaptureManager::Source::startProducingData):
+        (WebKit::UserMediaCaptureManager::Source::stopProducingData):
+        (WebKit::UserMediaCaptureManager::Source::capabilities):
+        (WebKit::UserMediaCaptureManager::Source::applyConstraints):
+        (WebKit::UserMediaCaptureManager::sourceEnded):
+        (WebKit::UserMediaCaptureManager::Source::hasEnded):
+        (WebKit::UserMediaCaptureManager::Source::stopBeingObserved):
+        (WebKit::UserMediaCaptureManager::AudioFactory::createAudioCaptureSource):
+        * WebProcess/cocoa/UserMediaCaptureManager.h:
+        (WebKit::UserMediaCaptureManager::didReceiveMessageFromGPUProcess):
+
 2019-12-18  Ben Nham  <n...@apple.com>
 
         Add network loading signposts

Modified: trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp (253704 => 253705)


--- trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp	2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp	2019-12-18 19:40:07 UTC (rev 253705)
@@ -38,13 +38,35 @@
 #include "RemoteMediaPlayerManagerProxy.h"
 #include "RemoteMediaPlayerManagerProxyMessages.h"
 #include "RemoteScrollingCoordinatorTransaction.h"
+#include "UserMediaCaptureManagerProxy.h"
+#include "UserMediaCaptureManagerProxyMessages.h"
 #include "WebCoreArgumentCoders.h"
 #include "WebErrors.h"
 #include "WebProcessMessages.h"
 
+#include <WebCore/MockRealtimeMediaSourceCenter.h>
+
 namespace WebKit {
 using namespace WebCore;
 
+#if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
+class GPUProxyForCapture final : public UserMediaCaptureManagerProxy::ConnectionProxy {
+    WTF_MAKE_FAST_ALLOCATED;
+public:
+    explicit GPUProxyForCapture(GPUConnectionToWebProcess& process)
+        : m_process(process)
+    {
+    }
+
+private:
+    void addMessageReceiver(IPC::StringReference messageReceiverName, IPC::MessageReceiver& receiver) final { }
+    void removeMessageReceiver(IPC::StringReference messageReceiverName) final { }
+    IPC::Connection& connection() final { return m_process.connection(); }
+
+    GPUConnectionToWebProcess& m_process;
+};
+#endif
+
 Ref<GPUConnectionToWebProcess> GPUConnectionToWebProcess::create(GPUProcess& gpuProcess, WebCore::ProcessIdentifier webProcessIdentifier, IPC::Connection::Identifier connectionIdentifier)
 {
     return adoptRef(*new GPUConnectionToWebProcess(gpuProcess, webProcessIdentifier, connectionIdentifier));
@@ -84,6 +106,16 @@
     return *m_remoteMediaPlayerManagerProxy;
 }
 
+#if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
+UserMediaCaptureManagerProxy& GPUConnectionToWebProcess::userMediaCaptureManagerProxy()
+{
+    if (!m_userMediaCaptureManagerProxy)
+        m_userMediaCaptureManagerProxy = makeUnique<UserMediaCaptureManagerProxy>(makeUniqueRef<GPUProxyForCapture>(*this));
+
+    return *m_userMediaCaptureManagerProxy;
+}
+#endif
+
 void GPUConnectionToWebProcess::didReceiveMessage(IPC::Connection& connection, IPC::Decoder& decoder)
 {
     if (decoder.messageReceiverName() == Messages::RemoteMediaPlayerManagerProxy::messageReceiverName()) {
@@ -90,6 +122,12 @@
         remoteMediaPlayerManagerProxy().didReceiveMessageFromWebProcess(connection, decoder);
         return;
     }
+#if ENABLE(MEDIA_STREAM)
+    if (decoder.messageReceiverName() == Messages::UserMediaCaptureManagerProxy::messageReceiverName()) {
+        userMediaCaptureManagerProxy().didReceiveMessageFromGPUProcess(connection, decoder);
+        return;
+    }
+#endif
 }
 
 void GPUConnectionToWebProcess::didReceiveSyncMessage(IPC::Connection& connection, IPC::Decoder& decoder, std::unique_ptr<IPC::Encoder>& replyEncoder)
@@ -99,6 +137,13 @@
         return;
     }
 
+#if ENABLE(MEDIA_STREAM)
+    if (decoder.messageReceiverName() == Messages::UserMediaCaptureManagerProxy::messageReceiverName()) {
+        userMediaCaptureManagerProxy().didReceiveSyncMessageFromGPUProcess(connection, decoder, replyEncoder);
+        return;
+    }
+#endif
+
     ASSERT_NOT_REACHED();
 }
 

Modified: trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h (253704 => 253705)


--- trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h	2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h	2019-12-18 19:40:07 UTC (rev 253705)
@@ -38,6 +38,7 @@
 
 class GPUProcess;
 class RemoteMediaPlayerManagerProxy;
+class UserMediaCaptureManagerProxy;
 
 class GPUConnectionToWebProcess
     : public RefCounted<GPUConnectionToWebProcess>
@@ -58,17 +59,23 @@
     GPUConnectionToWebProcess(GPUProcess&, WebCore::ProcessIdentifier, IPC::Connection::Identifier);
 
     RemoteMediaPlayerManagerProxy& remoteMediaPlayerManagerProxy();
+#if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
+    UserMediaCaptureManagerProxy& userMediaCaptureManagerProxy();
+#endif
 
     // IPC::Connection::Client
-    void didClose(IPC::Connection&) override;
-    void didReceiveInvalidMessage(IPC::Connection&, IPC::StringReference messageReceiverName, IPC::StringReference messageName) override;
-    void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
-    void didReceiveSyncMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&) override;
+    void didClose(IPC::Connection&) final;
+    void didReceiveInvalidMessage(IPC::Connection&, IPC::StringReference messageReceiverName, IPC::StringReference messageName) final;
+    void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;
+    void didReceiveSyncMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&) final;
 
     Ref<IPC::Connection> m_connection;
     Ref<GPUProcess> m_gpuProcess;
     const WebCore::ProcessIdentifier m_webProcessIdentifier;
     std::unique_ptr<RemoteMediaPlayerManagerProxy> m_remoteMediaPlayerManagerProxy;
+#if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
+    std::unique_ptr<UserMediaCaptureManagerProxy> m_userMediaCaptureManagerProxy;
+#endif
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/GPUProcess/GPUProcess.cpp (253704 => 253705)


--- trunk/Source/WebKit/GPUProcess/GPUProcess.cpp	2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebKit/GPUProcess/GPUProcess.cpp	2019-12-18 19:40:07 UTC (rev 253705)
@@ -38,6 +38,7 @@
 #include "WebPageProxyMessages.h"
 #include "WebProcessPoolMessages.h"
 #include <WebCore/LogInitialization.h>
+#include <WebCore/MockAudioSharedUnit.h>
 #include <wtf/Algorithms.h>
 #include <wtf/CallbackAggregator.h>
 #include <wtf/OptionSet.h>
@@ -136,6 +137,15 @@
     return m_webProcessConnections.get(identifier);
 }
 
+#if ENABLE(MEDIA_STREAM)
+void GPUProcess::setMockCaptureDevicesEnabled(bool isEnabled)
+{
+    // FIXME: Enable the audio session check by implementing an AudioSession for the GPUProcess.
+    MockAudioSharedUnit::singleton().setDisableAudioSessionCheck(isEnabled);
+    MockRealtimeMediaSourceCenter::setMockRealtimeMediaSourceCenterEnabled(isEnabled);
+}
+#endif
+
 } // namespace WebKit
 
 #endif // ENABLE(GPU_PROCESS)

Modified: trunk/Source/WebKit/GPUProcess/GPUProcess.h (253704 => 253705)


--- trunk/Source/WebKit/GPUProcess/GPUProcess.h	2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebKit/GPUProcess/GPUProcess.h	2019-12-18 19:40:07 UTC (rev 253705)
@@ -41,7 +41,7 @@
 class GPUProcess : public AuxiliaryProcess, public ThreadSafeRefCounted<GPUProcess>, public CanMakeWeakPtr<GPUProcess> {
     WTF_MAKE_NONCOPYABLE(GPUProcess);
 public:
-    GPUProcess(AuxiliaryProcessInitializationParameters&&);
+    explicit GPUProcess(AuxiliaryProcessInitializationParameters&&);
     ~GPUProcess();
     static constexpr ProcessType processType = ProcessType::GPU;
 
@@ -74,7 +74,9 @@
 
     void processDidTransitionToForeground();
     void processDidTransitionToBackground();
-
+#if ENABLE(MEDIA_STREAM)
+    void setMockCaptureDevicesEnabled(bool);
+#endif
     // Connections to WebProcesses.
     HashMap<WebCore::ProcessIdentifier, Ref<GPUConnectionToWebProcess>> m_webProcessConnections;
 };

Modified: trunk/Source/WebKit/GPUProcess/GPUProcess.messages.in (253704 => 253705)


--- trunk/Source/WebKit/GPUProcess/GPUProcess.messages.in	2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebKit/GPUProcess/GPUProcess.messages.in	2019-12-18 19:40:07 UTC (rev 253705)
@@ -31,6 +31,10 @@
 
     ProcessDidTransitionToForeground()
     ProcessDidTransitionToBackground()
+
+#if ENABLE(MEDIA_STREAM)
+    SetMockCaptureDevicesEnabled(bool isEnabled)
+#endif
 }
 
 #endif // ENABLE(GPU_PROCESS)

Modified: trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp (253704 => 253705)


--- trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp	2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp	2019-12-18 19:40:07 UTC (rev 253705)
@@ -40,7 +40,7 @@
 #include <WebCore/WebAudioBufferList.h>
 #include <wtf/UniqueRef.h>
 
-#define MESSAGE_CHECK_CONTEXTID(identifier) MESSAGE_CHECK_BASE(m_proxies.isValidKey(identifier), m_process.connection())
+#define MESSAGE_CHECK_CONTEXTID(identifier) MESSAGE_CHECK_BASE(m_proxies.isValidKey(identifier), &m_connectionProxy->connection())
 
 namespace WebKit {
 using namespace WebCore;
@@ -155,15 +155,15 @@
     bool m_isEnded { false };
 };
 
-UserMediaCaptureManagerProxy::UserMediaCaptureManagerProxy(WebProcessProxy& process)
-    : m_process(process)
+UserMediaCaptureManagerProxy::UserMediaCaptureManagerProxy(UniqueRef<ConnectionProxy>&& connectionProxy)
+    : m_connectionProxy(WTFMove(connectionProxy))
 {
-    m_process.addMessageReceiver(Messages::UserMediaCaptureManagerProxy::messageReceiverName(), *this);
+    m_connectionProxy->addMessageReceiver(Messages::UserMediaCaptureManagerProxy::messageReceiverName(), *this);
 }
 
 UserMediaCaptureManagerProxy::~UserMediaCaptureManagerProxy()
 {
-    m_process.removeMessageReceiver(Messages::UserMediaCaptureManagerProxy::messageReceiverName());
+    m_connectionProxy->removeMessageReceiver(Messages::UserMediaCaptureManagerProxy::messageReceiverName());
 }
 
 void UserMediaCaptureManagerProxy::createMediaSourceForCaptureDeviceWithConstraints(uint64_t id, const CaptureDevice& device, String&& hashSalt, const MediaConstraints& constraints, CompletionHandler<void(bool succeeded, String invalidConstraints, WebCore::RealtimeMediaSourceSettings&&)>&& completionHandler)
@@ -196,7 +196,7 @@
         auto source = sourceOrError.source();
         settings = source->settings();
         ASSERT(!m_proxies.contains(id));
-        m_proxies.add(id, makeUnique<SourceProxy>(id, *m_process.connection(), WTFMove(source)));
+        m_proxies.add(id, makeUnique<SourceProxy>(id, m_connectionProxy->connection(), WTFMove(source)));
     } else
         invalidConstraints = WTFMove(sourceOrError.errorMessage);
     completionHandler(succeeded, invalidConstraints, WTFMove(settings));
@@ -248,9 +248,9 @@
     auto& source = proxy->source();
     auto result = source.applyConstraints(constraints);
     if (!result)
-        m_process.send(Messages::UserMediaCaptureManager::ApplyConstraintsSucceeded(id, source.settings()), 0);
+        m_connectionProxy->connection().send(Messages::UserMediaCaptureManager::ApplyConstraintsSucceeded(id, source.settings()), 0);
     else
-        m_process.send(Messages::UserMediaCaptureManager::ApplyConstraintsFailed(id, result->badConstraint, result->message), 0);
+        m_connectionProxy->connection().send(Messages::UserMediaCaptureManager::ApplyConstraintsFailed(id, result->badConstraint, result->message), 0);
 }
 
 void UserMediaCaptureManagerProxy::clone(uint64_t clonedID, uint64_t newSourceID)
@@ -258,7 +258,7 @@
     ASSERT(m_proxies.contains(clonedID));
     ASSERT(!m_proxies.contains(newSourceID));
     if (auto* proxy = m_proxies.get(clonedID))
-        m_proxies.add(newSourceID, makeUnique<SourceProxy>(newSourceID, *m_process.connection(), proxy->source().clone()));
+        m_proxies.add(newSourceID, makeUnique<SourceProxy>(newSourceID, m_connectionProxy->connection(), proxy->source().clone()));
 }
 
 void UserMediaCaptureManagerProxy::requestToEnd(uint64_t sourceID)

Modified: trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.h (253704 => 253705)


--- trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.h	2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.h	2019-12-18 19:40:07 UTC (rev 253705)
@@ -32,6 +32,7 @@
 #include "UserMediaCaptureManager.h"
 #include <WebCore/OrientationNotifier.h>
 #include <WebCore/RealtimeMediaSource.h>
+#include <wtf/UniqueRef.h>
 
 namespace WebKit {
 
@@ -41,14 +42,23 @@
 class UserMediaCaptureManagerProxy : private IPC::MessageReceiver {
     WTF_MAKE_FAST_ALLOCATED;
 public:
-    explicit UserMediaCaptureManagerProxy(WebProcessProxy&);
+    class ConnectionProxy {
+    public:
+        virtual ~ConnectionProxy() = default;
+        virtual void addMessageReceiver(IPC::StringReference, IPC::MessageReceiver&) = 0;
+        virtual void removeMessageReceiver(IPC::StringReference) = 0;
+        virtual IPC::Connection& connection() = 0;
+    };
+    explicit UserMediaCaptureManagerProxy(UniqueRef<ConnectionProxy>&&);
     ~UserMediaCaptureManagerProxy();
 
-    WebProcessProxy& process() const { return m_process; }
     void clear();
 
     void setOrientation(uint64_t);
 
+    void didReceiveMessageFromGPUProcess(IPC::Connection& connection, IPC::Decoder& decoder) { didReceiveMessage(connection, decoder); }
+    void didReceiveSyncMessageFromGPUProcess(IPC::Connection& connection, IPC::Decoder& decoder, std::unique_ptr<IPC::Encoder>& encoder) { didReceiveSyncMessage(connection, decoder, encoder); }
+
 private:
     // IPC::MessageReceiver
     void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;
@@ -67,7 +77,7 @@
     class SourceProxy;
     friend class SourceProxy;
     HashMap<uint64_t, std::unique_ptr<SourceProxy>> m_proxies;
-    WebProcessProxy& m_process;
+    UniqueRef<ConnectionProxy> m_connectionProxy;
     WebCore::OrientationNotifier m_orientationNotifier { 0 };
 };
 

Modified: trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp (253704 => 253705)


--- trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp	2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp	2019-12-18 19:40:07 UTC (rev 253705)
@@ -40,6 +40,11 @@
 #include <WebCore/UserMediaRequest.h>
 #include <wtf/Scope.h>
 
+#if ENABLE(GPU_PROCESS)
+#include "GPUProcessMessages.h"
+#include "GPUProcessProxy.h"
+#endif
+
 namespace WebKit {
 using namespace WebCore;
 
@@ -699,8 +704,14 @@
     // Enable/disable the mock capture devices for the UI process as per the WebCore preferences. Note that
     // this is a noop if the preference hasn't changed since the last time this was called.
     bool mockDevicesEnabled = m_mockDevicesEnabledOverride ? *m_mockDevicesEnabledOverride : m_page.preferences().mockCaptureDevicesEnabled();
+    if (MockRealtimeMediaSourceCenter::mockRealtimeMediaSourceCenterEnabled() == mockDevicesEnabled)
+        return;
     MockRealtimeMediaSourceCenter::setMockRealtimeMediaSourceCenterEnabled(mockDevicesEnabled);
+#if ENABLE(GPU_PROCESS)
+    if (m_page.preferences().captureAudioInGPUProcessEnabled())
+        GPUProcessProxy::singleton().send(Messages::GPUProcess::SetMockCaptureDevicesEnabled { mockDevicesEnabled }, 0);
 #endif
+#endif
 }
 
 void UserMediaPermissionRequestManagerProxy::captureStateChanged(MediaProducer::MediaStateFlags oldState, MediaProducer::MediaStateFlags newState)

Modified: trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp (253704 => 253705)


--- trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp	2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp	2019-12-18 19:40:07 UTC (rev 253705)
@@ -150,6 +150,20 @@
 }
 #endif
 
+#if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
+class UIProxyForCapture final : public UserMediaCaptureManagerProxy::ConnectionProxy {
+    WTF_MAKE_FAST_ALLOCATED;
+public:
+    explicit UIProxyForCapture(WebProcessProxy& process) : m_process(process) { }
+private:
+    void addMessageReceiver(IPC::StringReference messageReceiverName, IPC::MessageReceiver& receiver) final { m_process.addMessageReceiver(messageReceiverName, receiver); }
+    void removeMessageReceiver(IPC::StringReference messageReceiverName) final { m_process.removeMessageReceiver(messageReceiverName); }
+    IPC::Connection& connection() final { return *m_process.connection(); }
+
+    WebProcessProxy& m_process;
+};
+#endif
+
 WebProcessProxy::WebProcessProxy(WebProcessPool& processPool, WebsiteDataStore* websiteDataStore, IsPrewarmed isPrewarmed)
     : AuxiliaryProcessProxy(processPool.alwaysRunsAtBackgroundPriority())
     , m_responsivenessTimer(*this)
@@ -162,7 +176,7 @@
     , m_visiblePageCounter([this](RefCounterEvent) { updateBackgroundResponsivenessTimer(); })
     , m_websiteDataStore(websiteDataStore)
 #if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
-    , m_userMediaCaptureManagerProxy(makeUnique<UserMediaCaptureManagerProxy>(*this))
+    , m_userMediaCaptureManagerProxy(makeUnique<UserMediaCaptureManagerProxy>(makeUniqueRef<UIProxyForCapture>(*this)))
 #endif
     , m_isPrewarmed(isPrewarmed == IsPrewarmed::Yes)
 {

Modified: trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.cpp (253704 => 253705)


--- trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.cpp	2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.cpp	2019-12-18 19:40:07 UTC (rev 253705)
@@ -32,6 +32,8 @@
 #include "GPUConnectionToWebProcessMessages.h"
 #include "RemoteMediaPlayerManager.h"
 #include "RemoteMediaPlayerManagerMessages.h"
+#include "UserMediaCaptureManager.h"
+#include "UserMediaCaptureManagerMessages.h"
 #include "WebCoreArgumentCoders.h"
 #include "WebPage.h"
 #include "WebPageMessages.h"
@@ -66,6 +68,13 @@
         WebProcess::singleton().supplement<RemoteMediaPlayerManager>()->didReceiveMessageFromWebProcess(connection, decoder);
         return;
     }
+#if ENABLE(MEDIA_STREAM)
+    if (decoder.messageReceiverName() == Messages::UserMediaCaptureManager::messageReceiverName()) {
+        if (auto* captureManager = WebProcess::singleton().supplement<UserMediaCaptureManager>())
+            captureManager->didReceiveMessageFromGPUProcess(connection, decoder);
+        return;
+    }
+#endif
 }
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.h (253704 => 253705)


--- trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.h	2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.h	2019-12-18 19:40:07 UTC (rev 253705)
@@ -52,7 +52,7 @@
 
     // IPC::Connection::Client
     void didClose(IPC::Connection&) override;
-    void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
+    void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;
     void didReceiveInvalidMessage(IPC::Connection&, IPC::StringReference messageReceiverName, IPC::StringReference messageName) override;
 
     // The connection from a web process to this GPU process.

Modified: trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp (253704 => 253705)


--- trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp	2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp	2019-12-18 19:40:07 UTC (rev 253705)
@@ -28,6 +28,7 @@
 
 #if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
 
+#include  "GPUProcessConnection.h"
 #include "SharedRingBufferStorage.h"
 #include "UserMediaCaptureManagerMessages.h"
 #include "UserMediaCaptureManagerProxyMessages.h"
@@ -125,12 +126,7 @@
         return m_settings;
     }
 
-    const RealtimeMediaSourceCapabilities& capabilities() final
-    {
-        if (!m_capabilities)
-            m_capabilities = m_manager.capabilities(m_id);
-        return m_capabilities.value();
-    }
+    const RealtimeMediaSourceCapabilities& capabilities() final;
 
     const RealtimeMediaSourceSettings& settings() final { return m_settings; }
     void setSettings(RealtimeMediaSourceSettings&& settings)
@@ -216,32 +212,27 @@
 
     CaptureDevice::DeviceType deviceType() const final { return m_deviceType; }
 
+    void setShouldCaptureInGPUProcess(bool value) { m_shouldCaptureInGPUProcess = value; }
+    bool shouldCaptureInGPUProcess() const { return m_shouldCaptureInGPUProcess; }
+
+    IPC::Connection* connection();
+
+    void hasEnded() final;
+
 private:
-    void startProducingData() final { m_manager.startProducingData(m_id); }
-    void stopProducingData() final { m_manager.stopProducingData(m_id); }
+    void startProducingData() final;
+    void stopProducingData() final;
     bool isCaptureSource() const final { return true; }
 
     // RealtimeMediaSource
     void beginConfiguration() final { }
     void commitConfiguration() final { }
-    void hasEnded() final { m_manager.sourceEnded(m_id); }
 
-    void applyConstraints(const WebCore::MediaConstraints& constraints, ApplyConstraintsHandler&& completionHandler) final
-    {
-        m_manager.applyConstraints(m_id, constraints);
-        m_pendingApplyConstraintsCallbacks.append(WTFMove(completionHandler));
-    }
+    void applyConstraints(const WebCore::MediaConstraints&, ApplyConstraintsHandler&&) final;
 
-    void requestToEnd(RealtimeMediaSource::Observer&)
-    {
-        m_manager.requestToEnd(m_id);
-    }
+    void requestToEnd(RealtimeMediaSource::Observer&) { stopBeingObserved(); }
+    void stopBeingObserved();
 
-    void stopBeingObserved()
-    {
-        m_manager.requestToEnd(m_id);
-    }
-
     uint64_t m_id;
     UserMediaCaptureManager& m_manager;
     mutable Optional<RealtimeMediaSourceCapabilities> m_capabilities;
@@ -254,6 +245,7 @@
     CaptureDevice::DeviceType m_deviceType { CaptureDevice::DeviceType::Unknown };
 
     Deque<ApplyConstraintsHandler> m_pendingApplyConstraintsCallbacks;
+    bool m_shouldCaptureInGPUProcess { false };
 };
 
 UserMediaCaptureManager::UserMediaCaptureManager(WebProcess& process)
@@ -293,7 +285,7 @@
         RealtimeMediaSourceCenter::singleton().setDisplayCaptureFactory(m_displayFactory);
 }
 
-WebCore::CaptureSourceOrError UserMediaCaptureManager::createCaptureSource(const CaptureDevice& device, String&& hashSalt, const WebCore::MediaConstraints* constraints)
+WebCore::CaptureSourceOrError UserMediaCaptureManager::createCaptureSource(const CaptureDevice& device, String&& hashSalt, const WebCore::MediaConstraints* constraints, bool shouldCaptureInGPUProcess)
 {
     if (!constraints)
         return { };
@@ -302,11 +294,22 @@
     RealtimeMediaSourceSettings settings;
     String errorMessage;
     bool succeeded;
-    if (!m_process.sendSync(Messages::UserMediaCaptureManagerProxy::CreateMediaSourceForCaptureDeviceWithConstraints(id, device, hashSalt, *constraints), Messages::UserMediaCaptureManagerProxy::CreateMediaSourceForCaptureDeviceWithConstraints::Reply(succeeded, errorMessage, settings), 0))
+#if ENABLE(GPU_PROCESS)
+    auto* connection = shouldCaptureInGPUProcess ? &m_process.ensureGPUProcessConnection().connection() : m_process.parentProcessConnection();
+#else
+    ASSERT(!shouldCaptureInGPUProcess);
+    auto* connection = m_process.parentProcessConnection();
+#endif
+    if (!connection->sendSync(Messages::UserMediaCaptureManagerProxy::CreateMediaSourceForCaptureDeviceWithConstraints(id, device, hashSalt, *constraints), Messages::UserMediaCaptureManagerProxy::CreateMediaSourceForCaptureDeviceWithConstraints::Reply(succeeded, errorMessage, settings), 0))
         return WTFMove(errorMessage);
 
+    if (!succeeded)
+        return WTFMove(errorMessage);
+
     auto type = device.type() == CaptureDevice::DeviceType::Microphone ? WebCore::RealtimeMediaSource::Type::Audio : WebCore::RealtimeMediaSource::Type::Video;
     auto source = adoptRef(*new Source(String::number(id), type, device.type(), String { settings.label().string() }, WTFMove(hashSalt), id, *this));
+    if (shouldCaptureInGPUProcess)
+        source->setShouldCaptureInGPUProcess(shouldCaptureInGPUProcess);
     source->setSettings(WTFMove(settings));
     m_sources.add(id, source.copyRef());
     return WebCore::CaptureSourceOrError(WTFMove(source));
@@ -316,7 +319,7 @@
 {
     if (auto source = m_sources.get(id)) {
         source->stop();
-        sourceEnded(id);
+        source->hasEnded();
     }
 }
 
@@ -324,7 +327,7 @@
 {
     if (auto source = m_sources.get(id)) {
         source->captureFailed();
-        sourceEnded(id);
+        source->hasEnded();
     }
 }
 
@@ -373,39 +376,53 @@
 }
 #endif
 
-void UserMediaCaptureManager::startProducingData(uint64_t id)
+IPC::Connection* UserMediaCaptureManager::Source::connection()
 {
-    m_process.send(Messages::UserMediaCaptureManagerProxy::StartProducingData(id), 0);
+#if ENABLE(GPU_PROCESS)
+    return m_shouldCaptureInGPUProcess ? &WebProcess::singleton().ensureGPUProcessConnection().connection() : WebProcess::singleton().parentProcessConnection();
+#else
+    return m_process.parentProcessConnection();
+#endif
 }
 
-void UserMediaCaptureManager::stopProducingData(uint64_t id)
+void UserMediaCaptureManager::Source::startProducingData()
 {
-    m_process.send(Messages::UserMediaCaptureManagerProxy::StopProducingData(id), 0);
+    connection()->send(Messages::UserMediaCaptureManagerProxy::StartProducingData(m_id), 0);
 }
 
-WebCore::RealtimeMediaSourceCapabilities UserMediaCaptureManager::capabilities(uint64_t id)
+void UserMediaCaptureManager::Source::stopProducingData()
 {
-    WebCore::RealtimeMediaSourceCapabilities capabilities;
-    m_process.sendSync(Messages::UserMediaCaptureManagerProxy::Capabilities(id), Messages::UserMediaCaptureManagerProxy::Capabilities::Reply(capabilities), 0);
-    return capabilities;
+    connection()->send(Messages::UserMediaCaptureManagerProxy::StopProducingData(m_id), 0);
 }
 
-void UserMediaCaptureManager::setMuted(uint64_t id, bool muted)
+const WebCore::RealtimeMediaSourceCapabilities& UserMediaCaptureManager::Source::capabilities()
 {
-    m_process.send(Messages::UserMediaCaptureManagerProxy::SetMuted(id, muted), 0);
+    if (!m_capabilities) {
+        RealtimeMediaSourceCapabilities capabilities;
+        connection()->sendSync(Messages::UserMediaCaptureManagerProxy::Capabilities { m_id }, Messages::UserMediaCaptureManagerProxy::Capabilities::Reply(capabilities), 0);
+        m_capabilities = WTFMove(capabilities);
+    }
+
+    return m_capabilities.value();
 }
 
-void UserMediaCaptureManager::applyConstraints(uint64_t id, const WebCore::MediaConstraints& constraints)
+void UserMediaCaptureManager::Source::applyConstraints(const WebCore::MediaConstraints& constraints, ApplyConstraintsHandler&& completionHandler)
 {
-    m_process.send(Messages::UserMediaCaptureManagerProxy::ApplyConstraints(id, constraints), 0);
+    m_pendingApplyConstraintsCallbacks.append(WTFMove(completionHandler));
+    connection()->send(Messages::UserMediaCaptureManagerProxy::ApplyConstraints(m_id, constraints), 0);
 }
 
 void UserMediaCaptureManager::sourceEnded(uint64_t id)
 {
-    m_process.send(Messages::UserMediaCaptureManagerProxy::End(id), 0);
     m_sources.remove(id);
 }
 
+void UserMediaCaptureManager::Source::hasEnded()
+{
+    connection()->send(Messages::UserMediaCaptureManagerProxy::End { m_id }, 0);
+    m_manager.sourceEnded(m_id);
+}
+
 void UserMediaCaptureManager::applyConstraintsSucceeded(uint64_t id, const WebCore::RealtimeMediaSourceSettings& settings)
 {
     if (auto source = m_sources.get(id))
@@ -444,15 +461,20 @@
     return cloneSource;
 }
 
-void UserMediaCaptureManager::requestToEnd(uint64_t sourceID)
+void UserMediaCaptureManager::Source::stopBeingObserved()
 {
-    m_process.send(Messages::UserMediaCaptureManagerProxy::RequestToEnd { sourceID }, 0);
+    connection()->send(Messages::UserMediaCaptureManagerProxy::RequestToEnd { m_id }, 0);
 }
 
 CaptureSourceOrError UserMediaCaptureManager::AudioFactory::createAudioCaptureSource(const CaptureDevice& device, String&& hashSalt, const MediaConstraints* constraints)
 {
-    if (m_shouldCaptureInGPUProcess)
+    if (m_shouldCaptureInGPUProcess) {
+#if ENABLE(GPU_PROCESS)
+        return m_manager.createCaptureSource(device, WTFMove(hashSalt), constraints, m_shouldCaptureInGPUProcess);
+#else
         return CaptureSourceOrError { "Audio capture in GPUProcess is not implemented"_s };
+#endif
+    }
     return m_manager.createCaptureSource(device, WTFMove(hashSalt), constraints);
 }
 

Modified: trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.h (253704 => 253705)


--- trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.h	2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.h	2019-12-18 19:40:07 UTC (rev 253705)
@@ -53,6 +53,8 @@
 
     static const char* supplementName();
 
+    void didReceiveMessageFromGPUProcess(IPC::Connection& connection, IPC::Decoder& decoder) { didReceiveMessage(connection, decoder); }
+
 private:
     // WebProcessSupplement
     void initialize(const WebProcessCreationParameters&) final;
@@ -96,7 +98,7 @@
         UserMediaCaptureManager& m_manager;
     };
 
-    WebCore::CaptureSourceOrError createCaptureSource(const WebCore::CaptureDevice&, String&&, const WebCore::MediaConstraints*);
+    WebCore::CaptureSourceOrError createCaptureSource(const WebCore::CaptureDevice&, String&&, const WebCore::MediaConstraints*, bool shouldCaptureInGPUProcess = false);
 
     class NoOpCaptureDeviceManager : public WebCore::CaptureDeviceManager {
     public:
@@ -128,7 +130,6 @@
     void startProducingData(uint64_t);
     void stopProducingData(uint64_t);
     WebCore::RealtimeMediaSourceCapabilities capabilities(uint64_t);
-    void setMuted(uint64_t, bool);
     void applyConstraints(uint64_t, const WebCore::MediaConstraints&);
     void applyConstraintsSucceeded(uint64_t, const WebCore::RealtimeMediaSourceSettings&);
     void applyConstraintsFailed(uint64_t, String&&, String&&);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to