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)
+}