Title: [216898] trunk/Source
Revision
216898
Author
commit-qu...@webkit.org
Date
2017-05-15 19:45:28 -0700 (Mon, 15 May 2017)

Log Message

Simplify RealtimeMediaSource data production and state
https://bugs.webkit.org/show_bug.cgi?id=171999

Patch by Youenn Fablet <you...@apple.com> on 2017-05-15
Reviewed by Eric Carlson.

Source/WebCore:

RealtimeMediaSource takes 3 booleans:
- m_isProducingData tells whether data is produced or not. In the case of capturing, it tells whether capture
  happens.
- m_muted/m_enabled allows JS or WebKit level to start/stop the source.

Changed MediaStream capture state computation so that capture is reported as follows:
- m_isProducing is true, capture is happenning and is active
- m_muted is true, capture is happening but is inactive.

Except in the case of WebRTC incoming sources, for which sources may be created as muted as per the spec,
all sources are unmuted, enabled and not producing data when created.

RealtimeMediaSource is now activable either by calling start/stop or by calling setMuted/setEnabled.
This in turns will set the boolean values accordingly and will call the underlying
startProducingData/stopProducingData methods doing the actual stuff.

Removing from all RealtimeMediaSource subclasses the handling of producing data.
Making more methods non-virtual/member fields private to simplify the model.

* Modules/mediastream/CanvasCaptureMediaStreamTrack.cpp:
(WebCore::CanvasCaptureMediaStreamTrack::Source::create):
(WebCore::CanvasCaptureMediaStreamTrack::Source::startProducingData):
(WebCore::CanvasCaptureMediaStreamTrack::Source::stopProducingData):
(WebCore::CanvasCaptureMediaStreamTrack::Source::canvasDestroyed):
(WebCore::CanvasCaptureMediaStreamTrack::Source::captureCanvas):
* Modules/mediastream/CanvasCaptureMediaStreamTrack.h:
* Modules/mediastream/MediaStream.cpp:
(WebCore::MediaStream::mediaState):
* platform/mediastream/MediaStreamTrackPrivate.h:
(WebCore::MediaStreamTrackPrivate::startProducingData):
(WebCore::MediaStreamTrackPrivate::stopProducingData):
* platform/mediastream/RealtimeMediaSource.cpp:
(WebCore::RealtimeMediaSource::setMuted):
(WebCore::RealtimeMediaSource::notifyMutedChange):
(WebCore::RealtimeMediaSource::setEnabled):
(WebCore::RealtimeMediaSource::start):
(WebCore::RealtimeMediaSource::stop):
(WebCore::RealtimeMediaSource::requestStop):
(WebCore::RealtimeMediaSource::reset): Deleted.
* platform/mediastream/RealtimeMediaSource.h:
* platform/mediastream/mac/AVMediaCaptureSource.h:
* platform/mediastream/mac/AVMediaCaptureSource.mm:
(WebCore::AVMediaCaptureSource::AVMediaCaptureSource):
(WebCore::AVMediaCaptureSource::captureSessionIsRunningDidChange):
(WebCore::AVMediaCaptureSource::reset): Deleted.
(WebCore::AVMediaCaptureSource::isProducingData): Deleted.
* platform/mediastream/mac/CoreAudioCaptureSource.cpp:
(WebCore::CoreAudioCaptureSource::CoreAudioCaptureSource):
(WebCore::CoreAudioCaptureSource::startProducingData):
(WebCore::CoreAudioCaptureSource::stopProducingData):
(WebCore::CoreAudioCaptureSource::audioSourceProvider):
* platform/mediastream/mac/CoreAudioCaptureSource.h:
* platform/mediastream/mac/MockRealtimeAudioSourceMac.mm:
(WebCore::MockRealtimeAudioSourceMac::render):
(WebCore::MockRealtimeAudioSource::createMuted): Deleted.
* platform/mediastream/mac/MockRealtimeVideoSourceMac.mm:
(WebCore::MockRealtimeVideoSource::createMuted): Deleted.
* platform/mediastream/mac/RealtimeIncomingAudioSource.cpp:
(WebCore::RealtimeIncomingAudioSource::create):
(WebCore::RealtimeIncomingAudioSource::RealtimeIncomingAudioSource):
(WebCore::RealtimeIncomingAudioSource::~RealtimeIncomingAudioSource):
(WebCore::RealtimeIncomingAudioSource::startProducingData):
(WebCore::RealtimeIncomingAudioSource::stopProducingData):
(WebCore::RealtimeIncomingAudioSource::setSourceTrack):
* platform/mediastream/mac/RealtimeIncomingAudioSource.h:
* platform/mediastream/mac/RealtimeIncomingVideoSource.cpp:
(WebCore::RealtimeIncomingVideoSource::create):
(WebCore::RealtimeIncomingVideoSource::RealtimeIncomingVideoSource):
(WebCore::RealtimeIncomingVideoSource::startProducingData):
(WebCore::RealtimeIncomingVideoSource::setSourceTrack):
(WebCore::RealtimeIncomingVideoSource::stopProducingData):
(WebCore::RealtimeIncomingVideoSource::OnFrame):
* platform/mediastream/mac/RealtimeIncomingVideoSource.h:
* platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:
(WebCore::WebAudioSourceProviderAVFObjC::setClient):
* platform/mock/MockMediaEndpoint.cpp:
(WebCore::MockMediaEndpoint::createMutedRemoteSource):
(WebCore::MockMediaEndpoint::unmuteTimerFired):
* platform/mock/MockRealtimeAudioSource.cpp:
(WebCore::MockRealtimeAudioSource::createMuted):
(WebCore::MockRealtimeAudioSource::startProducingData):
(WebCore::MockRealtimeAudioSource::stopProducingData):
* platform/mock/MockRealtimeAudioSource.h:
* platform/mock/MockRealtimeMediaSource.cpp:
(WebCore::MockRealtimeMediaSource::startProducingData): Deleted.
(WebCore::MockRealtimeMediaSource::stopProducingData): Deleted.
* platform/mock/MockRealtimeMediaSource.h:
* platform/mock/MockRealtimeVideoSource.cpp:
(WebCore::MockRealtimeVideoSource::createMuted):
(WebCore::MockRealtimeVideoSource::startProducingData):
(WebCore::MockRealtimeVideoSource::stopProducingData):
(WebCore::MockRealtimeVideoSource::generateFrame):
* platform/mock/MockRealtimeVideoSource.h:

Source/WebKit2:

* UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp:
(WebKit::UserMediaCaptureManagerProxy::startProducingData):
(WebKit::UserMediaCaptureManagerProxy::stopProducingData):
* WebProcess/cocoa/UserMediaCaptureManager.cpp:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (216897 => 216898)


--- trunk/Source/WebCore/ChangeLog	2017-05-16 01:59:10 UTC (rev 216897)
+++ trunk/Source/WebCore/ChangeLog	2017-05-16 02:45:28 UTC (rev 216898)
@@ -1,3 +1,104 @@
+2017-05-15  Youenn Fablet  <you...@apple.com>
+
+        Simplify RealtimeMediaSource data production and state
+        https://bugs.webkit.org/show_bug.cgi?id=171999
+
+        Reviewed by Eric Carlson.
+
+        RealtimeMediaSource takes 3 booleans:
+        - m_isProducingData tells whether data is produced or not. In the case of capturing, it tells whether capture
+          happens.
+        - m_muted/m_enabled allows JS or WebKit level to start/stop the source.
+
+        Changed MediaStream capture state computation so that capture is reported as follows:
+        - m_isProducing is true, capture is happenning and is active
+        - m_muted is true, capture is happening but is inactive.
+
+        Except in the case of WebRTC incoming sources, for which sources may be created as muted as per the spec,
+        all sources are unmuted, enabled and not producing data when created.
+
+        RealtimeMediaSource is now activable either by calling start/stop or by calling setMuted/setEnabled.
+        This in turns will set the boolean values accordingly and will call the underlying
+        startProducingData/stopProducingData methods doing the actual stuff.
+
+        Removing from all RealtimeMediaSource subclasses the handling of producing data.
+        Making more methods non-virtual/member fields private to simplify the model.
+
+        * Modules/mediastream/CanvasCaptureMediaStreamTrack.cpp:
+        (WebCore::CanvasCaptureMediaStreamTrack::Source::create):
+        (WebCore::CanvasCaptureMediaStreamTrack::Source::startProducingData):
+        (WebCore::CanvasCaptureMediaStreamTrack::Source::stopProducingData):
+        (WebCore::CanvasCaptureMediaStreamTrack::Source::canvasDestroyed):
+        (WebCore::CanvasCaptureMediaStreamTrack::Source::captureCanvas):
+        * Modules/mediastream/CanvasCaptureMediaStreamTrack.h:
+        * Modules/mediastream/MediaStream.cpp:
+        (WebCore::MediaStream::mediaState):
+        * platform/mediastream/MediaStreamTrackPrivate.h:
+        (WebCore::MediaStreamTrackPrivate::startProducingData):
+        (WebCore::MediaStreamTrackPrivate::stopProducingData):
+        * platform/mediastream/RealtimeMediaSource.cpp:
+        (WebCore::RealtimeMediaSource::setMuted):
+        (WebCore::RealtimeMediaSource::notifyMutedChange):
+        (WebCore::RealtimeMediaSource::setEnabled):
+        (WebCore::RealtimeMediaSource::start):
+        (WebCore::RealtimeMediaSource::stop):
+        (WebCore::RealtimeMediaSource::requestStop):
+        (WebCore::RealtimeMediaSource::reset): Deleted.
+        * platform/mediastream/RealtimeMediaSource.h:
+        * platform/mediastream/mac/AVMediaCaptureSource.h:
+        * platform/mediastream/mac/AVMediaCaptureSource.mm:
+        (WebCore::AVMediaCaptureSource::AVMediaCaptureSource):
+        (WebCore::AVMediaCaptureSource::captureSessionIsRunningDidChange):
+        (WebCore::AVMediaCaptureSource::reset): Deleted.
+        (WebCore::AVMediaCaptureSource::isProducingData): Deleted.
+        * platform/mediastream/mac/CoreAudioCaptureSource.cpp:
+        (WebCore::CoreAudioCaptureSource::CoreAudioCaptureSource):
+        (WebCore::CoreAudioCaptureSource::startProducingData):
+        (WebCore::CoreAudioCaptureSource::stopProducingData):
+        (WebCore::CoreAudioCaptureSource::audioSourceProvider):
+        * platform/mediastream/mac/CoreAudioCaptureSource.h:
+        * platform/mediastream/mac/MockRealtimeAudioSourceMac.mm:
+        (WebCore::MockRealtimeAudioSourceMac::render):
+        (WebCore::MockRealtimeAudioSource::createMuted): Deleted.
+        * platform/mediastream/mac/MockRealtimeVideoSourceMac.mm:
+        (WebCore::MockRealtimeVideoSource::createMuted): Deleted.
+        * platform/mediastream/mac/RealtimeIncomingAudioSource.cpp:
+        (WebCore::RealtimeIncomingAudioSource::create):
+        (WebCore::RealtimeIncomingAudioSource::RealtimeIncomingAudioSource):
+        (WebCore::RealtimeIncomingAudioSource::~RealtimeIncomingAudioSource):
+        (WebCore::RealtimeIncomingAudioSource::startProducingData):
+        (WebCore::RealtimeIncomingAudioSource::stopProducingData):
+        (WebCore::RealtimeIncomingAudioSource::setSourceTrack):
+        * platform/mediastream/mac/RealtimeIncomingAudioSource.h:
+        * platform/mediastream/mac/RealtimeIncomingVideoSource.cpp:
+        (WebCore::RealtimeIncomingVideoSource::create):
+        (WebCore::RealtimeIncomingVideoSource::RealtimeIncomingVideoSource):
+        (WebCore::RealtimeIncomingVideoSource::startProducingData):
+        (WebCore::RealtimeIncomingVideoSource::setSourceTrack):
+        (WebCore::RealtimeIncomingVideoSource::stopProducingData):
+        (WebCore::RealtimeIncomingVideoSource::OnFrame):
+        * platform/mediastream/mac/RealtimeIncomingVideoSource.h:
+        * platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:
+        (WebCore::WebAudioSourceProviderAVFObjC::setClient):
+        * platform/mock/MockMediaEndpoint.cpp:
+        (WebCore::MockMediaEndpoint::createMutedRemoteSource):
+        (WebCore::MockMediaEndpoint::unmuteTimerFired):
+        * platform/mock/MockRealtimeAudioSource.cpp:
+        (WebCore::MockRealtimeAudioSource::createMuted):
+        (WebCore::MockRealtimeAudioSource::startProducingData):
+        (WebCore::MockRealtimeAudioSource::stopProducingData):
+        * platform/mock/MockRealtimeAudioSource.h:
+        * platform/mock/MockRealtimeMediaSource.cpp:
+        (WebCore::MockRealtimeMediaSource::startProducingData): Deleted.
+        (WebCore::MockRealtimeMediaSource::stopProducingData): Deleted.
+        * platform/mock/MockRealtimeMediaSource.h:
+        * platform/mock/MockRealtimeVideoSource.cpp:
+        (WebCore::MockRealtimeVideoSource::createMuted):
+        (WebCore::MockRealtimeVideoSource::startProducingData):
+        (WebCore::MockRealtimeVideoSource::stopProducingData):
+        (WebCore::MockRealtimeVideoSource::generateFrame):
+        * platform/mock/MockRealtimeVideoSource.h:
+
 2017-05-15  Myles C. Maxfield  <mmaxfi...@apple.com>
 
         Migrate Font constructor from bools to enums

Modified: trunk/Source/WebCore/Modules/mediastream/CanvasCaptureMediaStreamTrack.cpp (216897 => 216898)


--- trunk/Source/WebCore/Modules/mediastream/CanvasCaptureMediaStreamTrack.cpp	2017-05-16 01:59:10 UTC (rev 216897)
+++ trunk/Source/WebCore/Modules/mediastream/CanvasCaptureMediaStreamTrack.cpp	2017-05-16 02:45:28 UTC (rev 216898)
@@ -48,7 +48,7 @@
 Ref<CanvasCaptureMediaStreamTrack::Source> CanvasCaptureMediaStreamTrack::Source::create(HTMLCanvasElement& canvas, std::optional<double>&& frameRequestRate)
 {
     auto source = adoptRef(*new Source(canvas, WTFMove(frameRequestRate)));
-    source->startProducingData();
+    source->start();
 
     callOnMainThread([source = source.copyRef()] {
         if (!source->m_canvas)
@@ -76,10 +76,6 @@
 
 void CanvasCaptureMediaStreamTrack::Source::startProducingData()
 {
-    if (m_isProducingData)
-        return;
-    m_isProducingData = true;
-
     if (!m_canvas)
         return;
     m_canvas->addObserver(*this);
@@ -93,10 +89,6 @@
 
 void CanvasCaptureMediaStreamTrack::Source::stopProducingData()
 {
-    if (!m_isProducingData)
-        return;
-    m_isProducingData = false;
-
     m_requestFrameTimer.stop();
 
     if (!m_canvas)
@@ -113,7 +105,7 @@
 {
     ASSERT_UNUSED(canvas, m_canvas == &canvas);
 
-    stopProducingData();
+    stop();
     m_canvas = nullptr;
 }
 
@@ -150,7 +142,7 @@
 {
     ASSERT(m_canvas);
 
-    if (!m_isProducingData)
+    if (!isProducingData())
         return;
 
     if (m_frameRequestRate) {

Modified: trunk/Source/WebCore/Modules/mediastream/CanvasCaptureMediaStreamTrack.h (216897 => 216898)


--- trunk/Source/WebCore/Modules/mediastream/CanvasCaptureMediaStreamTrack.h	2017-05-16 01:59:10 UTC (rev 216897)
+++ trunk/Source/WebCore/Modules/mediastream/CanvasCaptureMediaStreamTrack.h	2017-05-16 02:45:28 UTC (rev 216898)
@@ -62,7 +62,6 @@
         // RealtimeMediaSource API
         void startProducingData() final;
         void stopProducingData()  final;
-        bool isProducingData() const { return m_isProducingData; }
         const RealtimeMediaSourceCapabilities& capabilities() const final { return RealtimeMediaSourceCapabilities::emptyCapabilities(); }
         const RealtimeMediaSourceSettings& settings() const final { return m_settings; }
         bool applySize(const IntSize&) final { return true; }
@@ -70,7 +69,6 @@
         void captureCanvas();
         void requestFrameTimerFired();
 
-        bool m_isProducingData { false };
         bool m_shouldEmitFrame { true };
         std::optional<double> m_frameRequestRate;
         Timer m_requestFrameTimer;

Modified: trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp (216897 => 216898)


--- trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp	2017-05-16 01:59:10 UTC (rev 216897)
+++ trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp	2017-05-16 02:45:28 UTC (rev 216898)
@@ -346,7 +346,7 @@
         if (m_private->hasCaptureAudioSource()) {
             if (m_private->muted())
                 state |= HasMutedAudioCaptureDevice;
-            else if (m_isProducingData)
+            else if (m_isProducingData && m_private->isProducingData())
                 state |= HasActiveAudioCaptureDevice;
         }
     }
@@ -356,7 +356,7 @@
         if (m_private->hasCaptureVideoSource()) {
             if (m_private->muted())
                 state |= HasMutedVideoCaptureDevice;
-            else if (m_isProducingData)
+            else if (m_isProducingData && m_private->isProducingData())
                 state |= HasActiveVideoCaptureDevice;
         }
     }

Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.h (216897 => 216898)


--- trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.h	2017-05-16 01:59:10 UTC (rev 216897)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.h	2017-05-16 02:45:28 UTC (rev 216898)
@@ -62,8 +62,8 @@
 
     bool ended() const { return m_isEnded; }
 
-    void startProducingData() { m_source->startProducingData(); }
-    void stopProducingData() { m_source->stopProducingData(); }
+    void startProducingData() { m_source->start(); }
+    void stopProducingData() { m_source->stop(); }
     bool isProducingData() { return m_source->isProducingData(); }
 
     bool isIsolated() const { return m_source->isIsolated(); }

Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp (216897 => 216898)


--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp	2017-05-16 01:59:10 UTC (rev 216897)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp	2017-05-16 02:45:28 UTC (rev 216898)
@@ -60,21 +60,15 @@
     m_suppressNotifications = false;
 }
 
-void RealtimeMediaSource::reset()
-{
-    m_stopped = false;
-    m_muted = false;
-}
-
 void RealtimeMediaSource::addObserver(RealtimeMediaSource::Observer& observer)
 {
-    m_observers.append(&observer);
+    m_observers.append(observer);
 }
 
 void RealtimeMediaSource::removeObserver(RealtimeMediaSource::Observer& observer)
 {
-    m_observers.removeFirstMatching([&observer](auto* anObserver) {
-        return anObserver == &observer;
+    m_observers.removeFirstMatching([&observer](auto anObserver) {
+        return &anObserver.get() == &observer;
     });
 
     if (!m_observers.size())
@@ -83,39 +77,39 @@
 
 void RealtimeMediaSource::setMuted(bool muted)
 {
-    if (m_stopped || m_muted == muted)
+    if (muted)
+        stop();
+    else
+        start();
+
+    notifyMutedChange(muted);
+}
+
+void RealtimeMediaSource::notifyMutedChange(bool muted)
+{
+    if (m_muted == muted)
         return;
 
     m_muted = muted;
 
-    if (muted) {
-        // FIXME: We need to figure out how to guarantee that at least one black video frame is
-        // emitted after being muted.
-        stopProducingData();
-    } else
-        startProducingData();
-
     notifyMutedObservers();
 }
 
 void RealtimeMediaSource::notifyMutedObservers() const
 {
-    for (auto& observer : m_observers)
-        observer->sourceMutedChanged();
+    for (Observer& observer : m_observers)
+        observer.sourceMutedChanged();
 }
 
 void RealtimeMediaSource::setEnabled(bool enabled)
 {
-    if (m_stopped || m_enabled == enabled)
+    if (m_enabled == enabled)
         return;
 
     m_enabled = enabled;
 
-    if (m_stopped)
-        return;
-
-    for (auto& observer : m_observers)
-        observer->sourceEnabledChanged();
+    for (Observer& observer : m_observers)
+        observer.sourceEnabledChanged();
 }
 
 void RealtimeMediaSource::settingsDidChange()
@@ -129,49 +123,57 @@
 
     scheduleDeferredTask([this] {
         m_pendingSettingsDidChangeNotification = false;
-        for (auto& observer : m_observers)
-            observer->sourceSettingsChanged();
+        for (Observer& observer : m_observers)
+            observer.sourceSettingsChanged();
     });
 }
 
 void RealtimeMediaSource::videoSampleAvailable(MediaSample& mediaSample)
 {
-    ASSERT(isMainThread());
-    for (const auto& observer : m_observers)
-        observer->videoSampleAvailable(mediaSample);
+    for (Observer& observer : m_observers)
+        observer.videoSampleAvailable(mediaSample);
 }
 
 void RealtimeMediaSource::audioSamplesAvailable(const MediaTime& time, const PlatformAudioData& audioData, const AudioStreamDescription& description, size_t numberOfFrames)
 {
-    for (const auto& observer : m_observers)
-        observer->audioSamplesAvailable(time, audioData, description, numberOfFrames);
+    for (Observer& observer : m_observers)
+        observer.audioSamplesAvailable(time, audioData, description, numberOfFrames);
 }
 
-void RealtimeMediaSource::stop(Observer* callingObserver)
+void RealtimeMediaSource::start()
 {
-    if (stopped())
+    if (m_isProducingData)
         return;
 
-    m_stopped = true;
+    m_isProducingData = true;
+    startProducingData();
+}
 
-    for (const auto& observer : m_observers) {
-        if (observer != callingObserver)
-            observer->sourceStopped();
-    }
+void RealtimeMediaSource::stop()
+{
+    if (!m_isProducingData)
+        return;
 
+    m_isProducingData = false;
     stopProducingData();
 }
 
 void RealtimeMediaSource::requestStop(Observer* callingObserver)
 {
-    if (stopped())
+    if (!m_isProducingData)
         return;
 
-    for (const auto& observer : m_observers) {
-        if (observer->preventSourceFromStopping())
+    for (Observer& observer : m_observers) {
+        if (observer.preventSourceFromStopping())
             return;
     }
-    stop(callingObserver);
+
+    stop();
+
+    for (Observer& observer : m_observers) {
+        if (&observer != callingObserver)
+            observer.sourceStopped();
+    }
 }
 
 bool RealtimeMediaSource::supportsSizeAndFrameRate(std::optional<int>, std::optional<int>, std::optional<double>)

Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h (216897 => 216898)


--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h	2017-05-16 01:59:10 UTC (rev 216897)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h	2017-05-16 02:45:28 UTC (rev 216898)
@@ -127,60 +127,30 @@
     const String& id() const { return m_id; }
 
     const String& persistentID() const { return m_persistentID; }
-    virtual void setPersistentID(const String& persistentID) { m_persistentID = persistentID; }
+    virtual void setPersistentID(String&& persistentID) { m_persistentID = WTFMove(persistentID); }
 
     enum class Type { None, Audio, Video };
     Type type() const { return m_type; }
 
-    virtual const String& name() const { return m_name; }
-    virtual void setName(const String& name) { m_name = name; }
+    bool isProducingData() const { return m_isProducingData; }
+    void start();
+    void stop();
+    void requestStop(Observer* callingObserver = nullptr);
+
+    bool muted() const { return m_muted; }
+    void setMuted(bool);
     
-    virtual unsigned fitnessScore() const { return m_fitnessScore; }
+    bool enabled() const { return m_enabled; }
+    void setEnabled(bool);
 
-    virtual const RealtimeMediaSourceCapabilities& capabilities() const = 0;
-    virtual const RealtimeMediaSourceSettings& settings() const = 0;
-
-    using SuccessHandler = std::function<void()>;
-    using FailureHandler = std::function<void(const String& badConstraint, const String& errorString)>;
-    virtual void applyConstraints(const MediaConstraints&, SuccessHandler&&, FailureHandler&&);
-    std::optional<std::pair<String, String>> applyConstraints(const MediaConstraints&);
-
-    virtual bool supportsConstraints(const MediaConstraints&, String&);
-    virtual bool supportsConstraint(const MediaConstraint&) const;
-
-    virtual void settingsDidChange();
-
-    virtual bool isIsolated() const { return false; }
+    const String& name() const { return m_name; }
+    void setName(const String& name) { m_name = name; }
     
-    void videoSampleAvailable(MediaSample&);
-    void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t);
-    
-    bool stopped() const { return m_stopped; }
+    unsigned fitnessScore() const { return m_fitnessScore; }
 
-    virtual bool muted() const { return m_muted; }
-    virtual void setMuted(bool);
-
-    virtual bool enabled() const { return m_enabled; }
-    virtual void setEnabled(bool);
-
-    virtual bool isCaptureSource() const { return false; }
-
-    virtual void monitorOrientation(OrientationNotifier&) { }
-    
     WEBCORE_EXPORT void addObserver(Observer&);
     WEBCORE_EXPORT void removeObserver(Observer&);
 
-    virtual void startProducingData() { }
-    virtual void stopProducingData() { }
-    virtual bool isProducingData() const { return false; }
-
-    void stop(Observer* callingObserver = nullptr);
-    void requestStop(Observer* callingObserver = nullptr);
-
-    virtual void reset();
-
-    virtual AudioSourceProvider* audioSourceProvider() { return nullptr; }
-
     void setWidth(int);
     void setHeight(int);
     const IntSize& size() const { return m_size; }
@@ -214,6 +184,27 @@
     void setEchoCancellation(bool);
     virtual bool applyEchoCancellation(bool) { return false; }
 
+    virtual const RealtimeMediaSourceCapabilities& capabilities() const = 0;
+    virtual const RealtimeMediaSourceSettings& settings() const = 0;
+
+    using SuccessHandler = std::function<void()>;
+    using FailureHandler = std::function<void(const String& badConstraint, const String& errorString)>;
+    virtual void applyConstraints(const MediaConstraints&, SuccessHandler&&, FailureHandler&&);
+    std::optional<std::pair<String, String>> applyConstraints(const MediaConstraints&);
+
+    virtual bool supportsConstraints(const MediaConstraints&, String&);
+    virtual bool supportsConstraint(const MediaConstraint&) const;
+
+    virtual void settingsDidChange();
+
+    virtual bool isIsolated() const { return false; }
+
+    virtual bool isCaptureSource() const { return false; }
+
+    virtual void monitorOrientation(OrientationNotifier&) { }
+
+    virtual AudioSourceProvider* audioSourceProvider() { return nullptr; }
+
 protected:
     RealtimeMediaSource(const String& id, Type, const String& name);
 
@@ -231,26 +222,31 @@
     virtual void applyConstraints(const FlattenedConstraint&);
     virtual void applySizeAndFrameRate(std::optional<int> width, std::optional<int> height, std::optional<double>);
 
-    const Vector<Observer*> observers() const { return m_observers; }
-
     void notifyMutedObservers() const;
+    void notifyMutedChange(bool muted);
 
     void initializeVolume(double volume) { m_volume = volume; }
     void initializeSampleRate(int sampleRate) { m_sampleRate = sampleRate; }
     void initializeEchoCancellation(bool echoCancellation) { m_echoCancellation = echoCancellation; }
 
+    void videoSampleAvailable(MediaSample&);
+    void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t);
+    
+private:
+    WeakPtr<RealtimeMediaSource> createWeakPtr() { return m_weakPtrFactory.createWeakPtr(); }
+
+    virtual void startProducingData() { }
+    virtual void stopProducingData() { }
+
     bool m_muted { false };
     bool m_enabled { true };
 
-private:
-    WeakPtr<RealtimeMediaSource> createWeakPtr() { return m_weakPtrFactory.createWeakPtr(); }
-
     WeakPtrFactory<RealtimeMediaSource> m_weakPtrFactory;
     String m_id;
     String m_persistentID;
     Type m_type;
     String m_name;
-    Vector<Observer*> m_observers;
+    Vector<std::reference_wrapper<Observer>> m_observers;
     IntSize m_size;
     double m_frameRate { 30 };
     double m_aspectRatio { 0 };
@@ -261,9 +257,9 @@
     RealtimeMediaSourceSettings::VideoFacingMode m_facingMode { RealtimeMediaSourceSettings::User};
 
     bool m_echoCancellation { false };
-    bool m_stopped { false };
     bool m_pendingSettingsDidChangeNotification { false };
     bool m_suppressNotifications { true };
+    bool m_isProducingData { false };
 };
 
 struct CaptureSourceOrError {

Modified: trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.h (216897 => 216898)


--- trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.h	2017-05-16 01:59:10 UTC (rev 216897)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.h	2017-05-16 02:45:28 UTC (rev 216898)
@@ -68,7 +68,6 @@
 
     void startProducingData() final;
     void stopProducingData() final;
-    bool isProducingData() const final;
 
 protected:
     AVMediaCaptureSource(AVCaptureDevice*, const AtomicString&, RealtimeMediaSource::Type);
@@ -91,7 +90,6 @@
 
 private:
     void setupSession();
-    void reset() final;
 
     void beginConfiguration() final;
     void commitConfiguration() final;

Modified: trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.mm (216897 => 216898)


--- trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.mm	2017-05-16 01:59:10 UTC (rev 216897)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.mm	2017-05-16 02:45:28 UTC (rev 216898)
@@ -148,8 +148,7 @@
     static_assert(static_cast<int>(InterruptionReason::AudioInUse) == AVCaptureSessionInterruptionReasonAudioDeviceInUseByAnotherClient, "InterruptionReason::AudioInUse is not AVCaptureSessionInterruptionReasonAudioDeviceInUseByAnotherClient as expected");
 #endif
     
-    setPersistentID(device.uniqueID);
-    setMuted(true);
+    setPersistentID(String(device.uniqueID));
 }
 
 AVMediaCaptureSource::~AVMediaCaptureSource()
@@ -262,17 +261,6 @@
     [m_session commitConfiguration];
 }
 
-void AVMediaCaptureSource::reset()
-{
-    RealtimeMediaSource::reset();
-    m_isRunning = false;
-    for (NSString *keyName in sessionKVOProperties())
-        [m_session removeObserver:m_objcObserver.get() forKeyPath:keyName];
-
-    shutdownCaptureSession();
-    m_session = nullptr;
-}
-
 void AVMediaCaptureSource::captureSessionIsRunningDidChange(bool state)
 {
     scheduleDeferredTask([this, state] {
@@ -280,19 +268,10 @@
             return;
 
         m_isRunning = state;
-        if (m_muted == !m_isRunning)
-            return;
-
-        m_muted = !m_isRunning;
-        notifyMutedObservers();
+        notifyMutedChange(!m_isRunning);
     });
 }
 
-bool AVMediaCaptureSource::isProducingData() const
-{
-    return m_isRunning;
-}
-
 #if PLATFORM(IOS)
 void AVMediaCaptureSource::captureSessionRuntimeError(RetainPtr<NSError> error)
 {

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


--- trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.cpp	2017-05-16 01:59:10 UTC (rev 216897)
+++ trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.cpp	2017-05-16 02:45:28 UTC (rev 216898)
@@ -648,8 +648,6 @@
     : RealtimeMediaSource(deviceID, RealtimeMediaSource::Type::Audio, label)
     , m_captureDeviceID(persistentID)
 {
-    m_muted = true;
-
     auto& unit = CoreAudioSharedUnit::singleton();
 
     initializeEchoCancellation(unit.enableEchoCancellation());
@@ -680,21 +678,12 @@
 
 void CoreAudioCaptureSource::startProducingData()
 {
-    if (m_isProducingData)
-        return;
-
 #if PLATFORM(IOS)
     coreAudioCaptureSourceFactory().setActiveSource(*this);
 #endif
 
     CoreAudioSharedUnit::singleton().startProducingData();
-    m_isProducingData = CoreAudioSharedUnit::singleton().isProducingData();
 
-    if (!m_isProducingData)
-        return;
-
-    m_muted = false;
-
     if (m_audioSourceProvider)
         m_audioSourceProvider->prepare(&CoreAudioSharedUnit::singleton().microphoneFormat().streamDescription());
 }
@@ -701,12 +690,7 @@
 
 void CoreAudioCaptureSource::stopProducingData()
 {
-    if (!m_isProducingData)
-        return;
-
     CoreAudioSharedUnit::singleton().stopProducingData();
-    m_isProducingData = false;
-    m_muted = true;
 
     if (m_audioSourceProvider)
         m_audioSourceProvider->unprepare();
@@ -756,7 +740,7 @@
 {
     if (!m_audioSourceProvider) {
         m_audioSourceProvider = WebAudioSourceProviderAVFObjC::create(*this);
-        if (m_isProducingData)
+        if (isProducingData())
             m_audioSourceProvider->prepare(&CoreAudioSharedUnit::singleton().microphoneFormat().streamDescription());
     }
 

Modified: trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.h (216897 => 216898)


--- trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.h	2017-05-16 01:59:10 UTC (rev 216897)
+++ trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.h	2017-05-16 02:45:28 UTC (rev 216898)
@@ -80,7 +80,6 @@
     bool isCaptureSource() const final { return true; }
     void startProducingData() final;
     void stopProducingData() final;
-    bool isProducingData() const final { return m_isProducingData; }
 
     bool applyVolume(double) final { return true; }
     bool applySampleRate(int) final;
@@ -93,7 +92,6 @@
 
     uint32_t m_captureDeviceID { 0 };
 
-    bool m_isProducingData { false };
     bool m_isSuspended { false };
 
     mutable std::optional<RealtimeMediaSourceCapabilities> m_capabilities;

Modified: trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeAudioSourceMac.mm (216897 => 216898)


--- trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeAudioSourceMac.mm	2017-05-16 01:59:10 UTC (rev 216897)
+++ trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeAudioSourceMac.mm	2017-05-16 02:45:28 UTC (rev 216898)
@@ -107,13 +107,6 @@
     }
 }
 
-RefPtr<MockRealtimeAudioSource> MockRealtimeAudioSource::createMuted(const String& name)
-{
-    auto source = adoptRef(new MockRealtimeAudioSource(name));
-    source->m_muted = true;
-    return source;
-}
-
 void MockRealtimeAudioSourceMac::emitSampleBuffers(uint32_t frameCount)
 {
     ASSERT(m_formatDescription);
@@ -158,7 +151,7 @@
         uint32_t bipBopCount = std::min(frameCount, bipBopRemain);
         for (auto& audioBuffer : m_audioBufferList->buffers()) {
             audioBuffer.mDataByteSize = frameCount * m_streamFormat.mBytesPerFrame;
-            if (!m_muted && m_enabled) {
+            if (!muted() && enabled()) {
                 memcpy(audioBuffer.mData, &m_bipBopBuffer[bipBopStart], sizeof(Float32) * bipBopCount);
                 addHum(HumVolume, HumFrequency, sampleRate(), m_samplesRendered, static_cast<float*>(audioBuffer.mData), bipBopCount);
             } else

Modified: trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeVideoSourceMac.mm (216897 => 216898)


--- trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeVideoSourceMac.mm	2017-05-16 01:59:10 UTC (rev 216897)
+++ trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeVideoSourceMac.mm	2017-05-16 02:45:28 UTC (rev 216898)
@@ -65,13 +65,6 @@
 {
 }
 
-RefPtr<MockRealtimeVideoSource> MockRealtimeVideoSource::createMuted(const String& name)
-{
-    auto source = adoptRef(new MockRealtimeVideoSource(name));
-    source->m_muted = true;
-    return source;
-}
-
 RetainPtr<CMSampleBufferRef> MockRealtimeVideoSourceMac::CMSampleBufferFromPixelBuffer(CVPixelBufferRef pixelBuffer)
 {
     if (!pixelBuffer)

Modified: trunk/Source/WebCore/platform/mediastream/mac/RealtimeIncomingAudioSource.cpp (216897 => 216898)


--- trunk/Source/WebCore/platform/mediastream/mac/RealtimeIncomingAudioSource.cpp	2017-05-16 01:59:10 UTC (rev 216897)
+++ trunk/Source/WebCore/platform/mediastream/mac/RealtimeIncomingAudioSource.cpp	2017-05-16 02:45:28 UTC (rev 216898)
@@ -47,7 +47,7 @@
 Ref<RealtimeIncomingAudioSource> RealtimeIncomingAudioSource::create(rtc::scoped_refptr<webrtc::AudioTrackInterface>&& audioTrack, String&& audioTrackId)
 {
     auto source = adoptRef(*new RealtimeIncomingAudioSource(WTFMove(audioTrack), WTFMove(audioTrackId)));
-    source->startProducingData();
+    source->start();
     return source;
 }
 
@@ -55,6 +55,7 @@
     : RealtimeMediaSource(WTFMove(audioTrackId), RealtimeMediaSource::Type::Audio, String())
     , m_audioTrack(WTFMove(audioTrack))
 {
+    notifyMutedChange(!m_audioTrack);
 }
 
 RealtimeIncomingAudioSource::~RealtimeIncomingAudioSource()
@@ -63,7 +64,7 @@
         m_audioSourceProvider->unprepare();
         m_audioSourceProvider = nullptr;
     }
-    stopProducingData();
+    stop();
 }
 
 
@@ -112,10 +113,6 @@
 
 void RealtimeIncomingAudioSource::startProducingData()
 {
-    if (m_isProducingData)
-        return;
-
-    m_isProducingData = true;
     if (m_audioTrack)
         m_audioTrack->AddSink(this);
 }
@@ -122,10 +119,6 @@
 
 void RealtimeIncomingAudioSource::stopProducingData()
 {
-    if (!m_isProducingData)
-        return;
-
-    m_isProducingData = false;
     if (m_audioTrack)
         m_audioTrack->RemoveSink(this);
 }
@@ -136,7 +129,8 @@
     ASSERT(track);
 
     m_audioTrack = WTFMove(track);
-    if (m_isProducingData)
+    notifyMutedChange(!m_audioTrack);
+    if (isProducingData())
         m_audioTrack->AddSink(this);
 }
 

Modified: trunk/Source/WebCore/platform/mediastream/mac/RealtimeIncomingAudioSource.h (216897 => 216898)


--- trunk/Source/WebCore/platform/mediastream/mac/RealtimeIncomingAudioSource.h	2017-05-16 01:59:10 UTC (rev 216897)
+++ trunk/Source/WebCore/platform/mediastream/mac/RealtimeIncomingAudioSource.h	2017-05-16 02:45:28 UTC (rev 216898)
@@ -67,14 +67,11 @@
     MediaConstraints& constraints() { return *m_constraints.get(); }
     RealtimeMediaSourceSupportedConstraints& supportedConstraints();
 
-    bool isProducingData() const final { return m_isProducingData; }
-
     AudioSourceProvider* audioSourceProvider() final;
 
     RealtimeMediaSourceSettings m_currentSettings;
     RealtimeMediaSourceSupportedConstraints m_supportedConstraints;
     RefPtr<MediaConstraints> m_constraints;
-    bool m_isProducingData { false };
     rtc::scoped_refptr<webrtc::AudioTrackInterface> m_audioTrack;
 
     RefPtr<WebAudioSourceProviderAVFObjC> m_audioSourceProvider;

Modified: trunk/Source/WebCore/platform/mediastream/mac/RealtimeIncomingVideoSource.cpp (216897 => 216898)


--- trunk/Source/WebCore/platform/mediastream/mac/RealtimeIncomingVideoSource.cpp	2017-05-16 01:59:10 UTC (rev 216897)
+++ trunk/Source/WebCore/platform/mediastream/mac/RealtimeIncomingVideoSource.cpp	2017-05-16 02:45:28 UTC (rev 216898)
@@ -58,7 +58,7 @@
     PixelBufferConformerCV conformer(conformerOptions.get());
 
     auto source = adoptRef(*new RealtimeIncomingVideoSource(WTFMove(videoTrack), WTFMove(trackId), conformerOptions.get()));
-    source->startProducingData();
+    source->start();
     return source;
 }
 
@@ -67,17 +67,13 @@
     , m_videoTrack(WTFMove(videoTrack))
     , m_conformer(conformerOptions)
 {
-    m_muted = !m_videoTrack;
     m_currentSettings.setWidth(640);
     m_currentSettings.setHeight(480);
+    notifyMutedChange(!m_videoTrack);
 }
 
 void RealtimeIncomingVideoSource::startProducingData()
 {
-    if (m_isProducingData)
-        return;
-
-    m_isProducingData = true;
     if (m_videoTrack)
         m_videoTrack->AddOrUpdateSink(this, rtc::VideoSinkWants());
 }
@@ -87,18 +83,14 @@
     ASSERT(!m_videoTrack);
     ASSERT(track);
 
-    m_muted = false;
-    m_videoTrack = track;
-    if (m_isProducingData)
+    m_videoTrack = WTFMove(track);
+    notifyMutedChange(!m_videoTrack);
+    if (isProducingData())
         m_videoTrack->AddOrUpdateSink(this, rtc::VideoSinkWants());
 }
 
 void RealtimeIncomingVideoSource::stopProducingData()
 {
-    if (!m_isProducingData)
-        return;
-
-    m_isProducingData = false;
     if (m_videoTrack)
         m_videoTrack->RemoveSink(this);
 }
@@ -133,7 +125,7 @@
 
 void RealtimeIncomingVideoSource::OnFrame(const webrtc::VideoFrame& frame)
 {
-    if (!m_isProducingData)
+    if (!isProducingData())
         return;
 
     auto pixelBuffer = pixelBufferFromVideoFrame(frame);

Modified: trunk/Source/WebCore/platform/mediastream/mac/RealtimeIncomingVideoSource.h (216897 => 216898)


--- trunk/Source/WebCore/platform/mediastream/mac/RealtimeIncomingVideoSource.h	2017-05-16 01:59:10 UTC (rev 216897)
+++ trunk/Source/WebCore/platform/mediastream/mac/RealtimeIncomingVideoSource.h	2017-05-16 02:45:28 UTC (rev 216898)
@@ -66,7 +66,6 @@
 
     void processNewSample(CMSampleBufferRef, unsigned, unsigned, MediaSample::VideoRotation);
 
-    bool isProducingData() const final { return m_isProducingData && m_buffer; }
     bool applySize(const IntSize&) final { return true; }
 
     // rtc::VideoSinkInterface
@@ -78,7 +77,6 @@
     RealtimeMediaSourceSettings m_currentSettings;
     RealtimeMediaSourceSupportedConstraints m_supportedConstraints;
     RefPtr<MediaConstraints> m_constraints;
-    bool m_isProducingData { false };
     rtc::scoped_refptr<webrtc::VideoTrackInterface> m_videoTrack;
     RetainPtr<CMSampleBufferRef> m_buffer;
     PixelBufferConformerCV m_conformer;

Modified: trunk/Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm (216897 => 216898)


--- trunk/Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm	2017-05-16 01:59:10 UTC (rev 216897)
+++ trunk/Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm	2017-05-16 02:45:28 UTC (rev 216898)
@@ -109,7 +109,7 @@
     if (m_client && !m_connected) {
         m_connected = true;
         m_captureSource->addObserver(*this);
-        m_captureSource->startProducingData();
+        m_captureSource->start();
     } else if (!m_client && m_connected) {
         m_captureSource->removeObserver(*this);
         m_connected = false;

Modified: trunk/Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp (216897 => 216898)


--- trunk/Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp	2017-05-16 01:59:10 UTC (rev 216897)
+++ trunk/Source/WebCore/platform/mediastream/openwebrtc/MediaEndpointOwr.cpp	2017-05-16 02:45:28 UTC (rev 216898)
@@ -485,7 +485,7 @@
         return;
     }
 
-    if (!remoteSource->stopped())
+    if (remoteSource->isProducingData())
         remoteSource->swapOutShallowSource(*realSource);
 }
 

Modified: trunk/Source/WebCore/platform/mediastream/openwebrtc/RealtimeMediaSourceOwr.h (216897 => 216898)


--- trunk/Source/WebCore/platform/mediastream/openwebrtc/RealtimeMediaSourceOwr.h	2017-05-16 01:59:10 UTC (rev 216897)
+++ trunk/Source/WebCore/platform/mediastream/openwebrtc/RealtimeMediaSourceOwr.h	2017-05-16 02:45:28 UTC (rev 216898)
@@ -55,7 +55,7 @@
     , m_mediaSource(mediaSource)
     {
         if (!mediaSource)
-            m_muted = true;
+            notifyMutedChange(true);
     }
 
 RealtimeMediaSourceOwr(const String& id, RealtimeMediaSource::Type type, const String& name)

Modified: trunk/Source/WebCore/platform/mock/MockMediaEndpoint.cpp (216897 => 216898)


--- trunk/Source/WebCore/platform/mock/MockMediaEndpoint.cpp	2017-05-16 01:59:10 UTC (rev 216897)
+++ trunk/Source/WebCore/platform/mock/MockMediaEndpoint.cpp	2017-05-16 02:45:28 UTC (rev 216898)
@@ -208,7 +208,7 @@
     }
 
     m_mutedRemoteSources.set(mid, source);
-    return *source;
+    return source.releaseNonNull();
 }
 
 void MockMediaEndpoint::replaceSendSource(RealtimeMediaSource& newSource, const String& mid)
@@ -334,7 +334,7 @@
 
 void MockMediaEndpoint::unmuteTimerFired()
 {
-    RefPtr<RealtimeMediaSource> source = m_mutedRemoteSources.get(m_midsOfSourcesToUnmute.takeLast());
+    auto* source = m_mutedRemoteSources.get(m_midsOfSourcesToUnmute.takeLast());
     if (source)
         source->setMuted(false);
 

Modified: trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp (216897 => 216898)


--- trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp	2017-05-16 01:59:10 UTC (rev 216897)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp	2017-05-16 02:45:28 UTC (rev 216898)
@@ -65,14 +65,14 @@
 
     return CaptureSourceOrError(WTFMove(source));
 }
+#endif
 
-RefPtr<MockRealtimeAudioSource> MockRealtimeAudioSource::createMuted(const String& name)
+Ref<MockRealtimeAudioSource> MockRealtimeAudioSource::createMuted(const String& name)
 {
-    auto source = adoptRef(new MockRealtimeAudioSource(name));
-    source->m_muted = true;
+    auto source = adoptRef(*new MockRealtimeAudioSource(name));
+    source->notifyMutedChange(true);
     return source;
 }
-#endif
 
 static MockRealtimeAudioSourceFactory& mockAudioCaptureSourceFactory()
 {
@@ -121,11 +121,6 @@
 
 void MockRealtimeAudioSource::startProducingData()
 {
-    if (m_isProducingData)
-        return;
-
-    m_isProducingData = true;
-
 #if PLATFORM(IOS)
     mockAudioCaptureSourceFactory().setActiveSource(*this);
 #endif
@@ -133,8 +128,6 @@
     if (!sampleRate())
         setSampleRate(!deviceIndex() ? 44100 : 48000);
 
-    MockRealtimeMediaSource::startProducingData();
-
     m_startTime = monotonicallyIncreasingTime();
     m_timer.startRepeating(renderInterval());
 }
@@ -141,12 +134,6 @@
 
 void MockRealtimeAudioSource::stopProducingData()
 {
-    if (!m_isProducingData)
-        return;
-
-    m_isProducingData = false;
-
-    MockRealtimeMediaSource::stopProducingData();
     m_timer.stop();
     m_elapsedTime += monotonicallyIncreasingTime() - m_startTime;
     m_startTime = NAN;

Modified: trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.h (216897 => 216898)


--- trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.h	2017-05-16 01:59:10 UTC (rev 216897)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.h	2017-05-16 02:45:28 UTC (rev 216898)
@@ -43,7 +43,7 @@
 public:
 
     static CaptureSourceOrError create(const String&, const MediaConstraints*);
-    static RefPtr<MockRealtimeAudioSource> createMuted(const String& name);
+    static Ref<MockRealtimeAudioSource> createMuted(const String& name);
 
     static AudioCaptureFactory& factory();
 
@@ -54,7 +54,6 @@
 
     void startProducingData() final;
     void stopProducingData() final;
-    bool isProducingData() const final { return m_isProducingData; }
 
     virtual void render(double) { }
 
@@ -80,7 +79,6 @@
     double m_startTime { NAN };
     double m_lastRenderTime { NAN };
     double m_elapsedTime { 0 };
-    bool m_isProducingData { false };
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/platform/mock/MockRealtimeMediaSource.cpp (216897 => 216898)


--- trunk/Source/WebCore/platform/mock/MockRealtimeMediaSource.cpp	2017-05-16 01:59:10 UTC (rev 216897)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeMediaSource.cpp	2017-05-16 02:45:28 UTC (rev 216898)
@@ -80,11 +80,11 @@
     switch (type) {
     case RealtimeMediaSource::Type::Audio:
         m_deviceIndex = name == audioDevices()[0].label() ? 0 : 1;
-        setPersistentID(audioDevices()[m_deviceIndex].persistentId());
+        setPersistentID(String(audioDevices()[m_deviceIndex].persistentId()));
         return;
     case RealtimeMediaSource::Type::Video:
         m_deviceIndex = name == videoDevices()[0].label() ? 0 : 1;
-        setPersistentID(videoDevices()[m_deviceIndex].persistentId());
+        setPersistentID(String(videoDevices()[m_deviceIndex].persistentId()));
         return;
     case RealtimeMediaSource::Type::None:
         ASSERT_NOT_REACHED();
@@ -132,18 +132,6 @@
     return m_supportedConstraints;
 }
 
-void MockRealtimeMediaSource::startProducingData()
-{
-    m_isProducingData = true;
-    setMuted(false);
-}
-
-void MockRealtimeMediaSource::stopProducingData()
-{
-    m_isProducingData = false;
-    setMuted(true);
-}
-
 } // namespace WebCore
 
 #endif // ENABLE(MEDIA_STREAM)

Modified: trunk/Source/WebCore/platform/mock/MockRealtimeMediaSource.h (216897 => 216898)


--- trunk/Source/WebCore/platform/mock/MockRealtimeMediaSource.h	2017-05-16 01:59:10 UTC (rev 216897)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeMediaSource.h	2017-05-16 02:45:28 UTC (rev 216898)
@@ -65,9 +65,6 @@
     virtual void initializeSupportedConstraints(RealtimeMediaSourceSupportedConstraints&) = 0;
 #endif
 
-    void startProducingData() override;
-    void stopProducingData() override;
-
     const RealtimeMediaSourceCapabilities& capabilities() const override;
     const RealtimeMediaSourceSettings& settings() const override;
 
@@ -84,14 +81,11 @@
     void initializeSettings();
 #endif
 
-    bool isProducingData() const override { return m_isProducingData; }
-
     RealtimeMediaSourceSettings m_currentSettings;
     RealtimeMediaSourceSupportedConstraints m_supportedConstraints;
     std::unique_ptr<RealtimeMediaSourceCapabilities> m_capabilities;
     RefPtr<MediaConstraints> m_constraints;
     unsigned m_deviceIndex { 0 };
-    bool m_isProducingData { false };
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp (216897 => 216898)


--- trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp	2017-05-16 01:59:10 UTC (rev 216897)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp	2017-05-16 02:45:28 UTC (rev 216898)
@@ -72,14 +72,14 @@
 
     return CaptureSourceOrError(WTFMove(source));
 }
+#endif
 
-RefPtr<MockRealtimeVideoSource> MockRealtimeVideoSource::createMuted(const String& name)
+Ref<MockRealtimeVideoSource> MockRealtimeVideoSource::createMuted(const String& name)
 {
-    auto source = adoptRef(new MockRealtimeVideoSource(name));
-    source->m_muted = true;
+    auto source = adoptRef(*new MockRealtimeVideoSource(name));
+    source->notifyMutedChange(true);
     return source;
 }
-#endif
 
 static MockRealtimeVideoSourceFactory& mockVideoCaptureSourceFactory()
 {
@@ -112,16 +112,10 @@
 
 void MockRealtimeVideoSource::startProducingData()
 {
-    if (m_isProducingData)
-        return;
-    
-    m_isProducingData = true;
-    
 #if PLATFORM(IOS)
     mockVideoCaptureSourceFactory().setActiveSource(*this);
 #endif
 
-    MockRealtimeMediaSource::startProducingData();
     if (size().isEmpty()) {
         setWidth(640);
         setHeight(480);
@@ -133,12 +127,6 @@
 
 void MockRealtimeVideoSource::stopProducingData()
 {
-    if (!m_isProducingData)
-        return;
-    
-    m_isProducingData = false;
-    
-    MockRealtimeMediaSource::stopProducingData();
     m_timer.stop();
     m_elapsedTime += monotonicallyIncreasingTime() - m_startTime;
     m_startTime = NAN;
@@ -384,7 +372,7 @@
     FloatRect frameRect(FloatPoint(), size);
     context.fillRect(FloatRect(FloatPoint(), size), !deviceIndex() ? Color::black : Color::darkGray);
 
-    if (!m_muted && m_enabled) {
+    if (!muted() && enabled()) {
         drawText(context);
         drawAnimation(context);
         drawBoxes(context);

Modified: trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.h (216897 => 216898)


--- trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.h	2017-05-16 01:59:10 UTC (rev 216897)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.h	2017-05-16 02:45:28 UTC (rev 216898)
@@ -47,7 +47,7 @@
 public:
 
     static CaptureSourceOrError create(const String&, const MediaConstraints*);
-    static RefPtr<MockRealtimeVideoSource> createMuted(const String& name);
+    static Ref<MockRealtimeVideoSource> createMuted(const String& name);
 
     static VideoCaptureFactory& factory();
 
@@ -69,7 +69,6 @@
 
     void startProducingData() final;
     void stopProducingData() final;
-    bool isProducingData() const final { return m_isProducingData; }
 
     void drawAnimation(GraphicsContext&);
     void drawText(GraphicsContext&);
@@ -103,7 +102,6 @@
     unsigned m_frameNumber { 0 };
 
     RunLoop::Timer<MockRealtimeVideoSource> m_timer;
-    bool m_isProducingData { false };
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebKit2/ChangeLog (216897 => 216898)


--- trunk/Source/WebKit2/ChangeLog	2017-05-16 01:59:10 UTC (rev 216897)
+++ trunk/Source/WebKit2/ChangeLog	2017-05-16 02:45:28 UTC (rev 216898)
@@ -1,3 +1,15 @@
+2017-05-15  Youenn Fablet  <you...@apple.com>
+
+        Simplify RealtimeMediaSource data production and state
+        https://bugs.webkit.org/show_bug.cgi?id=171999
+
+        Reviewed by Eric Carlson.
+
+        * UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp:
+        (WebKit::UserMediaCaptureManagerProxy::startProducingData):
+        (WebKit::UserMediaCaptureManagerProxy::stopProducingData):
+        * WebProcess/cocoa/UserMediaCaptureManager.cpp:
+
 2017-05-15  Brent Fulgham  <bfulg...@apple.com>
 
         Correct typo (part of r216790).

Modified: trunk/Source/WebKit2/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp (216897 => 216898)


--- trunk/Source/WebKit2/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp	2017-05-16 01:59:10 UTC (rev 216897)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp	2017-05-16 02:45:28 UTC (rev 216898)
@@ -154,7 +154,7 @@
 {
     auto iter = m_proxies.find(id);
     if (iter != m_proxies.end())
-        iter->value->source().startProducingData();
+        iter->value->source().start();
 }
 
 void UserMediaCaptureManagerProxy::stopProducingData(uint64_t id)
@@ -161,7 +161,7 @@
 {
     auto iter = m_proxies.find(id);
     if (iter != m_proxies.end())
-        iter->value->source().stopProducingData();
+        iter->value->source().stop();
 }
 
 void UserMediaCaptureManagerProxy::capabilities(uint64_t id, WebCore::RealtimeMediaSourceCapabilities& capabilities)

Modified: trunk/Source/WebKit2/WebProcess/cocoa/UserMediaCaptureManager.cpp (216897 => 216898)


--- trunk/Source/WebKit2/WebProcess/cocoa/UserMediaCaptureManager.cpp	2017-05-16 01:59:10 UTC (rev 216897)
+++ trunk/Source/WebKit2/WebProcess/cocoa/UserMediaCaptureManager.cpp	2017-05-16 02:45:28 UTC (rev 216898)
@@ -110,8 +110,7 @@
         WebAudioBufferList audioData(m_description, numberOfFrames);
         m_ringBuffer.fetch(audioData.list(), numberOfFrames, time.timeValue());
 
-        for (auto* observer : observers())
-            observer->audioSamplesAvailable(time, audioData, m_description, numberOfFrames);
+        RealtimeMediaSource::audioSamplesAvailable(time, audioData, m_description, numberOfFrames);
     }
 
     void applyConstraintsSucceeded(const WebCore::RealtimeMediaSourceSettings& settings)
@@ -127,24 +126,6 @@
         callbacks.failureHandler(failedConstraint, errorMessage);
     }
 
-    void setMuted(bool muted) final
-    {
-        if (m_muted == muted)
-            return;
-
-        m_muted = muted;
-        m_manager.setMuted(m_id, m_muted);
-    }
-
-    void setEnabled(bool enabled) final
-    {
-        if (m_enabled == enabled)
-            return;
-
-        m_enabled = enabled;
-        m_manager.setEnabled(m_id, m_enabled);
-    }
-
 private:
     void startProducingData() final { m_manager.startProducingData(m_id); }
     void stopProducingData() final { m_manager.stopProducingData(m_id); }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to