Changeset 228310 in webkit
- Timestamp:
- Feb 8, 2018, 9:05:22 PM (9 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 5 edited
-
ChangeLog (modified) (1 diff)
-
platform/mediastream/ios/CoreAudioCaptureSourceIOS.h (modified) (1 diff)
-
platform/mediastream/ios/CoreAudioCaptureSourceIOS.mm (modified) (4 diffs)
-
platform/mediastream/mac/CoreAudioCaptureSource.cpp (modified) (9 diffs)
-
platform/mediastream/mac/CoreAudioCaptureSource.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r228309 r228310 1 2018-02-08 Youenn Fablet <youenn@apple.com> 2 3 CoreAudioCaptureSourceIOSListener should be a WebProcess singleton 4 https://bugs.webkit.org/show_bug.cgi?id=182606 5 <rdar://problem/37355283> 6 7 Reviewed by Eric Carlson. 8 9 Not testable right now as this relies on iOS specific Core Audio stack. 10 Efforts should be made to somehow mock that part and mock interruptions. 11 12 Made CoreAudioCaptureSourceFactoryIOS responsible to receive iOS interruption messages. 13 Before the patch, individual capture sources were receiving these messages. 14 When there is only one capture source per process this is fine but with more capture sources, 15 this is messing up things as they all share the same shared unit and we would try to interrupt it or resume it several times. 16 17 Also, if we are suspended and there is no more capture source, the shared unit will remain suspended indefinitely, as we will 18 not process the interruption messages. 19 With the patch, we always process the messages. 20 We still go through the active source as done now to limit the changes. 21 In case of no source, we go to the shared unit. 22 In the future, we should directly go to the shared unit and clients of the shared unit should see their state being updated. 23 24 As a way to prevent staying suspended on iOS, we unsuspend ourselves in CoreAudioCaptureSource constructor. 25 This is fine as this constructor is only called when getUserMedia grants access to the camera which always goes to the UIProcess. 26 And the UIProcess is only processing getUserMedia calls if the WebProcess is foregrounded. 27 28 * platform/mediastream/ios/CoreAudioCaptureSourceIOS.h: 29 * platform/mediastream/ios/CoreAudioCaptureSourceIOS.mm: 30 (-[WebCoreAudioCaptureSourceIOSListener initWithCallback:]): 31 (WebCore::CoreAudioCaptureSourceFactoryIOS::CoreAudioCaptureSourceFactoryIOS): 32 (WebCore::CoreAudioCaptureSourceFactoryIOS::~CoreAudioCaptureSourceFactoryIOS): 33 (WebCore::CoreAudioCaptureSourceFactory::singleton): 34 * platform/mediastream/mac/CoreAudioCaptureSource.cpp: 35 (WebCore::CoreAudioCaptureSourceFactory::singleton): 36 (WebCore::CoreAudioCaptureSource::create): 37 (WebCore::CoreAudioCaptureSourceFactory::beginInterruption): 38 (WebCore::CoreAudioCaptureSourceFactory::endInterruption): 39 (WebCore::CoreAudioCaptureSourceFactory::scheduleReconfiguration): 40 (WebCore::CoreAudioCaptureSource::factory): 41 (WebCore::CoreAudioCaptureSource::CoreAudioCaptureSource): 42 (WebCore::CoreAudioCaptureSource::~CoreAudioCaptureSource): 43 (WebCore::CoreAudioCaptureSource::startProducingData): 44 (WebCore::CoreAudioCaptureSource::scheduleReconfiguration): 45 (WebCore::CoreAudioCaptureSource::beginInterruption): 46 (WebCore::CoreAudioCaptureSource::endInterruption): 47 * platform/mediastream/mac/CoreAudioCaptureSource.h: 48 (WebCore::CoreAudioCaptureSourceFactory::setCoreAudioActiveSource): 49 (WebCore::CoreAudioCaptureSourceFactory::unsetCoreAudioActiveSource): 50 (WebCore::CoreAudioCaptureSourceFactory::coreAudioActiveSource): 51 1 52 2018-02-08 Chris Dumez <cdumez@apple.com> 2 53 -
trunk/Source/WebCore/platform/mediastream/ios/CoreAudioCaptureSourceIOS.h
r218746 r228310 34 34 namespace WebCore { 35 35 36 class CoreAudioCaptureSourceIOS final : public CoreAudioCaptureSource { 36 class CoreAudioCaptureSourceFactoryIOS final : public CoreAudioCaptureSourceFactory { 37 public: 38 CoreAudioCaptureSourceFactoryIOS(); 39 ~CoreAudioCaptureSourceFactoryIOS(); 40 37 41 private: 38 friend class CoreAudioCaptureSource;39 40 CoreAudioCaptureSourceIOS(const String& deviceID, const String& label);41 ~CoreAudioCaptureSourceIOS();42 43 42 RetainPtr<WebCoreAudioCaptureSourceIOSListener> m_listener; 44 43 }; -
trunk/Source/WebCore/platform/mediastream/ios/CoreAudioCaptureSourceIOS.mm
r219191 r228310 51 51 52 52 @interface WebCoreAudioCaptureSourceIOSListener : NSObject { 53 CoreAudioCaptureSource IOS* _callback;53 CoreAudioCaptureSourceFactoryIOS* _callback; 54 54 } 55 55 … … 60 60 61 61 @implementation WebCoreAudioCaptureSourceIOSListener 62 - (id)initWithCallback:(CoreAudioCaptureSource IOS*)callback62 - (id)initWithCallback:(CoreAudioCaptureSourceFactoryIOS*)callback 63 63 { 64 64 self = [super init]; … … 123 123 namespace WebCore { 124 124 125 CoreAudioCaptureSourceIOS::CoreAudioCaptureSourceIOS(const String& deviceID, const String& label) 126 : CoreAudioCaptureSource(deviceID, label, 0) 127 , m_listener(adoptNS([[WebCoreAudioCaptureSourceIOSListener alloc] initWithCallback:this])) 125 CoreAudioCaptureSourceFactoryIOS::CoreAudioCaptureSourceFactoryIOS() 126 : m_listener(adoptNS([[WebCoreAudioCaptureSourceIOSListener alloc] initWithCallback:this])) 128 127 { 129 128 } 130 129 131 CoreAudioCaptureSource IOS::~CoreAudioCaptureSourceIOS()130 CoreAudioCaptureSourceFactoryIOS::~CoreAudioCaptureSourceFactoryIOS() 132 131 { 133 132 [m_listener invalidate]; … … 135 134 } 136 135 136 CoreAudioCaptureSourceFactory& CoreAudioCaptureSourceFactory::singleton() 137 { 138 static NeverDestroyed<CoreAudioCaptureSourceFactoryIOS> factory; 139 return factory.get(); 140 } 141 137 142 } 138 143 -
trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.cpp
r225395 r228310 54 54 using namespace PAL; 55 55 56 class CoreAudioCaptureSourceFactory : public RealtimeMediaSource::AudioCaptureFactory 57 { 58 public: 59 CaptureSourceOrError createAudioCaptureSource(const CaptureDevice& device, const MediaConstraints* constraints) final 60 { 61 return CoreAudioCaptureSource::create(device.persistentId(), constraints); 62 } 63 }; 64 65 static CoreAudioCaptureSourceFactory& coreAudioCaptureSourceFactory() 56 #if PLATFORM(MAC) 57 CoreAudioCaptureSourceFactory& CoreAudioCaptureSourceFactory::singleton() 66 58 { 67 59 static NeverDestroyed<CoreAudioCaptureSourceFactory> factory; 68 60 return factory.get(); 69 61 } 62 #endif 70 63 71 64 const UInt32 outputBus = 0; … … 698 691 return { }; 699 692 700 auto source = adoptRef(*new CoreAudioCaptureSource IOS(deviceID, device->label()));693 auto source = adoptRef(*new CoreAudioCaptureSource(deviceID, device->label(), 0)); 701 694 #endif 702 695 … … 709 702 } 710 703 704 void CoreAudioCaptureSourceFactory::beginInterruption() 705 { 706 if (!isMainThread()) { 707 callOnMainThread([this] { 708 beginInterruption(); 709 }); 710 return; 711 } 712 ASSERT(isMainThread()); 713 714 if (auto* source = coreAudioActiveSource()) { 715 source->beginInterruption(); 716 return; 717 } 718 CoreAudioSharedUnit::singleton().suspend(); 719 } 720 721 void CoreAudioCaptureSourceFactory::endInterruption() 722 { 723 if (!isMainThread()) { 724 callOnMainThread([this] { 725 endInterruption(); 726 }); 727 return; 728 } 729 ASSERT(isMainThread()); 730 731 if (auto* source = coreAudioActiveSource()) { 732 source->endInterruption(); 733 return; 734 } 735 CoreAudioSharedUnit::singleton().reconfigureAudioUnit(); 736 } 737 738 void CoreAudioCaptureSourceFactory::scheduleReconfiguration() 739 { 740 if (!isMainThread()) { 741 callOnMainThread([this] { 742 scheduleReconfiguration(); 743 }); 744 return; 745 } 746 ASSERT(isMainThread()); 747 748 if (auto* source = coreAudioActiveSource()) { 749 source->scheduleReconfiguration(); 750 return; 751 } 752 CoreAudioSharedUnit::singleton().reconfigureAudioUnit(); 753 } 754 711 755 RealtimeMediaSource::AudioCaptureFactory& CoreAudioCaptureSource::factory() 712 756 { 713 return coreAudioCaptureSourceFactory();757 return CoreAudioCaptureSourceFactory::singleton(); 714 758 } 715 759 … … 725 769 726 770 unit.addClient(*this); 771 772 #if PLATFORM(IOS) 773 // We ensure that we unsuspend ourselves on the constructor as a capture source 774 // is created when getUserMedia grants access which only happens when the process is foregrounded. 775 if (unit.isSuspended()) 776 unit.reconfigureAudioUnit(); 777 #endif 727 778 } 728 779 … … 730 781 { 731 782 #if PLATFORM(IOS) 732 coreAudioCaptureSourceFactory().unsetActiveSource(*this);783 CoreAudioCaptureSourceFactory::singleton().unsetCoreAudioActiveSource(*this); 733 784 #endif 734 785 … … 749 800 { 750 801 #if PLATFORM(IOS) 751 coreAudioCaptureSourceFactory().setActiveSource(*this);802 CoreAudioCaptureSourceFactory::singleton().setCoreAudioActiveSource(*this); 752 803 #endif 753 804 … … 845 896 void CoreAudioCaptureSource::scheduleReconfiguration() 846 897 { 847 if (!isMainThread()) {848 callOnMainThread([weakThis = createWeakPtr(), this] {849 if (!weakThis)850 return;851 852 scheduleReconfiguration();853 });854 855 return;856 }857 858 898 ASSERT(isMainThread()); 859 899 auto& unit = CoreAudioSharedUnit::singleton(); … … 875 915 void CoreAudioCaptureSource::beginInterruption() 876 916 { 877 if (!isMainThread()) {878 callOnMainThread([weakThis = createWeakPtr(), this] {879 if (!weakThis)880 return;881 882 beginInterruption();883 });884 885 return;886 }887 888 917 ASSERT(isMainThread()); 889 918 auto& unit = CoreAudioSharedUnit::singleton(); … … 901 930 void CoreAudioCaptureSource::endInterruption() 902 931 { 903 if (!isMainThread()) {904 callOnMainThread([weakThis = createWeakPtr(), this] {905 if (!weakThis)906 return;907 908 endInterruption();909 });910 911 return;912 }913 914 932 ASSERT(isMainThread()); 915 933 auto& unit = CoreAudioSharedUnit::singleton(); -
trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.h
r218746 r228310 111 111 }; 112 112 113 class CoreAudioCaptureSourceFactory : public RealtimeMediaSource::AudioCaptureFactory { 114 public: 115 static CoreAudioCaptureSourceFactory& singleton(); 116 117 void beginInterruption(); 118 void endInterruption(); 119 void scheduleReconfiguration(); 120 121 #if PLATFORM(IOS) 122 void setCoreAudioActiveSource(CoreAudioCaptureSource& source) { setActiveSource(source); } 123 void unsetCoreAudioActiveSource(CoreAudioCaptureSource& source) { unsetActiveSource(source); } 124 CoreAudioCaptureSource* coreAudioActiveSource() { return static_cast<CoreAudioCaptureSource*>(activeSource()); } 125 #else 126 CoreAudioCaptureSource* coreAudioActiveSource() { return nullptr; } 127 #endif 128 129 private: 130 CaptureSourceOrError createAudioCaptureSource(const CaptureDevice& device, const MediaConstraints* constraints) final 131 { 132 return CoreAudioCaptureSource::create(device.persistentId(), constraints); 133 } 134 }; 135 113 136 } // namespace WebCore 114 137
Note:
See TracChangeset
for help on using the changeset viewer.