Title: [214027] trunk/Source
Revision
214027
Author
jer.no...@apple.com
Date
2017-03-15 21:10:53 -0700 (Wed, 15 Mar 2017)

Log Message

Optionally capture audio in the UIProcess
https://bugs.webkit.org/show_bug.cgi?id=169609

Reviewed by Alex Christensen.

Source/WebCore:

Export some previously un-exported symbols from WebCore for use in WebKit2.

* WebCore.xcodeproj/project.pbxproj:
* platform/audio/WebAudioBufferList.h:
* platform/mediastream/RealtimeMediaSource.h:

Source/WebKit2:

Add a new class pair, UserMediaCaptureManager/Proxy, to allow a RealtimeMediaSource
requested in a WebProcess to be created in the UIProcess and push its audio data across the
process boundary to its clients in the WebProcess. Because these classes are clients of the
RealtimeMediaSourceCenter::singleton(), they must be a singleton in the WebProcess as well,
so they are attached to the WebProcess class in the web process and to WebProcessProxy in
the UIProcess.

* UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp: Added.
(WebKit::UserMediaCaptureManagerProxy::SourceProxy::SourceProxy):
(WebKit::UserMediaCaptureManagerProxy::SourceProxy::~SourceProxy):
(WebKit::UserMediaCaptureManagerProxy::SourceProxy::source):
(WebKit::UserMediaCaptureManagerProxy::SourceProxy::description):
(WebKit::UserMediaCaptureManagerProxy::SourceProxy::numberOfFrames):
(WebKit::UserMediaCaptureManagerProxy::UserMediaCaptureManagerProxy):
(WebKit::UserMediaCaptureManagerProxy::~UserMediaCaptureManagerProxy):
(WebKit::UserMediaCaptureManagerProxy::createMediaSourceForCaptureDeviceWithConstraints):
(WebKit::UserMediaCaptureManagerProxy::startProducingData):
(WebKit::UserMediaCaptureManagerProxy::stopProducingData):
* UIProcess/Cocoa/UserMediaCaptureManagerProxy.h:
(WebKit::UserMediaCaptureManagerProxy::process):
* UIProcess/Cocoa/UserMediaCaptureManagerProxy.messages.in: Added.
* WebProcess/cocoa/UserMediaCaptureManager.cpp: Added.
(WebKit::nextSessionID):
(WebKit::UserMediaCaptureManager::Source::Source):
(WebKit::UserMediaCaptureManager::Source::~Source):
(WebKit::UserMediaCaptureManager::Source::setCapabilities):
(WebKit::UserMediaCaptureManager::Source::setSettings):
(WebKit::UserMediaCaptureManager::Source::description):
(WebKit::UserMediaCaptureManager::Source::setStorage):
(WebKit::UserMediaCaptureManager::Source::setRingBufferFrameBounds):
(WebKit::UserMediaCaptureManager::Source::audioSamplesAvailable):
(WebKit::UserMediaCaptureManager::UserMediaCaptureManager):
(WebKit::UserMediaCaptureManager::~UserMediaCaptureManager):
(WebKit::UserMediaCaptureManager::supplementName):
(WebKit::UserMediaCaptureManager::initialize):
(WebKit::UserMediaCaptureManager::createMediaSourceForCaptureDeviceWithConstraints):
(WebKit::UserMediaCaptureManager::sourceStopped):
(WebKit::UserMediaCaptureManager::sourceMutedChanged):
(WebKit::UserMediaCaptureManager::sourceEnabledChanged):
(WebKit::UserMediaCaptureManager::sourceSettingsChanged):
(WebKit::UserMediaCaptureManager::storageChanged):
(WebKit::UserMediaCaptureManager::ringBufferFrameBoundsChanged):
(WebKit::UserMediaCaptureManager::audioSamplesAvailable):
(WebKit::UserMediaCaptureManager::startProducingData):
(WebKit::UserMediaCaptureManager::stopProducingData):
* WebProcess/cocoa/UserMediaCaptureManager.h: Added.
* WebProcess/cocoa/UserMediaCaptureManager.messages.in: Added.

Initialize UserMediaCaptureManager/Proxy:

* UIProcess/Cocoa/WebProcessPoolCocoa.mm:
(WebKit::WebProcessPool::platformInitializeWebProcess):
* UIProcess/WebProcessProxy.cpp:
(WebKit::WebProcessProxy::WebProcessProxy):
* UIProcess/WebProcessProxy.h:
* WebProcess/WebProcess.cpp:
(WebKit::WebProcess::WebProcess):

WebUserMediaClientMac is no longer necessary now that the UserMediaCaptureManager overrides
the factories:

* WebProcess/WebCoreSupport/WebUserMediaClient.cpp:
(WebKit::WebUserMediaClient::WebUserMediaClient):
(WebKit::WebUserMediaClient::initializeFactories): Deleted.

Add a new preference and WebProcessCreationParameters member to control whether
capturing is done in the UIProcess:

* Shared/WebPreferencesDefinitions.h:
* Shared/WebProcessCreationParameters.cpp:
(WebKit::WebProcessCreationParameters::encode):
(WebKit::WebProcessCreationParameters::decode):
* Shared/WebProcessCreationParameters.h:

Add new files to the project:

* DerivedSources.make:
* WebKit2.xcodeproj/project.pbxproj:

Modified Paths

Added Paths

Removed Paths

  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/cocoa/

Diff

Modified: trunk/Source/WebCore/ChangeLog (214026 => 214027)


--- trunk/Source/WebCore/ChangeLog	2017-03-16 03:41:09 UTC (rev 214026)
+++ trunk/Source/WebCore/ChangeLog	2017-03-16 04:10:53 UTC (rev 214027)
@@ -1,3 +1,16 @@
+2017-03-15  Jer Noble  <jer.no...@apple.com>
+
+        Optionally capture audio in the UIProcess
+        https://bugs.webkit.org/show_bug.cgi?id=169609
+
+        Reviewed by Alex Christensen.
+
+        Export some previously un-exported symbols from WebCore for use in WebKit2.
+
+        * WebCore.xcodeproj/project.pbxproj:
+        * platform/audio/WebAudioBufferList.h:
+        * platform/mediastream/RealtimeMediaSource.h:
+
 2017-03-15  Zalan Bujtas  <za...@apple.com>
 
         Do not reparent floating object until after intruding/overhanging dependency is cleared.

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (214026 => 214027)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2017-03-16 03:41:09 UTC (rev 214026)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2017-03-16 04:10:53 UTC (rev 214027)
@@ -6174,7 +6174,7 @@
 		CDE595971BF26E2100A1CBE8 /* CDMSessionMediaSourceAVFObjC.h in Headers */ = {isa = PBXBuildFile; fileRef = CDE595961BF26E2100A1CBE8 /* CDMSessionMediaSourceAVFObjC.h */; };
 		CDE5959D1BF2757100A1CBE8 /* CDMSessionMediaSourceAVFObjC.mm in Sources */ = {isa = PBXBuildFile; fileRef = CDE5959C1BF2757100A1CBE8 /* CDMSessionMediaSourceAVFObjC.mm */; };
 		CDE667A41E4BBF1500E8154A /* WebAudioBufferList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDE667A21E4BBF1500E8154A /* WebAudioBufferList.cpp */; };
-		CDE667A51E4BBF1500E8154A /* WebAudioBufferList.h in Headers */ = {isa = PBXBuildFile; fileRef = CDE667A31E4BBF1500E8154A /* WebAudioBufferList.h */; };
+		CDE667A51E4BBF1500E8154A /* WebAudioBufferList.h in Headers */ = {isa = PBXBuildFile; fileRef = CDE667A31E4BBF1500E8154A /* WebAudioBufferList.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		CDE7FC44181904B1002BBB77 /* OrderIterator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDE7FC42181904B1002BBB77 /* OrderIterator.cpp */; };
 		CDE7FC45181904B1002BBB77 /* OrderIterator.h in Headers */ = {isa = PBXBuildFile; fileRef = CDE7FC43181904B1002BBB77 /* OrderIterator.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		CDE83DB1183C44060031EAA3 /* VideoPlaybackQuality.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDE83DAF183C44060031EAA3 /* VideoPlaybackQuality.cpp */; };
@@ -6191,6 +6191,7 @@
 		CDEA7C851276230400B846DD /* RenderFullScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDEA7C831276230400B846DD /* RenderFullScreen.cpp */; };
 		CDEE393717974259001D7580 /* PublicURLManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDEE393617974259001D7580 /* PublicURLManager.cpp */; };
 		CDEF4FD717E85C8F00AEE24B /* GridLength.h in Headers */ = {isa = PBXBuildFile; fileRef = CDEF4FD617E85C8F00AEE24B /* GridLength.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		CDEFA2281E7669E8000AE99C /* PlatformAudioData.h in Headers */ = {isa = PBXBuildFile; fileRef = CDE667A11E4BBA4D00E8154A /* PlatformAudioData.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		CDF2B004181F059C00F2B424 /* MediaDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = CDF2B003181F059C00F2B424 /* MediaDescription.h */; };
 		CDF2B0101820540600F2B424 /* MockBox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDF2B0061820540600F2B424 /* MockBox.cpp */; };
 		CDF2B0111820540600F2B424 /* MockBox.h in Headers */ = {isa = PBXBuildFile; fileRef = CDF2B0071820540600F2B424 /* MockBox.h */; };
@@ -27017,6 +27018,7 @@
 				FD31609912B026F700C1A359 /* HRTFDatabase.h in Headers */,
 				FD31609B12B026F700C1A359 /* HRTFDatabaseLoader.h in Headers */,
 				FD31609D12B026F700C1A359 /* HRTFElevation.h in Headers */,
+				CDEFA2281E7669E8000AE99C /* PlatformAudioData.h in Headers */,
 				FD31609F12B026F700C1A359 /* HRTFKernel.h in Headers */,
 				FD3160A112B026F700C1A359 /* HRTFPanner.h in Headers */,
 				BC97E23A109144950010D361 /* HTMLAllCollection.h in Headers */,

Modified: trunk/Source/WebCore/platform/audio/WebAudioBufferList.h (214026 => 214027)


--- trunk/Source/WebCore/platform/audio/WebAudioBufferList.h	2017-03-16 03:41:09 UTC (rev 214026)
+++ trunk/Source/WebCore/platform/audio/WebAudioBufferList.h	2017-03-16 04:10:53 UTC (rev 214027)
@@ -42,7 +42,7 @@
 class WebAudioBufferList : public PlatformAudioData {
 public:
     WebAudioBufferList(const CAAudioStreamDescription&);
-    WebAudioBufferList(const CAAudioStreamDescription&, uint32_t sampleCount);
+    WEBCORE_EXPORT WebAudioBufferList(const CAAudioStreamDescription&, uint32_t sampleCount);
     WebAudioBufferList(const CAAudioStreamDescription&, CMSampleBufferRef);
 
     AudioBufferList* list() const { return m_list.get(); }

Modified: trunk/Source/WebCore/platform/audio/mac/CAAudioStreamDescription.h (214026 => 214027)


--- trunk/Source/WebCore/platform/audio/mac/CAAudioStreamDescription.h	2017-03-16 03:41:09 UTC (rev 214026)
+++ trunk/Source/WebCore/platform/audio/mac/CAAudioStreamDescription.h	2017-03-16 04:10:53 UTC (rev 214027)
@@ -90,31 +90,13 @@
 template<class Encoder>
 void CAAudioStreamDescription::encode(Encoder& encoder) const
 {
-    encoder << m_streamDescription.mSampleRate
-        << m_streamDescription.mFormatID
-        << m_streamDescription.mFormatFlags
-        << m_streamDescription.mBytesPerPacket
-        << m_streamDescription.mFramesPerPacket
-        << m_streamDescription.mBytesPerFrame
-        << m_streamDescription.mChannelsPerFrame
-        << m_streamDescription.mBitsPerChannel
-        << m_streamDescription.mReserved;
-    encoder.encodeEnum(m_format);
+    encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(&m_streamDescription), sizeof(m_streamDescription), 1);
 }
 
 template<class Decoder>
 bool CAAudioStreamDescription::decode(Decoder& decoder, CAAudioStreamDescription& description)
 {
-    return decoder.decode(description.m_streamDescription.mSampleRate)
-        && decoder.decode(description.m_streamDescription.mFormatID)
-        && decoder.decode(description.m_streamDescription.mFormatFlags)
-        && decoder.decode(description.m_streamDescription.mBytesPerPacket)
-        && decoder.decode(description.m_streamDescription.mFramesPerPacket)
-        && decoder.decode(description.m_streamDescription.mBytesPerFrame)
-        && decoder.decode(description.m_streamDescription.mChannelsPerFrame)
-        && decoder.decode(description.m_streamDescription.mBitsPerChannel)
-        && decoder.decode(description.m_streamDescription.mReserved)
-        && decoder.decodeEnum(description.m_format);
+    return decoder.decodeFixedLengthData(reinterpret_cast<uint8_t*>(&description.m_streamDescription), sizeof(description.m_streamDescription), 1);
 }
 
 inline CAAudioStreamDescription toCAAudioStreamDescription(const AudioStreamDescription& description)

Modified: trunk/Source/WebCore/platform/audio/mac/CARingBuffer.h (214026 => 214027)


--- trunk/Source/WebCore/platform/audio/mac/CARingBuffer.h	2017-03-16 03:41:09 UTC (rev 214026)
+++ trunk/Source/WebCore/platform/audio/mac/CARingBuffer.h	2017-03-16 04:10:53 UTC (rev 214027)
@@ -85,6 +85,7 @@
     WEBCORE_EXPORT void setCurrentFrameBounds(uint64_t startFrame, uint64_t endFrame);
 
     uint32_t channelCount() const { return m_channelCount; }
+    CARingBufferStorage& storage() { return m_buffers; }
 
 private:
     size_t frameOffset(uint64_t frameNumber) { return (frameNumber & m_frameCountMask) * m_bytesPerFrame; }

Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h (214026 => 214027)


--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h	2017-03-16 03:41:09 UTC (rev 214026)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h	2017-03-16 04:10:53 UTC (rev 214027)
@@ -61,7 +61,7 @@
 class PlatformAudioData;
 class RealtimeMediaSourceSettings;
 
-class RealtimeMediaSource : public RefCounted<RealtimeMediaSource> {
+class WEBCORE_EXPORT RealtimeMediaSource : public RefCounted<RealtimeMediaSource> {
 public:
     class Observer {
     public:
@@ -200,6 +200,8 @@
     virtual void applyConstraints(const FlattenedConstraint&);
     virtual void applySizeAndFrameRate(std::optional<int> width, std::optional<int> height, std::optional<double>);
 
+    const Vector<Observer*> observers() const { return m_observers; }
+
     bool m_muted { false };
     bool m_enabled { true };
 

Modified: trunk/Source/WebKit2/ChangeLog (214026 => 214027)


--- trunk/Source/WebKit2/ChangeLog	2017-03-16 03:41:09 UTC (rev 214026)
+++ trunk/Source/WebKit2/ChangeLog	2017-03-16 04:10:53 UTC (rev 214027)
@@ -1,3 +1,89 @@
+2017-03-15  Jer Noble  <jer.no...@apple.com>
+
+        Optionally capture audio in the UIProcess
+        https://bugs.webkit.org/show_bug.cgi?id=169609
+
+        Reviewed by Alex Christensen.
+
+        Add a new class pair, UserMediaCaptureManager/Proxy, to allow a RealtimeMediaSource
+        requested in a WebProcess to be created in the UIProcess and push its audio data across the
+        process boundary to its clients in the WebProcess. Because these classes are clients of the
+        RealtimeMediaSourceCenter::singleton(), they must be a singleton in the WebProcess as well,
+        so they are attached to the WebProcess class in the web process and to WebProcessProxy in
+        the UIProcess.
+
+        * UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp: Added.
+        (WebKit::UserMediaCaptureManagerProxy::SourceProxy::SourceProxy):
+        (WebKit::UserMediaCaptureManagerProxy::SourceProxy::~SourceProxy):
+        (WebKit::UserMediaCaptureManagerProxy::SourceProxy::source):
+        (WebKit::UserMediaCaptureManagerProxy::SourceProxy::description):
+        (WebKit::UserMediaCaptureManagerProxy::SourceProxy::numberOfFrames):
+        (WebKit::UserMediaCaptureManagerProxy::UserMediaCaptureManagerProxy):
+        (WebKit::UserMediaCaptureManagerProxy::~UserMediaCaptureManagerProxy):
+        (WebKit::UserMediaCaptureManagerProxy::createMediaSourceForCaptureDeviceWithConstraints):
+        (WebKit::UserMediaCaptureManagerProxy::startProducingData):
+        (WebKit::UserMediaCaptureManagerProxy::stopProducingData):
+        * UIProcess/Cocoa/UserMediaCaptureManagerProxy.h:
+        (WebKit::UserMediaCaptureManagerProxy::process):
+        * UIProcess/Cocoa/UserMediaCaptureManagerProxy.messages.in: Added.
+        * WebProcess/cocoa/UserMediaCaptureManager.cpp: Added.
+        (WebKit::nextSessionID):
+        (WebKit::UserMediaCaptureManager::Source::Source):
+        (WebKit::UserMediaCaptureManager::Source::~Source):
+        (WebKit::UserMediaCaptureManager::Source::setCapabilities):
+        (WebKit::UserMediaCaptureManager::Source::setSettings):
+        (WebKit::UserMediaCaptureManager::Source::description):
+        (WebKit::UserMediaCaptureManager::Source::setStorage):
+        (WebKit::UserMediaCaptureManager::Source::setRingBufferFrameBounds):
+        (WebKit::UserMediaCaptureManager::Source::audioSamplesAvailable):
+        (WebKit::UserMediaCaptureManager::UserMediaCaptureManager):
+        (WebKit::UserMediaCaptureManager::~UserMediaCaptureManager):
+        (WebKit::UserMediaCaptureManager::supplementName):
+        (WebKit::UserMediaCaptureManager::initialize):
+        (WebKit::UserMediaCaptureManager::createMediaSourceForCaptureDeviceWithConstraints):
+        (WebKit::UserMediaCaptureManager::sourceStopped):
+        (WebKit::UserMediaCaptureManager::sourceMutedChanged):
+        (WebKit::UserMediaCaptureManager::sourceEnabledChanged):
+        (WebKit::UserMediaCaptureManager::sourceSettingsChanged):
+        (WebKit::UserMediaCaptureManager::storageChanged):
+        (WebKit::UserMediaCaptureManager::ringBufferFrameBoundsChanged):
+        (WebKit::UserMediaCaptureManager::audioSamplesAvailable):
+        (WebKit::UserMediaCaptureManager::startProducingData):
+        (WebKit::UserMediaCaptureManager::stopProducingData):
+        * WebProcess/cocoa/UserMediaCaptureManager.h: Added.
+        * WebProcess/cocoa/UserMediaCaptureManager.messages.in: Added.
+
+        Initialize UserMediaCaptureManager/Proxy:
+
+        * UIProcess/Cocoa/WebProcessPoolCocoa.mm:
+        (WebKit::WebProcessPool::platformInitializeWebProcess):
+        * UIProcess/WebProcessProxy.cpp:
+        (WebKit::WebProcessProxy::WebProcessProxy):
+        * UIProcess/WebProcessProxy.h:
+        * WebProcess/WebProcess.cpp:
+        (WebKit::WebProcess::WebProcess):
+
+        WebUserMediaClientMac is no longer necessary now that the UserMediaCaptureManager overrides
+        the factories:
+
+        * WebProcess/WebCoreSupport/WebUserMediaClient.cpp:
+        (WebKit::WebUserMediaClient::WebUserMediaClient):
+        (WebKit::WebUserMediaClient::initializeFactories): Deleted.
+
+        Add a new preference and WebProcessCreationParameters member to control whether
+        capturing is done in the UIProcess:
+
+        * Shared/WebPreferencesDefinitions.h:
+        * Shared/WebProcessCreationParameters.cpp:
+        (WebKit::WebProcessCreationParameters::encode):
+        (WebKit::WebProcessCreationParameters::decode):
+        * Shared/WebProcessCreationParameters.h:
+
+        Add new files to the project:
+
+        * DerivedSources.make:
+        * WebKit2.xcodeproj/project.pbxproj:
+
 2017-03-15  Tim Horton  <timothy_hor...@apple.com>
 
         Null deref under callAfterNextPresentationUpdate

Modified: trunk/Source/WebKit2/DerivedSources.make (214026 => 214027)


--- trunk/Source/WebKit2/DerivedSources.make	2017-03-16 03:41:09 UTC (rev 214026)
+++ trunk/Source/WebKit2/DerivedSources.make	2017-03-16 04:10:53 UTC (rev 214027)
@@ -45,6 +45,7 @@
     $(WebKit2)/WebProcess/Geolocation \
     $(WebKit2)/WebProcess/IconDatabase \
     $(WebKit2)/WebProcess/MediaCache \
+    $(WebKit2)/WebProcess/MediaStream \
     $(WebKit2)/WebProcess/Network \
     $(WebKit2)/WebProcess/Network/webrtc \
     $(WebKit2)/WebProcess/Notifications \
@@ -65,6 +66,7 @@
     $(WebKit2)/UIProcess/Cocoa \
     $(WebKit2)/UIProcess/Databases \
     $(WebKit2)/UIProcess/Downloads \
+    $(WebKit2)/UIProcess/MediaStream \
     $(WebKit2)/UIProcess/Network \
     $(WebKit2)/UIProcess/Network/CustomProtocols \
     $(WebKit2)/UIProcess/Notifications \
@@ -121,6 +123,8 @@
     SmartMagnificationController \
     StorageAreaMap \
     StorageManager \
+    UserMediaCaptureManager \
+    UserMediaCaptureManagerProxy \
     ViewGestureController \
     ViewGestureGeometryCollector \
     ViewUpdateDispatcher \

Modified: trunk/Source/WebKit2/Shared/WebPreferencesDefinitions.h (214026 => 214027)


--- trunk/Source/WebKit2/Shared/WebPreferencesDefinitions.h	2017-03-16 03:41:09 UTC (rev 214026)
+++ trunk/Source/WebKit2/Shared/WebPreferencesDefinitions.h	2017-03-16 04:10:53 UTC (rev 214027)
@@ -103,6 +103,12 @@
 #define DEFAULT_CANVAS_USES_ACCELERATED_DRAWING true
 #endif
 
+#if PLATFORM(COCOA)
+#define DEFAULT_SHOULD_CAPTURE_AUDIO_IN_UIPROCESS true
+#else
+#define DEFAULT_SHOULD_CAPTURE_AUDIO_IN_UIPROCESS false
+#endif
+
 // macro(KeyUpper, KeyLower, TypeNameUpper, TypeName, DefaultValue, HumanReadableName, HumanReadableDescription)
 
 #define FOR_EACH_WEBKIT_BOOL_PREFERENCE(macro) \
@@ -252,6 +258,7 @@
     macro(GamepadsEnabled, gamepadsEnabled, Bool, bool, true, "Gamepads", "Web Gamepad API support") \
     macro(InputEventsEnabled, inputEventsEnabled, Bool, bool, true, "Input Events", "Enable InputEvents support") \
     macro(CredentialManagementEnabled, credentialManagementEnabled, Bool, bool, false, "Credential Management", "Enable Credential Management support") \
+    macro(ShouldCaptureAudioInUIProcess, shouldCaptureAudioInUIProcess, Bool, bool, DEFAULT_SHOULD_CAPTURE_AUDIO_IN_UIPROCESS, "Capture", "Capture Audio in UIProcess") \
     \
 
 #define FOR_EACH_WEBKIT_DOUBLE_PREFERENCE(macro) \

Modified: trunk/Source/WebKit2/Shared/WebProcessCreationParameters.cpp (214026 => 214027)


--- trunk/Source/WebKit2/Shared/WebProcessCreationParameters.cpp	2017-03-16 03:41:09 UTC (rev 214026)
+++ trunk/Source/WebKit2/Shared/WebProcessCreationParameters.cpp	2017-03-16 04:10:53 UTC (rev 214027)
@@ -68,6 +68,7 @@
     encoder << mediaKeyStorageDirectoryExtensionHandle;
 #if ENABLE(MEDIA_STREAM)
     encoder << audioCaptureExtensionHandle;
+    encoder << shouldCaptureAudioInUIProcess;
 #endif
     encoder << shouldUseTestingNetworkSession;
     encoder << urlSchemesRegisteredAsEmptyDocument;
@@ -189,6 +190,8 @@
 #if ENABLE(MEDIA_STREAM)
     if (!decoder.decode(parameters.audioCaptureExtensionHandle))
         return false;
+    if (!decoder.decode(parameters.shouldCaptureAudioInUIProcess))
+        return false;
 #endif
     if (!decoder.decode(parameters.shouldUseTestingNetworkSession))
         return false;

Modified: trunk/Source/WebKit2/Shared/WebProcessCreationParameters.h (214026 => 214027)


--- trunk/Source/WebKit2/Shared/WebProcessCreationParameters.h	2017-03-16 03:41:09 UTC (rev 214026)
+++ trunk/Source/WebKit2/Shared/WebProcessCreationParameters.h	2017-03-16 04:10:53 UTC (rev 214027)
@@ -88,6 +88,7 @@
     SandboxExtension::Handle mediaKeyStorageDirectoryExtensionHandle;
 #if ENABLE(MEDIA_STREAM)
     SandboxExtension::Handle audioCaptureExtensionHandle;
+    bool shouldCaptureAudioInUIProcess { false };
 #endif
     String mediaKeyStorageDirectory;
 

Added: trunk/Source/WebKit2/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp (0 => 214027)


--- trunk/Source/WebKit2/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp	                        (rev 0)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp	2017-03-16 04:10:53 UTC (rev 214027)
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "UserMediaCaptureManagerProxy.h"
+
+#if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
+
+#include "SharedRingBufferStorage.h"
+#include "UserMediaCaptureManagerMessages.h"
+#include "WebCoreArgumentCoders.h"
+#include "WebProcessProxy.h"
+#include <WebCore/CARingBuffer.h>
+#include <WebCore/MediaConstraintsImpl.h>
+#include <WebCore/RealtimeMediaSourceCenter.h>
+#include <WebCore/WebAudioBufferList.h>
+#include <wtf/UniqueRef.h>
+
+using namespace WebCore;
+
+namespace WebKit {
+
+class UserMediaCaptureManagerProxy::SourceProxy : public RealtimeMediaSource::Observer, public SharedRingBufferStorage::Client {
+public:
+    SourceProxy(uint64_t id, UserMediaCaptureManagerProxy& manager, Ref<RealtimeMediaSource>&& source)
+        : m_id(id)
+        , m_manager(manager)
+        , m_source(WTFMove(source))
+        , m_ringBuffer(makeUniqueRef<SharedRingBufferStorage>(makeUniqueRef<SharedRingBufferStorage>(this)))
+    {
+        m_source->addObserver(*this);
+    }
+
+    ~SourceProxy()
+    {
+        storage().invalidate();
+        m_source->removeObserver(*this);
+    }
+
+    RealtimeMediaSource& source() { return m_source; }
+    SharedRingBufferStorage& storage() { return static_cast<SharedRingBufferStorage&>(m_ringBuffer.storage()); }
+    CAAudioStreamDescription& description() { return m_description; }
+    int64_t numberOfFrames() { return m_numberOfFrames; }
+
+    void sourceStopped() final {
+        m_manager.process().send(Messages::UserMediaCaptureManager::SourceStopped(m_id), 0);
+    }
+
+    void sourceMutedChanged() final {
+        m_manager.process().send(Messages::UserMediaCaptureManager::SourceMutedChanged(m_id, m_source->muted()), 0);
+    }
+
+    void sourceEnabledChanged() final {
+        m_manager.process().send(Messages::UserMediaCaptureManager::SourceEnabledChanged(m_id, m_source->enabled()), 0);
+    }
+
+    void sourceSettingsChanged() final {
+        m_manager.process().send(Messages::UserMediaCaptureManager::SourceSettingsChanged(m_id, m_source->settings()), 0);
+    }
+
+    void audioSamplesAvailable(const MediaTime& time, const PlatformAudioData& audioData, const AudioStreamDescription& description, size_t numberOfFrames) final {
+        if (m_description != description) {
+            ASSERT(description.platformDescription().type == PlatformDescription::CAAudioStreamBasicType);
+            m_description = *WTF::get<const AudioStreamBasicDescription*>(description.platformDescription().description);
+
+            // Allocate a ring buffer large enough to contain 2 seconds of audio.
+            m_numberOfFrames = m_description.sampleRate() * 2;
+            m_ringBuffer.allocate(m_description.streamDescription(), m_numberOfFrames);
+        }
+
+        ASSERT(is<WebAudioBufferList>(audioData));
+        m_ringBuffer.store(downcast<WebAudioBufferList>(audioData).list(), numberOfFrames, time.timeValue());
+        uint64_t startFrame;
+        uint64_t endFrame;
+        m_ringBuffer.getCurrentFrameBounds(startFrame, endFrame);
+        m_manager.process().send(Messages::UserMediaCaptureManager::AudioSamplesAvailable(m_id, time, numberOfFrames, startFrame, endFrame), 0);
+    }
+
+    void storageChanged(SharedMemory* storage) final {
+        SharedMemory::Handle handle;
+        if (storage)
+            storage->createHandle(handle, SharedMemory::Protection::ReadOnly);
+        m_manager.process().send(Messages::UserMediaCaptureManager::StorageChanged(m_id, handle, m_description, m_numberOfFrames), 0);
+    }
+
+protected:
+    uint64_t m_id;
+    UserMediaCaptureManagerProxy& m_manager;
+    Ref<RealtimeMediaSource> m_source;
+    CARingBuffer m_ringBuffer;
+    CAAudioStreamDescription m_description { };
+    int64_t m_numberOfFrames { 0 };
+};
+
+UserMediaCaptureManagerProxy::UserMediaCaptureManagerProxy(WebProcessProxy& process)
+    : m_process(process)
+{
+    m_process.addMessageReceiver(Messages::UserMediaCaptureManagerProxy::messageReceiverName(), *this);
+}
+
+UserMediaCaptureManagerProxy::~UserMediaCaptureManagerProxy()
+{
+    m_process.removeMessageReceiver(Messages::UserMediaCaptureManagerProxy::messageReceiverName());
+}
+
+void UserMediaCaptureManagerProxy::createMediaSourceForCaptureDeviceWithConstraints(uint64_t id, const CaptureDevice& device, const MediaConstraintsData& constraintsData, bool& succeeded, String& invalidConstraints)
+{
+    auto constraints = MediaConstraintsImpl::create(constraintsData);
+    RefPtr<RealtimeMediaSource> source = RealtimeMediaSourceCenter::singleton().defaultAudioFactory()->createMediaSourceForCaptureDeviceWithConstraints(device, constraints.ptr(), invalidConstraints);
+    succeeded = !!source;
+    
+    if (source)
+        m_proxies.set(id, std::make_unique<SourceProxy>(id, *this, source.releaseNonNull()));
+}
+
+void UserMediaCaptureManagerProxy::startProducingData(uint64_t id)
+{
+    auto iter = m_proxies.find(id);
+    if (iter != m_proxies.end())
+        iter->value->source().startProducingData();
+}
+
+void UserMediaCaptureManagerProxy::stopProducingData(uint64_t id)
+{
+    auto iter = m_proxies.find(id);
+    if (iter != m_proxies.end())
+        iter->value->source().stopProducingData();
+}
+
+}
+
+#endif

Copied: trunk/Source/WebKit2/UIProcess/Cocoa/UserMediaCaptureManagerProxy.h (from rev 214026, trunk/Source/WebKit2/WebProcess/WebCoreSupport/cocoa/WebUserMediaClientMac.mm) (0 => 214027)


--- trunk/Source/WebKit2/UIProcess/Cocoa/UserMediaCaptureManagerProxy.h	                        (rev 0)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/UserMediaCaptureManagerProxy.h	2017-03-16 04:10:53 UTC (rev 214027)
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
+
+#include "Connection.h"
+#include "MessageReceiver.h"
+#include "UserMediaCaptureManagerProxyMessages.h"
+#include <WebCore/RealtimeMediaSource.h>
+
+namespace WebKit {
+
+class SharedMemory;
+class WebProcessProxy;
+
+class UserMediaCaptureManagerProxy : private IPC::MessageReceiver {
+public:
+    UserMediaCaptureManagerProxy(WebProcessProxy&);
+    ~UserMediaCaptureManagerProxy();
+
+    WebProcessProxy& process() const { return m_process; }
+
+private:
+    // IPC::MessageReceiver
+    void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;
+    void didReceiveSyncMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&) final;
+
+    void createMediaSourceForCaptureDeviceWithConstraints(uint64_t id, const WebCore::CaptureDevice&, const WebCore::MediaConstraintsData&, bool& succeeded, String& invalidConstraints);
+    void startProducingData(uint64_t);
+    void stopProducingData(uint64_t);
+
+    class SourceProxy;
+    friend class SourceProxy;
+    HashMap<uint64_t, std::unique_ptr<SourceProxy>> m_proxies;
+    WebProcessProxy& m_process;
+};
+
+}
+
+#endif

Added: trunk/Source/WebKit2/UIProcess/Cocoa/UserMediaCaptureManagerProxy.messages.in (0 => 214027)


--- trunk/Source/WebKit2/UIProcess/Cocoa/UserMediaCaptureManagerProxy.messages.in	                        (rev 0)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/UserMediaCaptureManagerProxy.messages.in	2017-03-16 04:10:53 UTC (rev 214027)
@@ -0,0 +1,28 @@
+# Copyright (C) 2017 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGE.
+
+messages -> UserMediaCaptureManagerProxy {
+    CreateMediaSourceForCaptureDeviceWithConstraints(uint64_t id, WebCore::CaptureDevice device, struct WebCore::MediaConstraintsData constraints) -> (bool success, String invalidConstraints)
+    StartProducingData(uint64_t id)
+    StopProducingData(uint64_t id)
+}

Modified: trunk/Source/WebKit2/UIProcess/Cocoa/WebProcessPoolCocoa.mm (214026 => 214027)


--- trunk/Source/WebKit2/UIProcess/Cocoa/WebProcessPoolCocoa.mm	2017-03-16 03:41:09 UTC (rev 214026)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/WebProcessPoolCocoa.mm	2017-03-16 04:10:53 UTC (rev 214027)
@@ -258,6 +258,8 @@
     // FIXME: Remove this and related parameter when <rdar://problem/29448368> is fixed.
     if (mediaStreamEnabled || webRTCEnabled)
         SandboxExtension::createHandleForGenericExtension("com.apple.webkit.microphone", parameters.audioCaptureExtensionHandle);
+
+    parameters.shouldCaptureAudioInUIProcess = m_defaultPageGroup->preferences().shouldCaptureAudioInUIProcess();
 #endif
 }
 

Modified: trunk/Source/WebKit2/UIProcess/WebProcessProxy.cpp (214026 => 214027)


--- trunk/Source/WebKit2/UIProcess/WebProcessProxy.cpp	2017-03-16 03:41:09 UTC (rev 214026)
+++ trunk/Source/WebKit2/UIProcess/WebProcessProxy.cpp	2017-03-16 04:10:53 UTC (rev 214027)
@@ -62,6 +62,7 @@
 #if PLATFORM(COCOA)
 #include "ObjCObjectGraph.h"
 #include "PDFPlugin.h"
+#include "UserMediaCaptureManagerProxy.h"
 #endif
 
 #if ENABLE(SEC_ITEM_SHIM)
@@ -104,9 +105,14 @@
     , m_isResponsive(NoOrMaybe::Maybe)
     , m_visiblePageCounter([this](RefCounterEvent) { updateBackgroundResponsivenessTimer(); })
     , m_websiteDataStore(websiteDataStore)
+#if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
+    , m_userMediaCaptureManagerProxy(std::make_unique<UserMediaCaptureManagerProxy>(*this))
+#endif
 {
     WebPasteboardProxy::singleton().addWebProcessProxy(*this);
 
+
+
     connect();
 }
 

Modified: trunk/Source/WebKit2/UIProcess/WebProcessProxy.h (214026 => 214027)


--- trunk/Source/WebKit2/UIProcess/WebProcessProxy.h	2017-03-16 03:41:09 UTC (rev 214026)
+++ trunk/Source/WebKit2/UIProcess/WebProcessProxy.h	2017-03-16 04:10:53 UTC (rev 214027)
@@ -56,6 +56,7 @@
 namespace WebKit {
 
 class NetworkProcessProxy;
+class UserMediaCaptureManagerProxy;
 class WebBackForwardListItem;
 class WebPageGroup;
 class WebProcessPool;
@@ -273,6 +274,10 @@
     RefPtr<WebsiteDataStore> m_websiteDataStore;
 
     bool m_isUnderMemoryPressure { false };
+
+#if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
+    std::unique_ptr<UserMediaCaptureManagerProxy> m_userMediaCaptureManagerProxy;
+#endif
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj (214026 => 214027)


--- trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj	2017-03-16 03:41:09 UTC (rev 214026)
+++ trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj	2017-03-16 04:10:53 UTC (rev 214027)
@@ -1878,11 +1878,18 @@
 		CD003A5319D49B5D005ABCE0 /* WebMediaKeyStorageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = CD003A5119D49B5D005ABCE0 /* WebMediaKeyStorageManager.h */; };
 		CD19A26D1A13E82A008D650E /* WebDiagnosticLoggingClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD19A2691A13E820008D650E /* WebDiagnosticLoggingClient.cpp */; };
 		CD19A26E1A13E834008D650E /* WebDiagnosticLoggingClient.h in Headers */ = {isa = PBXBuildFile; fileRef = CD19A26A1A13E821008D650E /* WebDiagnosticLoggingClient.h */; };
+		CD491B071E70D05F00009066 /* UserMediaCaptureManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD491B051E70D05F00009066 /* UserMediaCaptureManager.cpp */; };
+		CD491B081E70D05F00009066 /* UserMediaCaptureManager.h in Headers */ = {isa = PBXBuildFile; fileRef = CD491B061E70D05F00009066 /* UserMediaCaptureManager.h */; };
+		CD491B0D1E732E4D00009066 /* UserMediaCaptureManagerMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD491B0B1E732E4D00009066 /* UserMediaCaptureManagerMessageReceiver.cpp */; };
+		CD491B0E1E732E4D00009066 /* UserMediaCaptureManagerMessages.h in Headers */ = {isa = PBXBuildFile; fileRef = CD491B0C1E732E4D00009066 /* UserMediaCaptureManagerMessages.h */; };
+		CD491B121E73482100009066 /* UserMediaCaptureManagerProxy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD491B101E73482100009066 /* UserMediaCaptureManagerProxy.cpp */; };
+		CD491B131E73482100009066 /* UserMediaCaptureManagerProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = CD491B111E73482100009066 /* UserMediaCaptureManagerProxy.h */; };
+		CD491B171E73525500009066 /* UserMediaCaptureManagerProxyMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD491B151E73525500009066 /* UserMediaCaptureManagerProxyMessageReceiver.cpp */; };
+		CD491B181E73525500009066 /* UserMediaCaptureManagerProxyMessages.h in Headers */ = {isa = PBXBuildFile; fileRef = CD491B161E73525500009066 /* UserMediaCaptureManagerProxyMessages.h */; };
 		CD4B4D9C1E765E0000D27092 /* SharedRingBufferStorage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD4B4D9A1E765E0000D27092 /* SharedRingBufferStorage.cpp */; };
 		CD4B4D9D1E765E0000D27092 /* SharedRingBufferStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = CD4B4D9B1E765E0000D27092 /* SharedRingBufferStorage.h */; };
 		CD5C66A0134B9D38004FE2A8 /* InjectedBundlePageFullScreenClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD5C669E134B9D36004FE2A8 /* InjectedBundlePageFullScreenClient.cpp */; };
 		CD5C66A1134B9D38004FE2A8 /* InjectedBundlePageFullScreenClient.h in Headers */ = {isa = PBXBuildFile; fileRef = CD5C669F134B9D37004FE2A8 /* InjectedBundlePageFullScreenClient.h */; };
-		CD6178141E6DE9A000FDA57D /* WebUserMediaClientMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = CD6178121E6DE9A000FDA57D /* WebUserMediaClientMac.mm */; };
 		CD6F75F4131B66D000D6B21E /* WebFullScreenManagerProxy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD73BA3E131A2E8A00EEDED2 /* WebFullScreenManagerProxy.cpp */; };
 		CD73BA47131ACC9A00EEDED2 /* WebFullScreenManagerProxyMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD73BA45131ACC8800EEDED2 /* WebFullScreenManagerProxyMessageReceiver.cpp */; };
 		CD73BA4E131ACDB700EEDED2 /* WebFullScreenManagerMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD73BA48131ACD8E00EEDED2 /* WebFullScreenManagerMessageReceiver.cpp */; };
@@ -4165,11 +4172,20 @@
 		CD003A5119D49B5D005ABCE0 /* WebMediaKeyStorageManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebMediaKeyStorageManager.h; path = MediaCache/WebMediaKeyStorageManager.h; sourceTree = "<group>"; };
 		CD19A2691A13E820008D650E /* WebDiagnosticLoggingClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebDiagnosticLoggingClient.cpp; sourceTree = "<group>"; };
 		CD19A26A1A13E821008D650E /* WebDiagnosticLoggingClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebDiagnosticLoggingClient.h; sourceTree = "<group>"; };
+		CD491B051E70D05F00009066 /* UserMediaCaptureManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UserMediaCaptureManager.cpp; sourceTree = "<group>"; };
+		CD491B061E70D05F00009066 /* UserMediaCaptureManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UserMediaCaptureManager.h; sourceTree = "<group>"; };
+		CD491B0A1E732D1200009066 /* UserMediaCaptureManager.messages.in */ = {isa = PBXFileReference; lastKnownFileType = text; path = UserMediaCaptureManager.messages.in; sourceTree = "<group>"; };
+		CD491B0B1E732E4D00009066 /* UserMediaCaptureManagerMessageReceiver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UserMediaCaptureManagerMessageReceiver.cpp; sourceTree = "<group>"; };
+		CD491B0C1E732E4D00009066 /* UserMediaCaptureManagerMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UserMediaCaptureManagerMessages.h; sourceTree = "<group>"; };
+		CD491B101E73482100009066 /* UserMediaCaptureManagerProxy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = UserMediaCaptureManagerProxy.cpp; path = ../Cocoa/UserMediaCaptureManagerProxy.cpp; sourceTree = "<group>"; };
+		CD491B111E73482100009066 /* UserMediaCaptureManagerProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = UserMediaCaptureManagerProxy.h; path = ../Cocoa/UserMediaCaptureManagerProxy.h; sourceTree = "<group>"; };
+		CD491B141E7349F300009066 /* UserMediaCaptureManagerProxy.messages.in */ = {isa = PBXFileReference; lastKnownFileType = text; name = UserMediaCaptureManagerProxy.messages.in; path = ../Cocoa/UserMediaCaptureManagerProxy.messages.in; sourceTree = "<group>"; };
+		CD491B151E73525500009066 /* UserMediaCaptureManagerProxyMessageReceiver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UserMediaCaptureManagerProxyMessageReceiver.cpp; sourceTree = "<group>"; };
+		CD491B161E73525500009066 /* UserMediaCaptureManagerProxyMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UserMediaCaptureManagerProxyMessages.h; sourceTree = "<group>"; };
 		CD4B4D9A1E765E0000D27092 /* SharedRingBufferStorage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SharedRingBufferStorage.cpp; sourceTree = "<group>"; };
 		CD4B4D9B1E765E0000D27092 /* SharedRingBufferStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SharedRingBufferStorage.h; sourceTree = "<group>"; };
 		CD5C669E134B9D36004FE2A8 /* InjectedBundlePageFullScreenClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InjectedBundlePageFullScreenClient.cpp; sourceTree = "<group>"; };
 		CD5C669F134B9D37004FE2A8 /* InjectedBundlePageFullScreenClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InjectedBundlePageFullScreenClient.h; sourceTree = "<group>"; };
-		CD6178121E6DE9A000FDA57D /* WebUserMediaClientMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = WebUserMediaClientMac.mm; path = cocoa/WebUserMediaClientMac.mm; sourceTree = "<group>"; };
 		CD73BA37131A29FE00EEDED2 /* WebFullScreenManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WebFullScreenManager.cpp; path = FullScreen/WebFullScreenManager.cpp; sourceTree = "<group>"; };
 		CD73BA38131A29FE00EEDED2 /* WebFullScreenManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebFullScreenManager.h; path = FullScreen/WebFullScreenManager.h; sourceTree = "<group>"; };
 		CD73BA39131A29FE00EEDED2 /* WebFullScreenManager.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = WebFullScreenManager.messages.in; path = FullScreen/WebFullScreenManager.messages.in; sourceTree = "<group>"; };
@@ -6277,6 +6293,9 @@
 		7C6E70F818B2D47E00F24E2E /* cocoa */ = {
 			isa = PBXGroup;
 			children = (
+				CD491B051E70D05F00009066 /* UserMediaCaptureManager.cpp */,
+				CD491B061E70D05F00009066 /* UserMediaCaptureManager.h */,
+				CD491B0A1E732D1200009066 /* UserMediaCaptureManager.messages.in */,
 				CDA29A191CBDBF4100901CCF /* WebPlaybackSessionManager.h */,
 				CDA29A1C1CBDBF5B00901CCF /* WebPlaybackSessionManager.messages.in */,
 				CDA29A181CBDBF4100901CCF /* WebPlaybackSessionManager.mm */,
@@ -7444,6 +7463,9 @@
 				1AA417ED12C00D87002BE67B /* TextCheckerMac.mm */,
 				1AF05D8514688348008B1E81 /* TiledCoreAnimationDrawingAreaProxy.h */,
 				1AF05D8414688348008B1E81 /* TiledCoreAnimationDrawingAreaProxy.mm */,
+				CD491B101E73482100009066 /* UserMediaCaptureManagerProxy.cpp */,
+				CD491B111E73482100009066 /* UserMediaCaptureManagerProxy.h */,
+				CD491B141E7349F300009066 /* UserMediaCaptureManagerProxy.messages.in */,
 				2D125C5D1857EA05003BA3CB /* ViewGestureControllerMac.mm */,
 				2D6CD117189058A500E5A4A0 /* ViewSnapshotStore.h */,
 				2D6CD118189058A500E5A4A0 /* ViewSnapshotStore.mm */,
@@ -7689,6 +7711,10 @@
 				1A334DEC16DE8F88006A8E38 /* StorageAreaMapMessages.h */,
 				1AB31A9416BC688100F6DBC9 /* StorageManagerMessageReceiver.cpp */,
 				1AB31A9516BC688100F6DBC9 /* StorageManagerMessages.h */,
+				CD491B151E73525500009066 /* UserMediaCaptureManagerProxyMessageReceiver.cpp */,
+				CD491B161E73525500009066 /* UserMediaCaptureManagerProxyMessages.h */,
+				CD491B0B1E732E4D00009066 /* UserMediaCaptureManagerMessageReceiver.cpp */,
+				CD491B0C1E732E4D00009066 /* UserMediaCaptureManagerMessages.h */,
 				2D1B5D5B185869C8006C6596 /* ViewGestureControllerMessageReceiver.cpp */,
 				2D1B5D5C185869C8006C6596 /* ViewGestureControllerMessages.h */,
 				2D819B9F1862800E001F03D1 /* ViewGestureGeometryCollectorMessageReceiver.cpp */,
@@ -7820,7 +7846,6 @@
 		CD6178111E6DE98000FDA57D /* cocoa */ = {
 			isa = PBXGroup;
 			children = (
-				CD6178121E6DE9A000FDA57D /* WebUserMediaClientMac.mm */,
 			);
 			name = cocoa;
 			sourceTree = "<group>";
@@ -8038,6 +8063,7 @@
 				7C2413031AACFA7500A58C15 /* _WKUserContentExtensionStore.h in Headers */,
 				7C2413051AACFA9C00A58C15 /* _WKUserContentExtensionStoreInternal.h in Headers */,
 				7CA3793E1AC378B30079DC37 /* _WKUserContentExtensionStorePrivate.h in Headers */,
+				CD491B131E73482100009066 /* UserMediaCaptureManagerProxy.h in Headers */,
 				7C89D2BA1A6B0F2C003A5FDE /* _WKUserContentFilter.h in Headers */,
 				7C89D2BC1A6B0F5B003A5FDE /* _WKUserContentFilterInternal.h in Headers */,
 				5CD286531E7235AA0094FDC8 /* _WKUserContentFilterPrivate.h in Headers */,
@@ -8045,6 +8071,7 @@
 				7C882DF91C7E996F006BF731 /* _WKUserContentWorldInternal.h in Headers */,
 				7CB365AA1D31DB70007158CA /* _WKUserInitiatedAction.h in Headers */,
 				7CB365AD1D31DC10007158CA /* _WKUserInitiatedActionInternal.h in Headers */,
+				CD491B0E1E732E4D00009066 /* UserMediaCaptureManagerMessages.h in Headers */,
 				2D87861D1BDB54BF00D02ABB /* _WKUserStyleSheet.h in Headers */,
 				2D8786201BDB57F500D02ABB /* _WKUserStyleSheetInternal.h in Headers */,
 				1A81B38118BD66AD0007FDAC /* _WKVisitedLinkStore.h in Headers */,
@@ -8090,6 +8117,7 @@
 				1A2464F31891E45100234C5B /* APILoaderClient.h in Headers */,
 				7CD3A4831A5D02FA009623B8 /* APINavigation.h in Headers */,
 				2DF9EEEC1A7836EE00B6CFBE /* APINavigationAction.h in Headers */,
+				CD491B081E70D05F00009066 /* UserMediaCaptureManager.h in Headers */,
 				2DD9EB2D1A6F012500BB1267 /* APINavigationClient.h in Headers */,
 				BCF69FA21176D01400471A52 /* APINavigationData.h in Headers */,
 				2DF9EEEE1A786EAD00B6CFBE /* APINavigationResponse.h in Headers */,
@@ -8415,6 +8443,7 @@
 				E18E690C169B563F009B6670 /* SecItemShimProxy.h in Headers */,
 				E18E6918169B667B009B6670 /* SecItemShimProxyMessages.h in Headers */,
 				514D9F5719119D35000063A7 /* ServicesController.h in Headers */,
+				CD491B181E73525500009066 /* UserMediaCaptureManagerProxyMessages.h in Headers */,
 				1AFDE65A1954A42B00C48FFA /* SessionState.h in Headers */,
 				1A002D49196B345D00B9AD44 /* SessionStateCoding.h in Headers */,
 				753E3E0E1887398900188496 /* SessionTracker.h in Headers */,
@@ -9594,6 +9623,7 @@
 				373D122218A473010066D9CC /* _WKFrameHandle.mm in Sources */,
 				93A88B391BC70F3F00ABA5C2 /* _WKHitTestResult.mm in Sources */,
 				510F59121DDE297700412FF5 /* _WKLinkIconParameters.mm in Sources */,
+				CD491B0D1E732E4D00009066 /* UserMediaCaptureManagerMessageReceiver.cpp in Sources */,
 				A118A9F21908B8EA00F7C92B /* _WKNSFileManagerExtras.mm in Sources */,
 				1A43E829188F3CDC009E4D30 /* _WKProcessPoolConfiguration.mm in Sources */,
 				1A9E328E182165A900F5D04C /* _WKRemoteObjectInterface.mm in Sources */,
@@ -9630,6 +9660,7 @@
 				51D124911E74BF3C002B2820 /* APIHTTPCookieStore.cpp in Sources */,
 				7CD3A4821A5D02FA009623B8 /* APINavigation.cpp in Sources */,
 				BCF69FA31176D01400471A52 /* APINavigationData.cpp in Sources */,
+				CD491B171E73525500009066 /* UserMediaCaptureManagerProxyMessageReceiver.cpp in Sources */,
 				B63403F914910D57001070B5 /* APIObject.cpp in Sources */,
 				378E1A3D181ED6FF0031007A /* APIObject.mm in Sources */,
 				BC857FB612B830E600EDEB2E /* APIOpenPanelParameters.cpp in Sources */,
@@ -9652,6 +9683,7 @@
 				1A3635A91A3144A300ED6197 /* APIWebsiteDataStore.cpp in Sources */,
 				1A3635AD1A3145E500ED6197 /* APIWebsiteDataStoreCocoa.mm in Sources */,
 				5CB237911DF0E2E600117AA3 /* APIWebsitePolicies.cpp in Sources */,
+				CD491B121E73482100009066 /* UserMediaCaptureManagerProxy.cpp in Sources */,
 				1A6563E41B7A8C50009CF787 /* APIWindowFeatures.cpp in Sources */,
 				1AD4C1921B39F33200ABC28E /* ApplicationStateTracker.mm in Sources */,
 				1A3D610513A7F03A00F95D4E /* ArgumentCoders.cpp in Sources */,
@@ -10178,6 +10210,7 @@
 				7C4694D01A51E36800AD5845 /* WebPasteboardProxy.cpp in Sources */,
 				7C4694CC1A4B510A00AD5845 /* WebPasteboardProxyCocoa.mm in Sources */,
 				7C4694C91A4B4EA100AD5845 /* WebPasteboardProxyMessageReceiver.cpp in Sources */,
+				CD491B071E70D05F00009066 /* UserMediaCaptureManager.cpp in Sources */,
 				1AB1F7741D1B2F8A007C9BD1 /* WebPaymentCoordinator.cpp in Sources */,
 				1AB1F7961D1B3613007C9BD1 /* WebPaymentCoordinatorMessageReceiver.cpp in Sources */,
 				1AB1F78B1D1B3355007C9BD1 /* WebPaymentCoordinatorProxy.cpp in Sources */,

Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebUserMediaClient.cpp (214026 => 214027)


--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebUserMediaClient.cpp	2017-03-16 03:41:09 UTC (rev 214026)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebUserMediaClient.cpp	2017-03-16 04:10:53 UTC (rev 214027)
@@ -33,7 +33,6 @@
 WebUserMediaClient::WebUserMediaClient(WebPage& page)
     : m_page(page)
 {
-    initializeFactories();
 }
 
 void WebUserMediaClient::pageDestroyed()
@@ -61,13 +60,6 @@
     m_page.userMediaPermissionRequestManager().cancelMediaDevicesEnumeration(request);
 }
 
-#if !PLATFORM(COCOA)
-void WebUserMediaClient::initializeFactories()
-{
-
-}
-#endif
-
 } // namespace WebKit;
 
 #endif // MEDIA_STREAM

Modified: trunk/Source/WebKit2/WebProcess/WebProcess.cpp (214026 => 214027)


--- trunk/Source/WebKit2/WebProcess/WebProcess.cpp	2017-03-16 03:41:09 UTC (rev 214026)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.cpp	2017-03-16 04:10:53 UTC (rev 214027)
@@ -114,13 +114,11 @@
 #include <wtf/text/StringHash.h>
 
 #if PLATFORM(COCOA)
+#include "CookieStorageShim.h"
 #include "ObjCObjectGraph.h"
+#include "UserMediaCaptureManager.h"
 #endif
 
-#if PLATFORM(COCOA)
-#include "CookieStorageShim.h"
-#endif
-
 #if ENABLE(SEC_ITEM_SHIM)
 #include "SecItemShim.h"
 #endif
@@ -191,6 +189,10 @@
     addSupplement<WebMediaKeyStorageManager>();
 #endif
 
+#if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
+    addSupplement<UserMediaCaptureManager>();
+#endif
+
     m_plugInAutoStartOriginHashes.add(SessionID::defaultSessionID(), HashMap<unsigned, double>());
 
     ResourceLoadObserver::sharedObserver().setStatisticsStore(m_resourceLoadStatisticsStore.copyRef());

Added: trunk/Source/WebKit2/WebProcess/cocoa/UserMediaCaptureManager.cpp (0 => 214027)


--- trunk/Source/WebKit2/WebProcess/cocoa/UserMediaCaptureManager.cpp	                        (rev 0)
+++ trunk/Source/WebKit2/WebProcess/cocoa/UserMediaCaptureManager.cpp	2017-03-16 04:10:53 UTC (rev 214027)
@@ -0,0 +1,226 @@
+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "UserMediaCaptureManager.h"
+
+#if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
+
+#include "SharedRingBufferStorage.h"
+#include "UserMediaCaptureManagerMessages.h"
+#include "UserMediaCaptureManagerProxyMessages.h"
+#include "WebCoreArgumentCoders.h"
+#include "WebProcess.h"
+#include "WebProcessCreationParameters.h"
+#include <WebCore/CaptureDevice.h>
+#include <WebCore/MediaConstraintsImpl.h>
+#include <WebCore/RealtimeMediaSourceCenter.h>
+#include <WebCore/WebAudioBufferList.h>
+
+using namespace WebCore;
+
+namespace WebKit {
+
+static uint64_t nextSessionID()
+{
+    static uint64_t nextID = 0;
+    return ++nextID;
+}
+
+class UserMediaCaptureManager::Source : public RealtimeMediaSource {
+public:
+    Source(const String& sourceID, Type type, const String& name, uint64_t id, UserMediaCaptureManager& manager)
+        : RealtimeMediaSource(sourceID, type, name)
+        , m_id(id)
+        , m_manager(manager)
+        , m_ringBuffer(makeUniqueRef<SharedRingBufferStorage>(nullptr))
+    {
+    }
+
+    ~Source()
+    {
+        storage().invalidate();
+    }
+
+    SharedRingBufferStorage& storage() { return static_cast<SharedRingBufferStorage&>(m_ringBuffer.storage()); }
+    RefPtr<RealtimeMediaSourceCapabilities> capabilities() const final { return m_capabilities; }
+    void setCapabilities(RefPtr<RealtimeMediaSourceCapabilities> capabilities) { m_capabilities = capabilities; }
+
+    const RealtimeMediaSourceSettings& settings() const final { return m_settings; }
+    void setSettings(const RealtimeMediaSourceSettings& settings)
+    {
+        m_settings = settings;
+        settingsDidChange();
+    }
+
+    const CAAudioStreamDescription& description() const { return m_description; }
+    void setStorage(const SharedMemory::Handle& handle, const WebCore::CAAudioStreamDescription& description, uint64_t numberOfFrames)
+    {
+        m_description = description;
+        if (handle.isNull()) {
+            m_ringBuffer.deallocate();
+            storage().setReadOnly(false);
+            storage().setStorage(nullptr);
+            return;
+        }
+
+        RefPtr<SharedMemory> memory = SharedMemory::map(handle, SharedMemory::Protection::ReadOnly);
+        storage().setStorage(WTFMove(memory));
+        storage().setReadOnly(true);
+
+        m_ringBuffer.allocate(description, numberOfFrames);
+    }
+
+    void setRingBufferFrameBounds(uint64_t startFrame, uint64_t endFrame)
+    {
+        m_ringBuffer.setCurrentFrameBounds(startFrame, endFrame);
+    }
+
+    void audioSamplesAvailable(MediaTime time, uint64_t numberOfFrames)
+    {
+        WebAudioBufferList audioData(m_description, numberOfFrames);
+        m_ringBuffer.fetch(audioData.list(), numberOfFrames, time.timeValue());
+
+        for (auto* observer : observers())
+            observer->audioSamplesAvailable(time, audioData, m_description, numberOfFrames);
+    }
+
+    void startProducingData() final { m_manager.startProducingData(m_id); }
+    void stopProducingData() final { m_manager.stopProducingData(m_id); }
+
+    AudioSourceProvider* audioSourceProvider() final { return nullptr; }
+
+private:
+    // RealtimeMediaSource
+    void beginConfiguration() final { }
+    void commitConfiguration() final { }
+
+    uint64_t m_id;
+    UserMediaCaptureManager& m_manager;
+    RefPtr<RealtimeMediaSourceCapabilities> m_capabilities;
+    RealtimeMediaSourceSettings m_settings;
+    CAAudioStreamDescription m_description;
+    CARingBuffer m_ringBuffer;
+};
+
+UserMediaCaptureManager::UserMediaCaptureManager(WebProcess* process)
+    : m_process(*process)
+{
+    m_process.addMessageReceiver(Messages::UserMediaCaptureManager::messageReceiverName(), *this);
+}
+
+UserMediaCaptureManager::~UserMediaCaptureManager()
+{
+    RealtimeMediaSourceCenter::singleton().unsetAudioFactory(*this);
+    m_process.removeMessageReceiver(Messages::UserMediaCaptureManager::messageReceiverName());
+}
+
+const char* UserMediaCaptureManager::supplementName()
+{
+    return "UserMediaCaptureManager";
+}
+
+void UserMediaCaptureManager::initialize(const WebProcessCreationParameters& parameters)
+{
+    if (parameters.shouldCaptureAudioInUIProcess)
+        RealtimeMediaSourceCenter::singleton().setAudioFactory(*this);
+}
+
+RefPtr<RealtimeMediaSource> UserMediaCaptureManager::createMediaSourceForCaptureDeviceWithConstraints(const CaptureDevice& device, const MediaConstraints* constraints, String& invalidConstraints)
+{
+    if (!constraints)
+        return nullptr;
+
+    uint64_t id = nextSessionID();
+    MediaConstraintsData constraintsData;
+    constraintsData.mandatoryConstraints = constraints->mandatoryConstraints();
+    constraintsData.advancedConstraints = constraints->advancedConstraints();
+    constraintsData.isValid = constraints->isValid();
+    bool succeeded;
+
+    m_process.sendSync(Messages::UserMediaCaptureManagerProxy::CreateMediaSourceForCaptureDeviceWithConstraints(id, device, constraintsData), Messages::UserMediaCaptureManagerProxy::CreateMediaSourceForCaptureDeviceWithConstraints::Reply(succeeded, invalidConstraints), 0);
+
+    auto source = adoptRef(new Source(String::number(id), RealtimeMediaSource::Type::Audio, device.label(), id, *this));
+    m_sources.set(id, source);
+    return source;
+}
+
+void UserMediaCaptureManager::sourceStopped(uint64_t id)
+{
+    ASSERT(m_sources.contains(id));
+    m_sources.get(id)->stop();
+}
+
+void UserMediaCaptureManager::sourceMutedChanged(uint64_t id, bool muted)
+{
+    ASSERT(m_sources.contains(id));
+    m_sources.get(id)->setMuted(muted);
+}
+
+void UserMediaCaptureManager::sourceEnabledChanged(uint64_t id, bool enabled)
+{
+    ASSERT(m_sources.contains(id));
+    m_sources.get(id)->setEnabled(enabled);
+}
+
+void UserMediaCaptureManager::sourceSettingsChanged(uint64_t id, const RealtimeMediaSourceSettings& settings)
+{
+    ASSERT(m_sources.contains(id));
+    m_sources.get(id)->setSettings(settings);
+}
+
+void UserMediaCaptureManager::storageChanged(uint64_t id, const SharedMemory::Handle& handle, const WebCore::CAAudioStreamDescription& description, uint64_t numberOfFrames)
+{
+    ASSERT(m_sources.contains(id));
+    m_sources.get(id)->setStorage(handle, description, numberOfFrames);
+}
+
+void UserMediaCaptureManager::ringBufferFrameBoundsChanged(uint64_t id, uint64_t startFrame, uint64_t endFrame)
+{
+    ASSERT(m_sources.contains(id));
+    m_sources.get(id)->setRingBufferFrameBounds(startFrame, endFrame);
+}
+
+void UserMediaCaptureManager::audioSamplesAvailable(uint64_t id, MediaTime time, uint64_t numberOfFrames, uint64_t startFrame, uint64_t endFrame)
+{
+    ASSERT(m_sources.contains(id));
+    auto& source = *m_sources.get(id);
+    source.setRingBufferFrameBounds(startFrame, endFrame);
+    source.audioSamplesAvailable(time, numberOfFrames);
+}
+
+void UserMediaCaptureManager::startProducingData(uint64_t id)
+{
+    m_process.send(Messages::UserMediaCaptureManagerProxy::StartProducingData(id), 0);
+}
+
+void UserMediaCaptureManager::stopProducingData(uint64_t id)
+{
+    m_process.send(Messages::UserMediaCaptureManagerProxy::StopProducingData(id), 0);
+}
+
+}
+
+#endif

Added: trunk/Source/WebKit2/WebProcess/cocoa/UserMediaCaptureManager.h (0 => 214027)


--- trunk/Source/WebKit2/WebProcess/cocoa/UserMediaCaptureManager.h	                        (rev 0)
+++ trunk/Source/WebKit2/WebProcess/cocoa/UserMediaCaptureManager.h	2017-03-16 04:10:53 UTC (rev 214027)
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
+
+#include "MessageReceiver.h"
+#include "SharedMemory.h"
+#include "WebProcessSupplement.h"
+#include <WebCore/RealtimeMediaSource.h>
+#include <wtf/HashMap.h>
+
+namespace WebCore {
+class CAAudioStreamDescription;
+}
+
+namespace WebKit {
+
+class CrossProcessRealtimeAudioSource;
+class WebProcess;
+
+class UserMediaCaptureManager : public WebProcessSupplement, public IPC::MessageReceiver, public WebCore::RealtimeMediaSource::CaptureFactory {
+public:
+    explicit UserMediaCaptureManager(WebProcess*);
+    ~UserMediaCaptureManager();
+
+    static const char* supplementName();
+
+private:
+    // WebProcessSupplement
+    void initialize(const WebProcessCreationParameters&) final;
+
+    // WebCore::RealtimeMediaSource::Factory:
+    RefPtr<WebCore::RealtimeMediaSource> createMediaSourceForCaptureDeviceWithConstraints(const WebCore::CaptureDevice&, const WebCore::MediaConstraints*, String&) final;
+
+    // IPC::MessageReceiver
+    void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;
+
+    // Messages::UserMediaCaptureManager
+    void sourceStopped(uint64_t id);
+    void sourceMutedChanged(uint64_t id, bool muted);
+    void sourceEnabledChanged(uint64_t id, bool enabled);
+    void sourceSettingsChanged(uint64_t id, const WebCore::RealtimeMediaSourceSettings&);
+    void storageChanged(uint64_t id, const SharedMemory::Handle&, const WebCore::CAAudioStreamDescription&, uint64_t numberOfFrames);
+    void ringBufferFrameBoundsChanged(uint64_t id, uint64_t startFrame, uint64_t endFrame);
+    void audioSamplesAvailable(uint64_t id, MediaTime, uint64_t numberOfFrames, uint64_t startFrame, uint64_t endFrame);
+
+    void startProducingData(uint64_t);
+    void stopProducingData(uint64_t);
+
+    class Source;
+    friend class Source;
+    HashMap<uint64_t, RefPtr<Source>> m_sources;
+    WebProcess& m_process;
+};
+
+}
+
+#endif

Added: trunk/Source/WebKit2/WebProcess/cocoa/UserMediaCaptureManager.messages.in (0 => 214027)


--- trunk/Source/WebKit2/WebProcess/cocoa/UserMediaCaptureManager.messages.in	                        (rev 0)
+++ trunk/Source/WebKit2/WebProcess/cocoa/UserMediaCaptureManager.messages.in	2017-03-16 04:10:53 UTC (rev 214027)
@@ -0,0 +1,31 @@
+# Copyright (C) 2017 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGE.
+
+messages -> UserMediaCaptureManager {
+    SourceStopped(uint64_t id)
+    SourceMutedChanged(uint64_t id, bool muted)
+    SourceEnabledChanged(uint64_t id, bool enabled)
+    SourceSettingsChanged(uint64_t id, WebCore::RealtimeMediaSourceSettings settings)
+    StorageChanged(uint64_t id, WebKit::SharedMemory::Handle storageHandle, WebCore::CAAudioStreamDescription description, uint64_t numberOfFrames)
+    AudioSamplesAvailable(uint64_t id, MediaTime time, uint64_t numberOfFrames, uint64_t startFrame, uint64_t endFrame)
+}
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to