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
}