Title: [215418] trunk/Source
Revision
215418
Author
commit-qu...@webkit.org
Date
2017-04-17 10:00:52 -0700 (Mon, 17 Apr 2017)

Log Message

Refactor enumerateDevices to allow separate CaptureDeviceManagers for audio and video.
https://bugs.webkit.org/show_bug.cgi?id=170778

Patch by Jeremy Jones <jere...@apple.com> on 2017-04-17
Source/WebCore:

Reviewed by Eric Carlson.

Add CoreAudioCaptureDeviceManager to enumerate CoreAudio devices.

Refactor RealtimeMediaSourceCenter and RealtimeMediaSourceCenterMac to provide independent audio and video capture device managers
and the abiliity to override the capture device managers.

CoreAudioCaptureSource now uses CoreAudioCaptureDeviceManager to use the specified device instead of the default one.

* WebCore.xcodeproj/project.pbxproj:
* platform/mediastream/CaptureDeviceManager.cpp:
(CaptureDeviceManager::getAudioSourcesInfo):
(CaptureDeviceManager::getVideoSourcesInfo):
(CaptureDeviceManager::getSourcesInfo): Deleted.
* platform/mediastream/CaptureDeviceManager.h:
* platform/mediastream/RealtimeMediaSourceCenter.cpp:
(WebCore::RealtimeMediaSourceCenter::setAudioCaptureDeviceManager):
(WebCore::RealtimeMediaSourceCenter::unsetAudioCaptureDeviceManager):
(WebCore::RealtimeMediaSourceCenter::setVideoCaptureDeviceManager):
(WebCore::RealtimeMediaSourceCenter::unsetVideoCaptureDeviceManager):
* platform/mediastream/RealtimeMediaSourceCenter.h:
(WebCore::RealtimeMediaSourceCenter::defaultAudioCaptureDeviceManager):
(WebCore::RealtimeMediaSourceCenter::defaultVideoCaptureDeviceManager):
(WebCore::RealtimeMediaSourceCenter::audioCaptureDeviceManager):
(WebCore::RealtimeMediaSourceCenter::videoCaptureDeviceManager):
* platform/mediastream/mac/AVCaptureDeviceManager.h:
* platform/mediastream/mac/AVCaptureDeviceManager.mm:
(WebCore::AVCaptureDeviceManager::refreshAVCaptureDevicesOfType):
(WebCore::AVCaptureDeviceManager::refreshCaptureDevices):
(WebCore::AVCaptureDeviceManager::getAudioSourcesInfo):
(WebCore::AVCaptureDeviceManager::getVideoSourcesInfo):
(WebCore::AVCaptureDeviceManager::setUseAVFoundationAudioCapture): Deleted.
(WebCore::AVCaptureDeviceManager::getSourcesInfo): Deleted.
* platform/mediastream/mac/CoreAudioCaptureDevice.cpp: Added.
(WebCore::getDeviceInfo):
(WebCore::CoreAudioCaptureDevice::create):
(WebCore::CoreAudioCaptureDevice::CoreAudioCaptureDevice):
(WebCore::CoreAudioCaptureDevice::deviceID):
(WebCore::CoreAudioCaptureDevice::deviceClock):
(WebCore::CoreAudioCaptureDevice::isAlive):
* platform/mediastream/mac/CoreAudioCaptureDevice.h: Copied from Source/WebCore/platform/mediastream/CaptureDeviceManager.h.
* platform/mediastream/mac/CoreAudioCaptureDeviceManager.cpp: Added.
(WebCore::CoreAudioCaptureDeviceManager::singleton):
(WebCore::CoreAudioCaptureDeviceManager::captureDevices):
(WebCore::deviceHasInputStreams):
(WebCore::CoreAudioCaptureDeviceManager::coreAudioCaptureDevices):
(WebCore::CoreAudioCaptureDeviceManager::refreshAudioCaptureDevices):
(WebCore::CoreAudioCaptureDeviceManager::devicesChanged):
* platform/mediastream/mac/CoreAudioCaptureDeviceManager.h: Copied from Source/WebCore/platform/mediastream/CaptureDeviceManager.h.
* platform/mediastream/mac/CoreAudioCaptureSource.cpp:
(WebCore::CoreAudioCaptureSource::CoreAudioCaptureSource):
(WebCore::CoreAudioCaptureSource::startProducingData):
(WebCore::CoreAudioCaptureSource::stopProducingData):
* platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp:
(WebCore::RealtimeMediaSourceCenterMac::setUseAVFoundationAudioCapture):
(WebCore::RealtimeMediaSourceCenterMac::RealtimeMediaSourceCenterMac):
(WebCore::RealtimeMediaSourceCenterMac::createMediaStream):
(WebCore::RealtimeMediaSourceCenterMac::getMediaStreamDevices):
* platform/mediastream/mac/RealtimeMediaSourceCenterMac.h:

Source/WebKit2:

Reviewed by Tim Horton.

setUseAVFoundationAudioCapture is moved from AVCaptureDeviceManager to RealtimeMediaSourceCenterMac.

* UIProcess/UserMediaPermissionRequestManagerProxy.cpp:
(WebKit::UserMediaPermissionRequestManagerProxy::syncWithWebCorePrefs):

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (215417 => 215418)


--- trunk/Source/WebCore/ChangeLog	2017-04-17 16:37:26 UTC (rev 215417)
+++ trunk/Source/WebCore/ChangeLog	2017-04-17 17:00:52 UTC (rev 215418)
@@ -1,3 +1,68 @@
+2017-04-17  Jeremy Jones  <jere...@apple.com>
+
+        Refactor enumerateDevices to allow separate CaptureDeviceManagers for audio and video.
+        https://bugs.webkit.org/show_bug.cgi?id=170778
+
+        Reviewed by Eric Carlson.
+
+        Add CoreAudioCaptureDeviceManager to enumerate CoreAudio devices.
+
+        Refactor RealtimeMediaSourceCenter and RealtimeMediaSourceCenterMac to provide independent audio and video capture device managers
+        and the abiliity to override the capture device managers.
+
+        CoreAudioCaptureSource now uses CoreAudioCaptureDeviceManager to use the specified device instead of the default one. 
+
+        * WebCore.xcodeproj/project.pbxproj:
+        * platform/mediastream/CaptureDeviceManager.cpp:
+        (CaptureDeviceManager::getAudioSourcesInfo):
+        (CaptureDeviceManager::getVideoSourcesInfo):
+        (CaptureDeviceManager::getSourcesInfo): Deleted.
+        * platform/mediastream/CaptureDeviceManager.h:
+        * platform/mediastream/RealtimeMediaSourceCenter.cpp:
+        (WebCore::RealtimeMediaSourceCenter::setAudioCaptureDeviceManager):
+        (WebCore::RealtimeMediaSourceCenter::unsetAudioCaptureDeviceManager):
+        (WebCore::RealtimeMediaSourceCenter::setVideoCaptureDeviceManager):
+        (WebCore::RealtimeMediaSourceCenter::unsetVideoCaptureDeviceManager):
+        * platform/mediastream/RealtimeMediaSourceCenter.h:
+        (WebCore::RealtimeMediaSourceCenter::defaultAudioCaptureDeviceManager):
+        (WebCore::RealtimeMediaSourceCenter::defaultVideoCaptureDeviceManager):
+        (WebCore::RealtimeMediaSourceCenter::audioCaptureDeviceManager):
+        (WebCore::RealtimeMediaSourceCenter::videoCaptureDeviceManager):
+        * platform/mediastream/mac/AVCaptureDeviceManager.h:
+        * platform/mediastream/mac/AVCaptureDeviceManager.mm:
+        (WebCore::AVCaptureDeviceManager::refreshAVCaptureDevicesOfType):
+        (WebCore::AVCaptureDeviceManager::refreshCaptureDevices):
+        (WebCore::AVCaptureDeviceManager::getAudioSourcesInfo):
+        (WebCore::AVCaptureDeviceManager::getVideoSourcesInfo):
+        (WebCore::AVCaptureDeviceManager::setUseAVFoundationAudioCapture): Deleted.
+        (WebCore::AVCaptureDeviceManager::getSourcesInfo): Deleted.
+        * platform/mediastream/mac/CoreAudioCaptureDevice.cpp: Added.
+        (WebCore::getDeviceInfo):
+        (WebCore::CoreAudioCaptureDevice::create):
+        (WebCore::CoreAudioCaptureDevice::CoreAudioCaptureDevice):
+        (WebCore::CoreAudioCaptureDevice::deviceID):
+        (WebCore::CoreAudioCaptureDevice::deviceClock):
+        (WebCore::CoreAudioCaptureDevice::isAlive):
+        * platform/mediastream/mac/CoreAudioCaptureDevice.h: Copied from Source/WebCore/platform/mediastream/CaptureDeviceManager.h.
+        * platform/mediastream/mac/CoreAudioCaptureDeviceManager.cpp: Added.
+        (WebCore::CoreAudioCaptureDeviceManager::singleton):
+        (WebCore::CoreAudioCaptureDeviceManager::captureDevices):
+        (WebCore::deviceHasInputStreams):
+        (WebCore::CoreAudioCaptureDeviceManager::coreAudioCaptureDevices):
+        (WebCore::CoreAudioCaptureDeviceManager::refreshAudioCaptureDevices):
+        (WebCore::CoreAudioCaptureDeviceManager::devicesChanged):
+        * platform/mediastream/mac/CoreAudioCaptureDeviceManager.h: Copied from Source/WebCore/platform/mediastream/CaptureDeviceManager.h.
+        * platform/mediastream/mac/CoreAudioCaptureSource.cpp:
+        (WebCore::CoreAudioCaptureSource::CoreAudioCaptureSource):
+        (WebCore::CoreAudioCaptureSource::startProducingData):
+        (WebCore::CoreAudioCaptureSource::stopProducingData):
+        * platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp:
+        (WebCore::RealtimeMediaSourceCenterMac::setUseAVFoundationAudioCapture):
+        (WebCore::RealtimeMediaSourceCenterMac::RealtimeMediaSourceCenterMac):
+        (WebCore::RealtimeMediaSourceCenterMac::createMediaStream):
+        (WebCore::RealtimeMediaSourceCenterMac::getMediaStreamDevices):
+        * platform/mediastream/mac/RealtimeMediaSourceCenterMac.h:
+
 2017-04-17  Ryan Haddad  <ryanhad...@apple.com>
 
         Unreviewed, rolling out r215366.

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (215417 => 215418)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2017-04-17 16:37:26 UTC (rev 215417)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2017-04-17 17:00:52 UTC (rev 215418)
@@ -1671,6 +1671,10 @@
 		3F2B33EF165AF15600E3987C /* JSWebKitCSSViewportRule.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F2B33EA165AF15500E3987C /* JSWebKitCSSViewportRule.h */; };
 		3F42B31D1881191B00278AAC /* WebVideoFullscreenControllerAVKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F42B31B1881191B00278AAC /* WebVideoFullscreenControllerAVKit.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		3F42B31E1881191B00278AAC /* WebVideoFullscreenControllerAVKit.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3F42B31C1881191B00278AAC /* WebVideoFullscreenControllerAVKit.mm */; };
+		3F8020351E9E47BF00DEC61D /* CoreAudioCaptureDevice.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F8020321E9E381D00DEC61D /* CoreAudioCaptureDevice.h */; };
+		3F8020361E9E47C300DEC61D /* CoreAudioCaptureDevice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3F8020311E9E381D00DEC61D /* CoreAudioCaptureDevice.cpp */; };
+		3F8020371E9E47C500DEC61D /* CoreAudioCaptureDeviceManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F8020341E9E381D00DEC61D /* CoreAudioCaptureDeviceManager.h */; };
+		3F8020381E9E47C900DEC61D /* CoreAudioCaptureDeviceManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3F8020331E9E381D00DEC61D /* CoreAudioCaptureDeviceManager.cpp */; };
 		3FBC4AF3189881560046EE38 /* WebVideoFullscreenInterfaceAVKit.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3FBC4AF1189881560046EE38 /* WebVideoFullscreenInterfaceAVKit.mm */; };
 		3FBC4AF4189881560046EE38 /* WebVideoFullscreenInterfaceAVKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 3FBC4AF2189881560046EE38 /* WebVideoFullscreenInterfaceAVKit.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		3FF1FA661E7350FD00C1002F /* CoreAudioCaptureSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3F3BB5821E709EE400C701F2 /* CoreAudioCaptureSource.cpp */; };
@@ -9270,6 +9274,10 @@
 		3F3BB5831E709EE400C701F2 /* CoreAudioCaptureSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CoreAudioCaptureSource.h; sourceTree = "<group>"; };
 		3F42B31B1881191B00278AAC /* WebVideoFullscreenControllerAVKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebVideoFullscreenControllerAVKit.h; sourceTree = "<group>"; };
 		3F42B31C1881191B00278AAC /* WebVideoFullscreenControllerAVKit.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebVideoFullscreenControllerAVKit.mm; sourceTree = "<group>"; };
+		3F8020311E9E381D00DEC61D /* CoreAudioCaptureDevice.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CoreAudioCaptureDevice.cpp; sourceTree = "<group>"; };
+		3F8020321E9E381D00DEC61D /* CoreAudioCaptureDevice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CoreAudioCaptureDevice.h; sourceTree = "<group>"; };
+		3F8020331E9E381D00DEC61D /* CoreAudioCaptureDeviceManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CoreAudioCaptureDeviceManager.cpp; sourceTree = "<group>"; };
+		3F8020341E9E381D00DEC61D /* CoreAudioCaptureDeviceManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CoreAudioCaptureDeviceManager.h; sourceTree = "<group>"; };
 		3FBC4AF1189881560046EE38 /* WebVideoFullscreenInterfaceAVKit.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebVideoFullscreenInterfaceAVKit.mm; sourceTree = "<group>"; };
 		3FBC4AF2189881560046EE38 /* WebVideoFullscreenInterfaceAVKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebVideoFullscreenInterfaceAVKit.h; sourceTree = "<group>"; };
 		3FFFF9A6159D9A550020BBD5 /* WebKitCSSViewportRule.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebKitCSSViewportRule.cpp; sourceTree = "<group>"; };
@@ -16141,8 +16149,12 @@
 				070363DD181A1CDC00C074A5 /* AVMediaCaptureSource.mm */,
 				070363DE181A1CDC00C074A5 /* AVVideoCaptureSource.h */,
 				070363DF181A1CDC00C074A5 /* AVVideoCaptureSource.mm */,
+				3F3BB5831E709EE400C701F2 /* CoreAudioCaptureSource.h */,
 				3F3BB5821E709EE400C701F2 /* CoreAudioCaptureSource.cpp */,
-				3F3BB5831E709EE400C701F2 /* CoreAudioCaptureSource.h */,
+				3F8020321E9E381D00DEC61D /* CoreAudioCaptureDevice.h */,
+				3F8020311E9E381D00DEC61D /* CoreAudioCaptureDevice.cpp */,
+				3F8020341E9E381D00DEC61D /* CoreAudioCaptureDeviceManager.h */,
+				3F8020331E9E381D00DEC61D /* CoreAudioCaptureDeviceManager.cpp */,
 				0744ECEB1E0C4AE5000D0944 /* MockRealtimeAudioSourceMac.h */,
 				0744ECEC1E0C4AE5000D0944 /* MockRealtimeAudioSourceMac.mm */,
 				07EE76ED1BEA619800F89133 /* MockRealtimeVideoSourceMac.h */,
@@ -28157,6 +28169,7 @@
 				7118FED515685CC60030B79A /* JSSVGViewSpec.h in Headers */,
 				8485227E1190162C006EDC7F /* JSSVGVKernElement.h in Headers */,
 				71DCB7021568197600862271 /* JSSVGZoomAndPan.h in Headers */,
+				3F8020351E9E47BF00DEC61D /* CoreAudioCaptureDevice.h in Headers */,
 				B2FA3E190AB75A6F000E5AC4 /* JSSVGZoomEvent.h in Headers */,
 				65DF320409D1CC60000BE325 /* JSText.h in Headers */,
 				933A14B90B7D1D5200A53FFD /* JSTextEvent.h in Headers */,
@@ -28733,6 +28746,7 @@
 				1AD8F81B11CAB9E900E93E54 /* PlatformStrategies.h in Headers */,
 				0F7D07331884C56C00B4AF86 /* PlatformTextTrack.h in Headers */,
 				074E82BB18A69F0E007EF54C /* PlatformTimeRanges.h in Headers */,
+				3F8020371E9E47C500DEC61D /* CoreAudioCaptureDeviceManager.h in Headers */,
 				52B0D4BE1C57FD1E0077CE53 /* PlatformView.h in Headers */,
 				935C476B09AC4D4F00A6AAB4 /* PlatformWheelEvent.h in Headers */,
 				1AFFC4591D5E866100267A66 /* PluginBlacklist.h in Headers */,
@@ -31811,6 +31825,7 @@
 				511EF2C417F0FD3500E4FA16 /* JSIDBFactory.cpp in Sources */,
 				511EF2C517F0FD3500E4FA16 /* JSIDBIndex.cpp in Sources */,
 				5141299B1C6C16740059E714 /* JSIDBIndexCustom.cpp in Sources */,
+				3F8020361E9E47C300DEC61D /* CoreAudioCaptureDevice.cpp in Sources */,
 				511EF2C617F0FD3500E4FA16 /* JSIDBKeyRange.cpp in Sources */,
 				511EF2C717F0FD3500E4FA16 /* JSIDBObjectStore.cpp in Sources */,
 				511EF2D117F0FDF100E4FA16 /* JSIDBObjectStoreCustom.cpp in Sources */,
@@ -33257,6 +33272,7 @@
 				8419D2AC120D92FC00141F8F /* SVGPathByteStreamSource.cpp in Sources */,
 				B2227A580D00BF220071B782 /* SVGPathElement.cpp in Sources */,
 				8476C9EF11DF6A5800555B02 /* SVGPathParser.cpp in Sources */,
+				3F8020381E9E47C900DEC61D /* CoreAudioCaptureDeviceManager.cpp in Sources */,
 				7C39C3711DDBB8AE00FEFB29 /* SVGPathSegList.cpp in Sources */,
 				8476C9E511DF6A0B00555B02 /* SVGPathSegListBuilder.cpp in Sources */,
 				84B6B977120F13E500B8EFAF /* SVGPathSegListSource.cpp in Sources */,

Modified: trunk/Source/WebCore/page/Settings.cpp (215417 => 215418)


--- trunk/Source/WebCore/page/Settings.cpp	2017-04-17 16:37:26 UTC (rev 215417)
+++ trunk/Source/WebCore/page/Settings.cpp	2017-04-17 17:00:52 UTC (rev 215418)
@@ -49,7 +49,7 @@
 #include <wtf/StdLibExtras.h>
 
 #if ENABLE(MEDIA_STREAM) && USE(AVFOUNDATION)
-#include "AVCaptureDeviceManager.h"
+#include "RealtimeMediaSourceCenterMac.h"
 #endif
 
 #if ENABLE(MEDIA_STREAM)
@@ -630,7 +630,7 @@
 {
     gUseAVFoundationAudioCapture = useAVFoundationAudioCapture;
 #if USE(AVFOUNDATION)
-    AVCaptureDeviceManager::setUseAVFoundationAudioCapture(useAVFoundationAudioCapture);
+    RealtimeMediaSourceCenterMac::setUseAVFoundationAudioCapture(useAVFoundationAudioCapture);
 #endif
 }
 #endif

Modified: trunk/Source/WebCore/platform/mediastream/CaptureDeviceManager.cpp (215417 => 215418)


--- trunk/Source/WebCore/platform/mediastream/CaptureDeviceManager.cpp	2017-04-17 16:37:26 UTC (rev 215417)
+++ trunk/Source/WebCore/platform/mediastream/CaptureDeviceManager.cpp	2017-04-17 17:00:52 UTC (rev 215418)
@@ -44,11 +44,11 @@
 {
 }
 
-Vector<CaptureDevice> CaptureDeviceManager::getSourcesInfo()
+Vector<CaptureDevice> CaptureDeviceManager::getAudioSourcesInfo()
 {
     Vector<CaptureDevice> sourcesInfo;
-    for (auto captureDevice : captureDevices()) {
-        if (!captureDevice.enabled() || captureDevice.type() == CaptureDevice::DeviceType::Unknown)
+    for (auto& captureDevice : captureDevices()) {
+        if (!captureDevice.enabled() || captureDevice.type() != CaptureDevice::DeviceType::Audio)
             continue;
 
         sourcesInfo.append(captureDevice);
@@ -57,6 +57,19 @@
     return sourcesInfo;
 }
 
+Vector<CaptureDevice> CaptureDeviceManager::getVideoSourcesInfo()
+{
+    Vector<CaptureDevice> sourcesInfo;
+    for (auto& captureDevice : captureDevices()) {
+        if (!captureDevice.enabled() || captureDevice.type() != CaptureDevice::DeviceType::Video)
+            continue;
+
+        sourcesInfo.append(captureDevice);
+    }
+    LOG(Media, "CaptureDeviceManager::getSourcesInfo(%p), found %zu active devices", this, sourcesInfo.size());
+    return sourcesInfo;
+}
+
 bool CaptureDeviceManager::captureDeviceFromDeviceID(const String& captureDeviceID, CaptureDevice& foundDevice)
 {
     for (auto& device : captureDevices()) {

Modified: trunk/Source/WebCore/platform/mediastream/CaptureDeviceManager.h (215417 => 215418)


--- trunk/Source/WebCore/platform/mediastream/CaptureDeviceManager.h	2017-04-17 16:37:26 UTC (rev 215417)
+++ trunk/Source/WebCore/platform/mediastream/CaptureDeviceManager.h	2017-04-17 17:00:52 UTC (rev 215418)
@@ -36,7 +36,8 @@
 public:
     virtual Vector<CaptureDevice>& captureDevices() = 0;
     virtual void refreshCaptureDevices() { }
-    virtual Vector<CaptureDevice> getSourcesInfo();
+    virtual Vector<CaptureDevice> getAudioSourcesInfo();
+    virtual Vector<CaptureDevice> getVideoSourcesInfo();
     virtual std::optional<CaptureDevice> deviceWithUID(const String&, RealtimeMediaSource::Type);
 
 protected:

Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.cpp (215417 => 215418)


--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.cpp	2017-04-17 16:37:26 UTC (rev 215417)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.cpp	2017-04-17 17:00:52 UTC (rev 215418)
@@ -88,6 +88,28 @@
         m_videoFactory = nullptr;
 }
 
+void RealtimeMediaSourceCenter::setAudioCaptureDeviceManager(CaptureDeviceManager& deviceManager)
+{
+    m_audioCaptureDeviceManager = &deviceManager;
+}
+
+void RealtimeMediaSourceCenter::unsetAudioCaptureDeviceManager(CaptureDeviceManager& deviceManager)
+{
+    if (m_audioCaptureDeviceManager == &deviceManager)
+        m_audioCaptureDeviceManager = nullptr;
+}
+
+void RealtimeMediaSourceCenter::setVideoCaptureDeviceManager(CaptureDeviceManager& deviceManager)
+{
+    m_videoCaptureDeviceManager = &deviceManager;
+}
+
+void RealtimeMediaSourceCenter::unsetVideoCaptureDeviceManager(CaptureDeviceManager& deviceManager)
+{
+    if (m_videoCaptureDeviceManager == &deviceManager)
+        m_videoCaptureDeviceManager = nullptr;
+}
+    
 } // namespace WebCore
 
 #endif // ENABLE(MEDIA_STREAM)

Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.h (215417 => 215418)


--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.h	2017-04-17 16:37:26 UTC (rev 215417)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.h	2017-04-17 17:00:52 UTC (rev 215418)
@@ -42,6 +42,7 @@
 namespace WebCore {
 
 class CaptureDevice;
+class CaptureDeviceManager;
 class MediaConstraints;
 class RealtimeMediaSourceSettings;
 class RealtimeMediaSourceSupportedConstraints;
@@ -76,6 +77,17 @@
     WEBCORE_EXPORT void unsetVideoFactory(RealtimeMediaSource::CaptureFactory&);
     RealtimeMediaSource::CaptureFactory* videoFactory() const { return m_videoFactory; }
 
+    virtual CaptureDeviceManager* defaultAudioCaptureDeviceManager() { return nullptr; }
+    virtual CaptureDeviceManager* defaultVideoCaptureDeviceManager() { return nullptr; }
+
+    WEBCORE_EXPORT void setAudioCaptureDeviceManager(CaptureDeviceManager&);
+    WEBCORE_EXPORT void unsetAudioCaptureDeviceManager(CaptureDeviceManager&);
+    CaptureDeviceManager* audioCaptureDeviceManager() const { return m_audioCaptureDeviceManager; }
+
+    WEBCORE_EXPORT void setVideoCaptureDeviceManager(CaptureDeviceManager&);
+    WEBCORE_EXPORT void unsetVideoCaptureDeviceManager(CaptureDeviceManager&);
+    CaptureDeviceManager* videoCaptureDeviceManager() const { return m_videoCaptureDeviceManager; }
+
 protected:
     RealtimeMediaSourceCenter();
 
@@ -84,6 +96,9 @@
 
     RealtimeMediaSource::CaptureFactory* m_audioFactory { nullptr };
     RealtimeMediaSource::CaptureFactory* m_videoFactory { nullptr };
+
+    CaptureDeviceManager* m_audioCaptureDeviceManager { nullptr };
+    CaptureDeviceManager* m_videoCaptureDeviceManager { nullptr };
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.h (215417 => 215418)


--- trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.h	2017-04-17 16:37:26 UTC (rev 215417)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.h	2017-04-17 17:00:52 UTC (rev 215418)
@@ -51,11 +51,12 @@
 
     static AVCaptureDeviceManager& singleton();
 
-    Vector<CaptureDevice> getSourcesInfo() final;
-
     void deviceConnected();
     void deviceDisconnected(AVCaptureDevice*);
 
+    Vector<CaptureDevice> getAudioSourcesInfo() final;
+    Vector<CaptureDevice> getVideoSourcesInfo() final;
+
 protected:
     static bool isAvailable();
 
@@ -64,6 +65,7 @@
 
     void refreshCaptureDevices() final;
     void registerForDeviceNotifications();
+    void refreshAVCaptureDevicesOfType(CaptureDevice::DeviceType);
 
     RetainPtr<WebCoreAVCaptureDeviceManagerObserver> m_objcObserver;
     Vector<CaptureDevice> m_devices;

Modified: trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.mm (215417 => 215418)


--- trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.mm	2017-04-17 16:37:26 UTC (rev 215417)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.mm	2017-04-17 17:00:52 UTC (rev 215418)
@@ -32,7 +32,6 @@
 #import "AVMediaCaptureSource.h"
 #import "AVVideoCaptureSource.h"
 #import "AudioSourceProvider.h"
-#import "CoreAudioCaptureSource.h"
 #import "Logging.h"
 #import "MediaConstraints.h"
 #import "RealtimeMediaSource.h"
@@ -93,19 +92,6 @@
 
 namespace WebCore {
 
-void AVCaptureDeviceManager::setUseAVFoundationAudioCapture(bool enabled)
-{
-    static bool active = false;
-    if (active == enabled)
-        return;
-
-    active = enabled;
-    if (active)
-        RealtimeMediaSourceCenter::singleton().setAudioFactory(AVAudioCaptureSource::factory());
-    else
-        RealtimeMediaSourceCenter::singleton().setAudioFactory(CoreAudioCaptureSource::factory());
-}
-
 Vector<CaptureDevice>& AVCaptureDeviceManager::captureDevices()
 {
     if (!isAvailable())
@@ -134,32 +120,34 @@
     return true;
 }
 
-void AVCaptureDeviceManager::refreshCaptureDevices()
+void AVCaptureDeviceManager::refreshAVCaptureDevicesOfType(CaptureDevice::DeviceType type)
 {
+    ASSERT(type == CaptureDevice::DeviceType::Video || type == CaptureDevice::DeviceType::Audio);
+
+    NSString *platformType = (type == CaptureDevice::DeviceType::Video) ? AVMediaTypeVideo : AVMediaTypeAudio;
+
     for (AVCaptureDeviceTypedef *platformDevice in [getAVCaptureDeviceClass() devices]) {
 
-        CaptureDevice captureDevice;
-        if (!captureDeviceFromDeviceID(platformDevice.uniqueID, captureDevice)) {
-            bool hasAudio = [platformDevice hasMediaType:AVMediaTypeAudio] || [platformDevice hasMediaType:AVMediaTypeMuxed];
-            bool hasVideo = [platformDevice hasMediaType:AVMediaTypeVideo] || [platformDevice hasMediaType:AVMediaTypeMuxed];
-            if (!hasAudio && !hasVideo)
-                continue;
+        bool hasMatchingType = [platformDevice hasMediaType:platformType] || [platformDevice hasMediaType:AVMediaTypeMuxed];
+        if (!hasMatchingType)
+            continue;
 
-            CaptureDevice::DeviceType type = hasVideo ? CaptureDevice::DeviceType::Video : CaptureDevice::DeviceType::Audio;
-            CaptureDevice captureDevice(platformDevice.uniqueID, type, platformDevice.localizedName);
-            captureDevice.setEnabled(deviceIsAvailable(platformDevice));
-            m_devices.append(captureDevice);
+        CaptureDevice existingCaptureDevice;
+        if (captureDeviceFromDeviceID(platformDevice.uniqueID, existingCaptureDevice) && existingCaptureDevice.type() == type)
+            continue;
 
-            if (hasVideo && hasAudio) {
-                // Add the audio component as a separate device.
-                CaptureDevice audioCaptureDevice(platformDevice.uniqueID, CaptureDevice::DeviceType::Audio, platformDevice.localizedName);
-                captureDevice.setEnabled(deviceIsAvailable(platformDevice));
-                m_devices.append(audioCaptureDevice);
-            }
-        }
+        CaptureDevice captureDevice(platformDevice.uniqueID, type, platformDevice.localizedName);
+        captureDevice.setEnabled(deviceIsAvailable(platformDevice));
+        m_devices.append(captureDevice);
     }
 }
 
+void AVCaptureDeviceManager::refreshCaptureDevices()
+{
+    refreshAVCaptureDevicesOfType(CaptureDevice::DeviceType::Video);
+    refreshAVCaptureDevicesOfType(CaptureDevice::DeviceType::Audio);
+}
+
 bool AVCaptureDeviceManager::isAvailable()
 {
     return AVFoundationLibrary();
@@ -182,14 +170,22 @@
     [m_objcObserver disconnect];
 }
 
-Vector<CaptureDevice> AVCaptureDeviceManager::getSourcesInfo()
+Vector<CaptureDevice> AVCaptureDeviceManager::getAudioSourcesInfo()
 {
     if (!isAvailable())
         return Vector<CaptureDevice>();
 
-    return CaptureDeviceManager::getSourcesInfo();
+    return CaptureDeviceManager::getAudioSourcesInfo();
 }
 
+Vector<CaptureDevice> AVCaptureDeviceManager::getVideoSourcesInfo()
+{
+    if (!isAvailable())
+        return Vector<CaptureDevice>();
+
+    return CaptureDeviceManager::getVideoSourcesInfo();
+}
+
 void AVCaptureDeviceManager::registerForDeviceNotifications()
 {
     [[NSNotificationCenter defaultCenter] addObserver:m_objcObserver.get() selector:@selector(deviceConnected:) name:AVCaptureDeviceWasConnectedNotification object:nil];

Added: trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureDevice.cpp (0 => 215418)


--- trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureDevice.cpp	                        (rev 0)
+++ trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureDevice.cpp	2017-04-17 17:00:52 UTC (rev 215418)
@@ -0,0 +1,117 @@
+/*
+ * 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. ``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
+ * 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 "CoreAudioCaptureDevice.h"
+
+#if ENABLE(MEDIA_STREAM) && PLATFORM(MAC)
+
+#include "CaptureDeviceManager.h"
+#include "Logging.h"
+#include <AudioUnit/AudioUnit.h>
+#include <CoreMedia/CMSync.h>
+
+#import "CoreMediaSoftLink.h"
+
+namespace WebCore {
+
+static bool getDeviceInfo(uint32_t deviceID, String& persistentID, String& label)
+{
+    CFStringRef uniqueID;
+    AudioObjectPropertyAddress address { kAudioDevicePropertyDeviceUID, kAudioDevicePropertyScopeInput, kAudioObjectPropertyElementMaster };
+    UInt32 dataSize = sizeof(uniqueID);
+    auto err = AudioObjectGetPropertyData(static_cast<UInt32>(deviceID), &address, 0, nullptr, &dataSize, &uniqueID);
+    if (err) {
+        LOG(Media, "CoreAudioCaptureDevice::getDeviceInfo failed to get device unique id with error %d (%.4s)", (int)err, (char*)&err);
+        return false;
+    }
+    persistentID = uniqueID;
+    CFRelease(uniqueID);
+
+    CFStringRef localizedName;
+    address = { kAudioObjectPropertyName, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster };
+    dataSize = sizeof(localizedName);
+    err = AudioObjectGetPropertyData(static_cast<UInt32>(deviceID), &address, 0, nullptr, &dataSize, &localizedName);
+    if (err) {
+        LOG(Media, "CoreAudioCaptureDevice::getDeviceInfo failed to get device name with error %d (%.4s)", (int)err, (char*)&err);
+        return false;
+    }
+    label = localizedName;
+    CFRelease(localizedName);
+
+    return true;
+}
+
+RefPtr<CoreAudioCaptureDevice> CoreAudioCaptureDevice::create(uint32_t deviceID)
+{
+    String persistentID;
+    String label;
+    if (!getDeviceInfo(deviceID, persistentID, label))
+        return nullptr;
+
+    return adoptRef(new CoreAudioCaptureDevice(deviceID, persistentID, label));
+}
+
+CoreAudioCaptureDevice::CoreAudioCaptureDevice(uint32_t deviceID, const String& persistentID, const String& label)
+    : CaptureDevice(persistentID, CaptureDevice::DeviceType::Audio, label)
+    , m_deviceID(deviceID)
+{
+}
+
+uint32_t CoreAudioCaptureDevice::deviceID()
+{
+    return m_deviceID;
+}
+
+RetainPtr<CMClockRef> CoreAudioCaptureDevice::deviceClock()
+{
+    if (m_deviceClock)
+        return m_deviceClock;
+
+    CMClockRef clock;
+    auto err = CMAudioDeviceClockCreate(kCFAllocatorDefault, persistentId().createCFString().get(), &clock);
+    if (err) {
+        LOG(Media, "CoreAudioCaptureDevice::CMAudioDeviceClockCreate(%p) CMAudioDeviceClockCreate failed with error %d (%.4s)", this, (int)err, (char*)&err);
+        return nullptr;
+    }
+
+    m_deviceClock = adoptCF(clock);
+
+    return m_deviceClock;
+}
+
+bool CoreAudioCaptureDevice::isAlive()
+{
+    AudioObjectPropertyAddress address = { kAudioDevicePropertyDeviceIsAlive, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster };
+    UInt32 state = 0;
+    UInt32 dataSize = sizeof(state);
+    if (AudioObjectGetPropertyData(static_cast<UInt32>(m_deviceID), &address, 0, nullptr, &dataSize, &state))
+        return false;
+    return state;
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(MEDIA_STREAM) && PLATFORM(MAC)

Copied: trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureDevice.h (from rev 215417, trunk/Source/WebCore/platform/mediastream/CaptureDeviceManager.h) (0 => 215418)


--- trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureDevice.h	                        (rev 0)
+++ trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureDevice.h	2017-04-17 17:00:52 UTC (rev 215418)
@@ -0,0 +1,59 @@
+/*
+ * 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. ``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
+ * 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 ENABLE(MEDIA_STREAM) && PLATFORM(MAC)
+
+#include "CaptureDevice.h"
+#include <wtf/RefPtr.h>
+#include <wtf/text/WTFString.h>
+
+typedef struct OpaqueCMClock* CMClockRef;
+
+namespace WebCore {
+
+class CoreAudioCaptureDevice : public CaptureDevice, public RefCounted<CoreAudioCaptureDevice> {
+public:
+
+    static RefPtr<CoreAudioCaptureDevice> create(uint32_t);
+    virtual ~CoreAudioCaptureDevice() = default;
+
+    uint32_t deviceID();
+    RetainPtr<CMClockRef> deviceClock();
+    bool isAlive();
+
+private:
+    CoreAudioCaptureDevice(uint32_t, const String& persistentID, const String& label);
+
+    uint32_t m_deviceID { 0 };
+    RetainPtr<CMClockRef> m_deviceClock;
+};
+
+
+} // namespace WebCore
+
+#endif // ENABLE(MEDIA_STREAM) && PLATFORM(MAC)
+

Added: trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureDeviceManager.cpp (0 => 215418)


--- trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureDeviceManager.cpp	                        (rev 0)
+++ trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureDeviceManager.cpp	2017-04-17 17:00:52 UTC (rev 215418)
@@ -0,0 +1,140 @@
+/*
+ * 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. ``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
+ * 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 "CoreAudioCaptureDeviceManager.h"
+
+#if ENABLE(MEDIA_STREAM) && PLATFORM(MAC)
+
+#include "CoreAudioCaptureDevice.h"
+#include "Logging.h"
+#include <AudioUnit/AudioUnit.h>
+#include <CoreMedia/CMSync.h>
+#include <wtf/NeverDestroyed.h>
+
+#import "CoreMediaSoftLink.h"
+
+namespace WebCore {
+
+CoreAudioCaptureDeviceManager& CoreAudioCaptureDeviceManager::singleton()
+{
+    static NeverDestroyed<CoreAudioCaptureDeviceManager> manager;
+    return manager;
+}
+
+Vector<CaptureDevice>& CoreAudioCaptureDeviceManager::captureDevices()
+{
+    coreAudioCaptureDevices();
+    return m_devices;
+}
+
+static bool deviceHasInputStreams(AudioObjectID deviceID)
+{
+    UInt32 dataSize = 0;
+    AudioObjectPropertyAddress address = { kAudioDevicePropertyStreams, kAudioDevicePropertyScopeInput, kAudioObjectPropertyElementMaster };
+    auto err = AudioObjectGetPropertyDataSize(deviceID, &address, 0, nullptr, &dataSize);
+
+    return !err && dataSize;
+}
+
+Vector<Ref<CoreAudioCaptureDevice>>& CoreAudioCaptureDeviceManager::coreAudioCaptureDevices()
+{
+    static bool initialized;
+    if (!initialized) {
+        initialized = true;
+        refreshAudioCaptureDevices();
+
+        AudioObjectPropertyAddress address = { kAudioHardwarePropertyDevices, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster };
+        auto err = AudioObjectAddPropertyListener(kAudioObjectSystemObject, &address, devicesChanged, this);
+        if (err)
+            LOG_ERROR("CoreAudioCaptureDeviceManager::devices(%p) AudioObjectAddPropertyListener returned error %d (%.4s)", this, (int)err, (char*)&err);
+    }
+
+    return m_coreAudioCaptureDevices;
+}
+
+void CoreAudioCaptureDeviceManager::refreshAudioCaptureDevices()
+{
+    AudioObjectPropertyAddress address = { kAudioHardwarePropertyDevices, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster };
+    UInt32 dataSize = 0;
+    auto err = AudioObjectGetPropertyDataSize(kAudioObjectSystemObject, &address, 0, nullptr, &dataSize);
+    if (err) {
+        LOG(Media, "CoreAudioCaptureDeviceManager::refreshAudioCaptureDevices(%p) failed to get size of device list %d (%.4s)", this, (int)err, (char*)&err);
+        return;
+    }
+
+    size_t deviceCount = dataSize / sizeof(AudioObjectID);
+    AudioObjectID deviceIDs[deviceCount];
+    err = AudioObjectGetPropertyData(kAudioObjectSystemObject, &address, 0, nullptr, &dataSize, deviceIDs);
+    if (err) {
+        LOG(Media, "CoreAudioCaptureDeviceManager::refreshAudioCaptureDevices(%p) failed to get device list %d (%.4s)", this, (int)err, (char*)&err);
+        return;
+    }
+
+    bool haveDeviceChanges = false;
+    for (size_t i = 0; i < deviceCount; i++) {
+        AudioObjectID deviceID = deviceIDs[i];
+        if (!deviceHasInputStreams(deviceID))
+            continue;
+
+        if (std::any_of(m_coreAudioCaptureDevices.begin(), m_coreAudioCaptureDevices.end(), [deviceID](auto& device) { return device->deviceID() == deviceID; }))
+            continue;
+
+        auto device = CoreAudioCaptureDevice::create(deviceID);
+        if (!device)
+            continue;
+        m_coreAudioCaptureDevices.append(device.releaseNonNull());
+
+        haveDeviceChanges = true;
+    }
+
+    for (auto& device : m_coreAudioCaptureDevices) {
+        bool isAlive = device->isAlive();
+        if (device->enabled() != isAlive) {
+            device->setEnabled(isAlive);
+            haveDeviceChanges = true;
+        }
+    }
+
+    if (haveDeviceChanges) {
+        m_devices = Vector<CaptureDevice>();
+
+        for (auto &device : m_coreAudioCaptureDevices) {
+            CaptureDevice captureDevice(device->persistentId(), CaptureDevice::DeviceType::Audio, device->label());
+            captureDevice.setEnabled(device->enabled());
+            m_devices.append(captureDevice);
+        }
+    }
+}
+
+OSStatus CoreAudioCaptureDeviceManager::devicesChanged(AudioObjectID, UInt32, const AudioObjectPropertyAddress*, void *userData)
+{
+    static_cast<CoreAudioCaptureDeviceManager*>(userData)->refreshAudioCaptureDevices();
+    return 0;
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(MEDIA_STREAM) && PLATFORM(MAC)

Copied: trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureDeviceManager.h (from rev 215417, trunk/Source/WebCore/platform/mediastream/CaptureDeviceManager.h) (0 => 215418)


--- trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureDeviceManager.h	                        (rev 0)
+++ trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureDeviceManager.h	2017-04-17 17:00:52 UTC (rev 215418)
@@ -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. ``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
+ * 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 ENABLE(MEDIA_STREAM) && PLATFORM(MAC)
+
+#include "CaptureDevice.h"
+#include "CaptureDeviceManager.h"
+#include <CoreAudio/CoreAudio.h>
+#include <wtf/HashMap.h>
+#include <wtf/RefPtr.h>
+#include <wtf/text/WTFString.h>
+
+namespace WebCore {
+
+class CoreAudioCaptureDevice;
+
+class CoreAudioCaptureDeviceManager final : public CaptureDeviceManager {
+    friend class NeverDestroyed<CoreAudioCaptureDeviceManager>;
+public:
+    static CoreAudioCaptureDeviceManager& singleton();
+
+    Vector<CaptureDevice>& captureDevices() final;
+
+    Vector<Ref<CoreAudioCaptureDevice>>& coreAudioCaptureDevices();
+
+private:
+    CoreAudioCaptureDeviceManager() = default;
+    ~CoreAudioCaptureDeviceManager() = default;
+    
+    static OSStatus devicesChanged(AudioObjectID, UInt32, const AudioObjectPropertyAddress*, void*);
+
+    void refreshAudioCaptureDevices();
+
+    Vector<CaptureDevice> m_devices;
+    Vector<Ref<CoreAudioCaptureDevice>> m_coreAudioCaptureDevices;
+};
+
+} // namespace WebCore
+
+#endif // ENABLE(MEDIA_STREAM && PLATFORM(MAC)

Modified: trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.cpp (215417 => 215418)


--- trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.cpp	2017-04-17 16:37:26 UTC (rev 215417)
+++ trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.cpp	2017-04-17 17:00:52 UTC (rev 215418)
@@ -30,6 +30,8 @@
 
 #include "AudioSampleBufferList.h"
 #include "AudioSampleDataSource.h"
+#include "CoreAudioCaptureDevice.h"
+#include "CoreAudioCaptureDeviceManager.h"
 #include "Logging.h"
 #include "MediaTimeAVFoundation.h"
 #include <AudioToolbox/AudioConverter.h>
@@ -78,7 +80,15 @@
     : RealtimeMediaSource(emptyString(), RealtimeMediaSource::Type::Audio, deviceInfo.label())
     , m_captureDeviceID(0)
 {
-    // FIXME: use deviceInfo to set the m_captureDeviceID
+#if PLATFORM(MAC)
+    for (auto& platformDevice : CoreAudioCaptureDeviceManager::singleton().coreAudioCaptureDevices()) {
+        if (platformDevice->persistentId() == deviceInfo.persistentId()) {
+            m_captureDeviceID = platformDevice->deviceID();
+            break;
+        }
+    }
+    ASSERT(m_captureDeviceID);
+#endif
 
     setPersistentID(deviceInfo.persistentId());
     setMuted(true);
@@ -408,24 +418,26 @@
 
 void CoreAudioCaptureSource::startProducingData()
 {
-    std::lock_guard<Lock> lock(m_internalStateLock);
-    if (m_ioUnitStarted)
-        return;
+    {
+        std::lock_guard<Lock> lock(m_internalStateLock);
+        if (m_ioUnitStarted)
+            return;
 
-    OSStatus err;
-    if (!m_ioUnit) {
-        err = setupAudioUnits();
-        if (err)
+        OSStatus err;
+        if (!m_ioUnit) {
+            err = setupAudioUnits();
+            if (err)
+                return;
+        }
+
+        err = AudioOutputUnitStart(m_ioUnit);
+        if (err) {
+            LOG(Media, "CoreAudioCaptureSource::start(%p) AudioOutputUnitStart failed with error %d (%.4s)", this, (int)err, (char*)&err);
             return;
-    }
+        }
 
-    err = AudioOutputUnitStart(m_ioUnit);
-    if (err) {
-        LOG(Media, "CoreAudioCaptureSource::start(%p) AudioOutputUnitStart failed with error %d (%.4s)", this, (int)err, (char*)&err);
-        return;
+        m_ioUnitStarted = true;
     }
-
-    m_ioUnitStarted = true;
     setMuted(false);
 }
 
@@ -433,14 +445,14 @@
 {
     std::lock_guard<Lock> lock(m_internalStateLock);
 
-    ASSERT(m_ioUnit);
-
-    auto err = AudioOutputUnitStop(m_ioUnit);
-    if (err) {
-        LOG(Media, "CoreAudioCaptureSource::stop(%p) AudioOutputUnitStop failed with error %d (%.4s)", this, (int)err, (char*)&err);
-        return;
+    if (m_ioUnit) {
+        auto err = AudioOutputUnitStop(m_ioUnit);
+        if (err) {
+            LOG(Media, "CoreAudioCaptureSource::stop(%p) AudioOutputUnitStop failed with error %d (%.4s)", this, (int)err, (char*)&err);
+            return;
+        }
+        m_ioUnitStarted = false;
     }
-    m_ioUnitStarted = false;
     setMuted(true);
 }
 

Modified: trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp (215417 => 215418)


--- trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp	2017-04-17 16:37:26 UTC (rev 215417)
+++ trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp	2017-04-17 17:00:52 UTC (rev 215418)
@@ -33,8 +33,10 @@
 #if ENABLE(MEDIA_STREAM)
 #include "RealtimeMediaSourceCenterMac.h"
 
+#include "AVAudioCaptureSource.h"
 #include "AVCaptureDeviceManager.h"
 #include "AVVideoCaptureSource.h"
+#include "CoreAudioCaptureDeviceManager.h"
 #include "CoreAudioCaptureSource.h"
 #include "Logging.h"
 #include "MediaStreamPrivate.h"
@@ -42,6 +44,29 @@
 
 namespace WebCore {
 
+void RealtimeMediaSourceCenterMac::setUseAVFoundationAudioCapture(bool enabled)
+{
+    static bool active = false;
+    if (active == enabled)
+        return;
+
+    active = enabled;
+    if (active) {
+        RealtimeMediaSourceCenter::singleton().setAudioFactory(AVAudioCaptureSource::factory());
+        RealtimeMediaSourceCenter::singleton().setAudioCaptureDeviceManager(AVCaptureDeviceManager::singleton());
+    } else {
+        RealtimeMediaSourceCenter::singleton().setAudioFactory(CoreAudioCaptureSource::factory());
+#if PLATFORM(MAC)
+        RealtimeMediaSourceCenter::singleton().setAudioCaptureDeviceManager(CoreAudioCaptureDeviceManager::singleton());
+#else
+        // FIXME 170861: Use AVAudioSession to enumerate audio capture devices on iOS
+        RealtimeMediaSourceCenter::singleton().setAudioCaptureDeviceManager(AVCaptureDeviceManager::singleton());
+#endif
+    }
+}
+
+
+
 RealtimeMediaSourceCenter& RealtimeMediaSourceCenter::platformCenter()
 {
     ASSERT(isMainThread());
@@ -65,6 +90,14 @@
 
     m_audioFactory = &CoreAudioCaptureSource::factory();
     m_videoFactory = &AVVideoCaptureSource::factory();
+
+#if PLATFORM(MAC)
+    m_audioCaptureDeviceManager = &CoreAudioCaptureDeviceManager::singleton();
+#else
+    // FIXME 170861: Use AVAudioSession to enumerate audio capture devices on iOS
+    m_audioCaptureDeviceManager = &AVCaptureDeviceManager::singleton();
+#endif
+    m_videoCaptureDeviceManager = &AVCaptureDeviceManager::singleton();
 }
 
 RealtimeMediaSourceCenterMac::~RealtimeMediaSourceCenterMac()
@@ -103,7 +136,7 @@
     String invalidConstraint;
 
     if (!audioDeviceID.isEmpty()) {
-        auto audioDevice = AVCaptureDeviceManager::singleton().deviceWithUID(audioDeviceID, RealtimeMediaSource::Type::Audio);
+        auto audioDevice = m_audioCaptureDeviceManager->deviceWithUID(audioDeviceID, RealtimeMediaSource::Type::Audio);
         if (audioDevice && m_audioFactory) {
             if (auto audioSource = m_audioFactory->createMediaSourceForCaptureDeviceWithConstraints(audioDevice.value(), audioConstraints, invalidConstraint))
                 audioSources.append(audioSource.releaseNonNull());
@@ -114,7 +147,7 @@
         }
     }
     if (!videoDeviceID.isEmpty()) {
-        auto videoDevice = AVCaptureDeviceManager::singleton().deviceWithUID(videoDeviceID, RealtimeMediaSource::Type::Video);
+        auto videoDevice = m_videoCaptureDeviceManager->deviceWithUID(videoDeviceID, RealtimeMediaSource::Type::Video);
         if (videoDevice && m_videoFactory) {
             if (auto videoSource = m_videoFactory->createMediaSourceForCaptureDeviceWithConstraints(videoDevice.value(), videoConstraints, invalidConstraint))
                 videoSources.append(videoSource.releaseNonNull());
@@ -133,7 +166,15 @@
 
 Vector<CaptureDevice> RealtimeMediaSourceCenterMac::getMediaStreamDevices()
 {
-    return AVCaptureDeviceManager::singleton().getSourcesInfo();
+    Vector<CaptureDevice> result;
+
+    if (m_audioCaptureDeviceManager)
+        result.appendVector(m_audioCaptureDeviceManager->getAudioSourcesInfo());
+
+    if (m_videoCaptureDeviceManager)
+        result.appendVector(m_videoCaptureDeviceManager->getVideoSourcesInfo());
+
+    return result;
 }
 
 Vector<String> RealtimeMediaSourceCenterMac::bestSourcesForTypeAndConstraints(RealtimeMediaSource::Type type, const MediaConstraints& constraints, String& invalidConstraint)

Modified: trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.h (215417 => 215418)


--- trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.h	2017-04-17 16:37:26 UTC (rev 215417)
+++ trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.h	2017-04-17 17:00:52 UTC (rev 215418)
@@ -44,6 +44,7 @@
 public:
     RealtimeMediaSourceCenterMac();
 
+    WEBCORE_EXPORT static void setUseAVFoundationAudioCapture(bool enabled);
 private:
     ~RealtimeMediaSourceCenterMac();
 

Modified: trunk/Source/WebKit2/ChangeLog (215417 => 215418)


--- trunk/Source/WebKit2/ChangeLog	2017-04-17 16:37:26 UTC (rev 215417)
+++ trunk/Source/WebKit2/ChangeLog	2017-04-17 17:00:52 UTC (rev 215418)
@@ -1,3 +1,15 @@
+2017-04-17  Jeremy Jones  <jere...@apple.com>
+
+        Refactor enumerateDevices to allow separate CaptureDeviceManagers for audio and video.
+        https://bugs.webkit.org/show_bug.cgi?id=170778
+
+        Reviewed by Tim Horton.
+
+        setUseAVFoundationAudioCapture is moved from AVCaptureDeviceManager to RealtimeMediaSourceCenterMac.
+
+        * UIProcess/UserMediaPermissionRequestManagerProxy.cpp:
+        (WebKit::UserMediaPermissionRequestManagerProxy::syncWithWebCorePrefs):
+
 2017-04-15  Keith Rollin  <krol...@apple.com>
 
         Include resource size in some existing logging

Modified: trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.cpp (215417 => 215418)


--- trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.cpp	2017-04-17 16:37:26 UTC (rev 215417)
+++ trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.cpp	2017-04-17 17:00:52 UTC (rev 215418)
@@ -32,7 +32,7 @@
 #include <WebCore/SecurityOriginData.h>
 
 #if ENABLE(MEDIA_STREAM) && USE(AVFOUNDATION)
-#include <WebCore/AVCaptureDeviceManager.h>
+#include <WebCore/RealtimeMediaSourceCenterMac.h>
 #endif
 
 using namespace WebCore;
@@ -336,7 +336,7 @@
 
 #if USE(AVFOUNDATION)
     bool useAVFoundationAudioCapture = m_page.preferences().useAVFoundationAudioCapture();
-    WebCore::AVCaptureDeviceManager::setUseAVFoundationAudioCapture(useAVFoundationAudioCapture);
+    WebCore::RealtimeMediaSourceCenterMac::setUseAVFoundationAudioCapture(useAVFoundationAudioCapture);
 #endif
 #endif
 }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to