Title: [218497] trunk
Revision
218497
Author
[email protected]
Date
2017-06-19 10:12:57 -0700 (Mon, 19 Jun 2017)

Log Message

A cloned MediaStreamTrack should mute independently other tracks using the same source
https://bugs.webkit.org/show_bug.cgi?id=172831
<rdar://problem/32518527>

Patch by Youenn Fablet <[email protected]> on 2017-06-19
Reviewed by Eric Carlson.

Source/WebCore:

Test: webrtc/clone-audio-track.html

Move enabled handling in MediaStreamTrackPrivate instead of RealtimeMediaSource.
Move WebRTC and WebAudio customers of RealtimeMediaSource to MediaStreamTrackPrivate.
Move creation of WebAudio provider to MediaStreamTrackPrivate.

This allows changing some parameters of tracks having the same source independently.
Using this for enabled track attribute.

We no longer stop generating frames in case track is disabled.
This should be added back as an optimization in a follow-up.

* Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp:
(WebCore::LibWebRTCMediaEndpoint::addTrack):
* Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp:
(WebCore::LibWebRTCPeerConnectionBackend::replaceTrack):
* Modules/webaudio/MediaStreamAudioSource.cpp:
* Modules/webaudio/MediaStreamAudioSource.h:
* WebCore.xcodeproj/project.pbxproj:
* platform/mediastream/MediaStreamTrackPrivate.cpp:
(WebCore::MediaStreamTrackPrivate::create):
(WebCore::MediaStreamTrackPrivate::~MediaStreamTrackPrivate):
(WebCore::MediaStreamTrackPrivate::setEnabled):
(WebCore::MediaStreamTrackPrivate::audioSourceProvider):
(WebCore::MediaStreamTrackPrivate::videoSampleAvailable):
(WebCore::MediaStreamTrackPrivate::audioSamplesAvailable):
* platform/mediastream/MediaStreamTrackPrivate.h:
(WebCore::MediaStreamTrackPrivate::Observer::audioSamplesAvailable):
* platform/mediastream/RealtimeMediaSource.cpp:
(WebCore::RealtimeMediaSource::removeObserver):
* platform/mediastream/RealtimeMediaSource.h:
* platform/mediastream/mac/AVMediaCaptureSource.h:
* platform/mediastream/mac/AVMediaCaptureSource.mm:
* platform/mediastream/mac/CoreAudioCaptureSource.cpp:
(WebCore::CoreAudioCaptureSource::startProducingData):
(WebCore::CoreAudioCaptureSource::stopProducingData):
* platform/mediastream/mac/CoreAudioCaptureSource.h:
* platform/mediastream/mac/MockRealtimeAudioSourceMac.h:
* platform/mediastream/mac/MockRealtimeAudioSourceMac.mm:
(WebCore::MockRealtimeAudioSourceMac::render):
* platform/mediastream/mac/RealtimeIncomingAudioSource.cpp:
(WebCore::RealtimeIncomingAudioSource::~RealtimeIncomingAudioSource):
(WebCore::RealtimeIncomingAudioSource::OnData):
* platform/mediastream/mac/RealtimeIncomingAudioSource.h:
* platform/mediastream/mac/RealtimeIncomingVideoSource.cpp:
(WebCore::RealtimeIncomingVideoSource::pixelBufferFromVideoFrame):
* platform/mediastream/mac/RealtimeOutgoingAudioSource.cpp:
(WebCore::RealtimeOutgoingAudioSource::RealtimeOutgoingAudioSource):
(WebCore::RealtimeOutgoingAudioSource::setSource):
* platform/mediastream/mac/RealtimeOutgoingAudioSource.h:
* platform/mediastream/mac/RealtimeOutgoingVideoSource.cpp:
(WebCore::RealtimeOutgoingVideoSource::RealtimeOutgoingVideoSource):
(WebCore::RealtimeOutgoingVideoSource::setSource):
(WebCore::RealtimeOutgoingVideoSource::initializeFromSource):
* platform/mediastream/mac/RealtimeOutgoingVideoSource.h:
* platform/mediastream/mac/WebAudioSourceProviderAVFObjC.h:
* platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:
(WebCore::WebAudioSourceProviderAVFObjC::create):
(WebCore::WebAudioSourceProviderAVFObjC::WebAudioSourceProviderAVFObjC):
(WebCore::WebAudioSourceProviderAVFObjC::setClient):
(WebCore::WebAudioSourceProviderAVFObjC::audioSamplesAvailable):
* platform/mock/MockRealtimeVideoSource.cpp:
(WebCore::MockRealtimeVideoSource::generateFrame):
* platform/spi/cocoa/PassKitSPI.h:

Source/WebKit2:

* WebProcess/cocoa/UserMediaCaptureManager.cpp:
(WebKit::UserMediaCaptureManager::Source::setStorage):

LayoutTests:

* webrtc/clone-audio-track.html: Added.
* webrtc/video-disabled-black.html:
* webrtc/video-unmute-expected.txt:
* webrtc/video-unmute.html:

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (218496 => 218497)


--- trunk/LayoutTests/ChangeLog	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/LayoutTests/ChangeLog	2017-06-19 17:12:57 UTC (rev 218497)
@@ -1,3 +1,16 @@
+2017-06-19  Youenn Fablet  <[email protected]>
+
+        A cloned MediaStreamTrack should mute independently other tracks using the same source
+        https://bugs.webkit.org/show_bug.cgi?id=172831
+        <rdar://problem/32518527>
+
+        Reviewed by Eric Carlson.
+
+        * webrtc/clone-audio-track.html: Added.
+        * webrtc/video-disabled-black.html:
+        * webrtc/video-unmute-expected.txt:
+        * webrtc/video-unmute.html:
+
 2017-06-19  Sam Weinig  <[email protected]>
 
         [WebIDL] Properly model buffer source / typed arrays as their own IDL types

Added: trunk/LayoutTests/webrtc/clone-audio-track-expected.txt (0 => 218497)


--- trunk/LayoutTests/webrtc/clone-audio-track-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/webrtc/clone-audio-track-expected.txt	2017-06-19 17:12:57 UTC (rev 218497)
@@ -0,0 +1,3 @@
+
+PASS Muting an outgoing audio track but not its clone 
+

Added: trunk/LayoutTests/webrtc/clone-audio-track.html (0 => 218497)


--- trunk/LayoutTests/webrtc/clone-audio-track.html	                        (rev 0)
+++ trunk/LayoutTests/webrtc/clone-audio-track.html	2017-06-19 17:12:57 UTC (rev 218497)
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <title>Testing local audio capture playback causes "playing" event to fire</title>
+    <script src=""
+    <script src=""
+</head>
+<body>
+    <script src =""
+    <script>
+    var context = new webkitAudioContext();
+    promise_test((test) => {
+        if (window.testRunner)
+            testRunner.setUserMediaPermission(true);
+
+        return navigator.mediaDevices.getUserMedia({audio: true}).then((localStream) => {
+            var clonedTrack;
+            var remoteTrack;
+            var remoteStream;
+            return new Promise((resolve, reject) => {
+                createConnections((firstConnection) => {
+                    var track = localStream.getAudioTracks()[0];
+                    clonedTrack = track.clone();
+                    track.enabled = false;
+                    firstConnection.addTrack(localStream.getAudioTracks()[0], localStream);
+                }, (secondConnection) => {
+                    secondConnection._ontrack_ = (trackEvent) => {
+                        remoteStream = trackEvent.streams[0];
+                        remoteTrack = remoteStream.getAudioTracks()[0];
+                        resolve();
+                    };
+                });
+            }).then(() => {
+                return analyseAudio(remoteStream, 200, context).then((results) => {
+                    assert_false(results.heardHum, "Did not heard hum from remote enabled track");
+                });
+            }).then(() => {
+                return analyseAudio(new MediaStream([clonedTrack]), 200, context).then((results) => {
+                    assert_true(results.heardHum, "Heard hum from cloned track");
+                });
+            }).then(() => {
+                return context.close();
+            });
+        });
+    }, "Muting an outgoing audio track but not its clone");
+    </script>
+</body>
+</html>

Modified: trunk/LayoutTests/webrtc/video-disabled-black.html (218496 => 218497)


--- trunk/LayoutTests/webrtc/video-disabled-black.html	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/LayoutTests/webrtc/video-disabled-black.html	2017-06-19 17:12:57 UTC (rev 218497)
@@ -27,7 +27,7 @@
 
         imageData = canvas.getContext('2d').getImageData(0, 0, canvas.width, canvas.height);
         assert_true(imageData.data.every( (pixel, index) => {
-            return pixel === 0;
+            return pixel === 0 || (index % 4) === 3;
         }));
 
         finishTest();
@@ -39,11 +39,12 @@
 function testStream(stream)
 {
     video.srcObject = stream;
-    stream.getTracks()[0].enabled = false;
-    // Video may play with black frames
     video._onplay_ = setTimeout(() => {
-        testImage();
-    }, 1000);
+        stream.getTracks()[0].enabled = false;
+        setTimeout(() => {
+            testImage();
+        }, 0);
+    }, 500);
 }
 
 var finishTest, errorTest;

Modified: trunk/LayoutTests/webrtc/video-unmute-expected.txt (218496 => 218497)


--- trunk/LayoutTests/webrtc/video-unmute-expected.txt	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/LayoutTests/webrtc/video-unmute-expected.txt	2017-06-19 17:12:57 UTC (rev 218497)
@@ -1,6 +1,6 @@
    
 
 PASS Setting video exchange 
-PASS Track is enabled, video should be black 
+PASS Track is disabled, video should be black 
 PASS Track is enabled, video should not be black 
 

Modified: trunk/LayoutTests/webrtc/video-unmute.html (218496 => 218497)


--- trunk/LayoutTests/webrtc/video-unmute.html	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/LayoutTests/webrtc/video-unmute.html	2017-06-19 17:12:57 UTC (rev 218497)
@@ -78,7 +78,7 @@
 
 promise_test((test) => {
     return checkVideoBlack(true, "canvas1");
-}, "Track is enabled, video should be black");
+}, "Track is disabled, video should be black");
 
 promise_test((test) => {
     track.enabled = true;

Modified: trunk/Source/WebCore/ChangeLog (218496 => 218497)


--- trunk/Source/WebCore/ChangeLog	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebCore/ChangeLog	2017-06-19 17:12:57 UTC (rev 218497)
@@ -1,3 +1,76 @@
+2017-06-19  Youenn Fablet  <[email protected]>
+
+        A cloned MediaStreamTrack should mute independently other tracks using the same source
+        https://bugs.webkit.org/show_bug.cgi?id=172831
+        <rdar://problem/32518527>
+
+        Reviewed by Eric Carlson.
+
+        Test: webrtc/clone-audio-track.html
+
+        Move enabled handling in MediaStreamTrackPrivate instead of RealtimeMediaSource.
+        Move WebRTC and WebAudio customers of RealtimeMediaSource to MediaStreamTrackPrivate.
+        Move creation of WebAudio provider to MediaStreamTrackPrivate.
+
+        This allows changing some parameters of tracks having the same source independently.
+        Using this for enabled track attribute.
+
+        We no longer stop generating frames in case track is disabled.
+        This should be added back as an optimization in a follow-up.
+
+        * Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp:
+        (WebCore::LibWebRTCMediaEndpoint::addTrack):
+        * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp:
+        (WebCore::LibWebRTCPeerConnectionBackend::replaceTrack):
+        * Modules/webaudio/MediaStreamAudioSource.cpp:
+        * Modules/webaudio/MediaStreamAudioSource.h:
+        * WebCore.xcodeproj/project.pbxproj:
+        * platform/mediastream/MediaStreamTrackPrivate.cpp:
+        (WebCore::MediaStreamTrackPrivate::create):
+        (WebCore::MediaStreamTrackPrivate::~MediaStreamTrackPrivate):
+        (WebCore::MediaStreamTrackPrivate::setEnabled):
+        (WebCore::MediaStreamTrackPrivate::audioSourceProvider):
+        (WebCore::MediaStreamTrackPrivate::videoSampleAvailable):
+        (WebCore::MediaStreamTrackPrivate::audioSamplesAvailable):
+        * platform/mediastream/MediaStreamTrackPrivate.h:
+        (WebCore::MediaStreamTrackPrivate::Observer::audioSamplesAvailable):
+        * platform/mediastream/RealtimeMediaSource.cpp:
+        (WebCore::RealtimeMediaSource::removeObserver):
+        * platform/mediastream/RealtimeMediaSource.h:
+        * platform/mediastream/mac/AVMediaCaptureSource.h:
+        * platform/mediastream/mac/AVMediaCaptureSource.mm:
+        * platform/mediastream/mac/CoreAudioCaptureSource.cpp:
+        (WebCore::CoreAudioCaptureSource::startProducingData):
+        (WebCore::CoreAudioCaptureSource::stopProducingData):
+        * platform/mediastream/mac/CoreAudioCaptureSource.h:
+        * platform/mediastream/mac/MockRealtimeAudioSourceMac.h:
+        * platform/mediastream/mac/MockRealtimeAudioSourceMac.mm:
+        (WebCore::MockRealtimeAudioSourceMac::render):
+        * platform/mediastream/mac/RealtimeIncomingAudioSource.cpp:
+        (WebCore::RealtimeIncomingAudioSource::~RealtimeIncomingAudioSource):
+        (WebCore::RealtimeIncomingAudioSource::OnData):
+        * platform/mediastream/mac/RealtimeIncomingAudioSource.h:
+        * platform/mediastream/mac/RealtimeIncomingVideoSource.cpp:
+        (WebCore::RealtimeIncomingVideoSource::pixelBufferFromVideoFrame):
+        * platform/mediastream/mac/RealtimeOutgoingAudioSource.cpp:
+        (WebCore::RealtimeOutgoingAudioSource::RealtimeOutgoingAudioSource):
+        (WebCore::RealtimeOutgoingAudioSource::setSource):
+        * platform/mediastream/mac/RealtimeOutgoingAudioSource.h:
+        * platform/mediastream/mac/RealtimeOutgoingVideoSource.cpp:
+        (WebCore::RealtimeOutgoingVideoSource::RealtimeOutgoingVideoSource):
+        (WebCore::RealtimeOutgoingVideoSource::setSource):
+        (WebCore::RealtimeOutgoingVideoSource::initializeFromSource):
+        * platform/mediastream/mac/RealtimeOutgoingVideoSource.h:
+        * platform/mediastream/mac/WebAudioSourceProviderAVFObjC.h:
+        * platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:
+        (WebCore::WebAudioSourceProviderAVFObjC::create):
+        (WebCore::WebAudioSourceProviderAVFObjC::WebAudioSourceProviderAVFObjC):
+        (WebCore::WebAudioSourceProviderAVFObjC::setClient):
+        (WebCore::WebAudioSourceProviderAVFObjC::audioSamplesAvailable):
+        * platform/mock/MockRealtimeVideoSource.cpp:
+        (WebCore::MockRealtimeVideoSource::generateFrame):
+        * platform/spi/cocoa/PassKitSPI.h:
+
 2017-06-19  Sam Weinig  <[email protected]>
 
         [WebIDL] Properly model buffer source / typed arrays as their own IDL types

Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp (218496 => 218497)


--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp	2017-06-19 17:12:57 UTC (rev 218497)
@@ -176,10 +176,9 @@
         mediaStreams.push_back(mediaStream.get());
     }
     
-    auto& source = track.source();
-    switch (source.type()) {
+    switch (track.privateTrack().type()) {
     case RealtimeMediaSource::Type::Audio: {
-        auto trackSource = RealtimeOutgoingAudioSource::create(source);
+        auto trackSource = RealtimeOutgoingAudioSource::create(track.privateTrack());
         auto audioTrack = m_peerConnectionFactory.CreateAudioTrack(track.id().utf8().data(), trackSource.ptr());
         m_peerConnectionBackend.addAudioSource(WTFMove(trackSource));
         m_senders.add(&sender, m_backend->AddTrack(audioTrack.get(), WTFMove(mediaStreams)));
@@ -186,7 +185,7 @@
         return;
     }
     case RealtimeMediaSource::Type::Video: {
-        auto videoSource = RealtimeOutgoingVideoSource::create(source);
+        auto videoSource = RealtimeOutgoingVideoSource::create(track.privateTrack());
         auto videoTrack = m_peerConnectionFactory.CreateVideoTrack(track.id().utf8().data(), videoSource.ptr());
         m_peerConnectionBackend.addVideoSource(WTFMove(videoSource));
         m_senders.add(&sender, m_backend->AddTrack(videoTrack.get(), WTFMove(mediaStreams)));

Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp (218496 => 218497)


--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp	2017-06-19 17:12:57 UTC (rev 218497)
@@ -361,8 +361,8 @@
         break;
     case RealtimeMediaSource::Type::Audio: {
         for (auto& audioSource : m_audioSources) {
-            if (&audioSource->source() == &currentTrack->source()) {
-                if (!audioSource->setSource(track->source())) {
+            if (&audioSource->source() == &currentTrack->privateTrack()) {
+                if (!audioSource->setSource(track->privateTrack())) {
                     promise.reject(INVALID_MODIFICATION_ERR);
                     return;
                 }
@@ -375,8 +375,8 @@
     }
     case RealtimeMediaSource::Type::Video: {
         for (auto& videoSource : m_videoSources) {
-            if (&videoSource->source() == &currentTrack->source()) {
-                if (!videoSource->setSource(track->source())) {
+            if (&videoSource->source() == &currentTrack->privateTrack()) {
+                if (!videoSource->setSource(track->privateTrack())) {
                     promise.reject(INVALID_MODIFICATION_ERR);
                     return;
                 }

Modified: trunk/Source/WebCore/Modules/webaudio/MediaStreamAudioSource.cpp (218496 => 218497)


--- trunk/Source/WebCore/Modules/webaudio/MediaStreamAudioSource.cpp	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebCore/Modules/webaudio/MediaStreamAudioSource.cpp	2017-06-19 17:12:57 UTC (rev 218497)
@@ -60,13 +60,6 @@
     return m_currentSettings;
 }
 
-AudioSourceProvider* MediaStreamAudioSource::audioSourceProvider()
-{
-    // FIXME: implement this.
-    notImplemented();
-    return nullptr;
-}
-
 void MediaStreamAudioSource::addAudioConsumer(AudioDestinationConsumer* consumer)
 {
     LockHolder locker(m_audioConsumersLock);

Modified: trunk/Source/WebCore/Modules/webaudio/MediaStreamAudioSource.h (218496 => 218497)


--- trunk/Source/WebCore/Modules/webaudio/MediaStreamAudioSource.h	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebCore/Modules/webaudio/MediaStreamAudioSource.h	2017-06-19 17:12:57 UTC (rev 218497)
@@ -62,7 +62,6 @@
 private:
     MediaStreamAudioSource();
 
-    AudioSourceProvider* audioSourceProvider() override;
     bool isCaptureSource() const final { return true; }
 
     String m_deviceId;

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (218496 => 218497)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2017-06-19 17:12:57 UTC (rev 218497)
@@ -302,7 +302,7 @@
 		07FE99DC18807A7D00256648 /* MediaElementSession.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07FE99DA18807A7D00256648 /* MediaElementSession.cpp */; };
 		07FE99DD18807A7D00256648 /* MediaElementSession.h in Headers */ = {isa = PBXBuildFile; fileRef = 07FE99DB18807A7D00256648 /* MediaElementSession.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		07FFDE68181AED420072D409 /* MediaStreamTrackPrivate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07FFDE66181AED420072D409 /* MediaStreamTrackPrivate.cpp */; };
-		07FFDE69181AED420072D409 /* MediaStreamTrackPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 07FFDE67181AED420072D409 /* MediaStreamTrackPrivate.h */; };
+		07FFDE69181AED420072D409 /* MediaStreamTrackPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 07FFDE67181AED420072D409 /* MediaStreamTrackPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		0806E57A12893045007CED32 /* SVGMatrix.h in Headers */ = {isa = PBXBuildFile; fileRef = 0806E57912893045007CED32 /* SVGMatrix.h */; };
 		080E49261255F3BD00EFCA27 /* SVGTextLayoutEngineBaseline.h in Headers */ = {isa = PBXBuildFile; fileRef = 080E49221255F3BD00EFCA27 /* SVGTextLayoutEngineBaseline.h */; };
 		080E49281255F3BD00EFCA27 /* SVGTextLayoutEngineSpacing.h in Headers */ = {isa = PBXBuildFile; fileRef = 080E49241255F3BD00EFCA27 /* SVGTextLayoutEngineSpacing.h */; };
@@ -1785,6 +1785,7 @@
 		41ABE67B1D0580DB006D862D /* CrossOriginPreflightChecker.h in Headers */ = {isa = PBXBuildFile; fileRef = 41ABE67A1D0580D5006D862D /* CrossOriginPreflightChecker.h */; };
 		41ABE67C1D0580E0006D862D /* CrossOriginPreflightChecker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41ABE6791D0580D5006D862D /* CrossOriginPreflightChecker.cpp */; };
 		41AD753A1CEF6BD100A31486 /* FetchOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 41AD75391CEF6BCE00A31486 /* FetchOptions.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		41B2A6261EF1BF6D002B9D7A /* WebAudioSourceProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 41B2A6251EF1BF60002B9D7A /* WebAudioSourceProvider.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		41BF700C0FE86F49005E8DEC /* MessagePortChannel.h in Headers */ = {isa = PBXBuildFile; fileRef = 41BF700A0FE86F49005E8DEC /* MessagePortChannel.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		41BF700F0FE86F61005E8DEC /* PlatformMessagePortChannel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41BF700D0FE86F61005E8DEC /* PlatformMessagePortChannel.cpp */; };
 		41BF70100FE86F61005E8DEC /* PlatformMessagePortChannel.h in Headers */ = {isa = PBXBuildFile; fileRef = 41BF700E0FE86F61005E8DEC /* PlatformMessagePortChannel.h */; };
@@ -2877,8 +2878,6 @@
 		65FEA86909833ADE00BED4AB /* Page.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 65FEA86809833ADE00BED4AB /* Page.cpp */; };
 		69A6CBAC1C6BE42C00B836E9 /* AccessibilitySVGElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 697101071C6BE1550018C7F1 /* AccessibilitySVGElement.cpp */; };
 		69A6CBAD1C6BE42C00B836E9 /* AccessibilitySVGElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 697101081C6BE1550018C7F1 /* AccessibilitySVGElement.h */; };
-		6A32D7CE1A16D8C000412F0B /* InspectorCanvasAgent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6A4B6D6619D225D8006F11D3 /* InspectorCanvasAgent.cpp */; };
-		6A4B6D6519D22519006F11D3 /* InspectorCanvasAgent.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A4B6D6419D22519006F11D3 /* InspectorCanvasAgent.h */; };
 		6B3480940EEF50D400AC1B41 /* NativeImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B3480920EEF50D400AC1B41 /* NativeImage.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		6B693A2E1C51A82E00B03BEF /* ResourceLoadObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B693A2D1C51A82E00B03BEF /* ResourceLoadObserver.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		6B693A341C51A95D00B03BEF /* ResourceLoadObserver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6B693A331C51A95D00B03BEF /* ResourceLoadObserver.cpp */; };
@@ -9479,6 +9478,7 @@
 		41ABE6791D0580D5006D862D /* CrossOriginPreflightChecker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CrossOriginPreflightChecker.cpp; sourceTree = "<group>"; };
 		41ABE67A1D0580D5006D862D /* CrossOriginPreflightChecker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CrossOriginPreflightChecker.h; sourceTree = "<group>"; };
 		41AD75391CEF6BCE00A31486 /* FetchOptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FetchOptions.h; sourceTree = "<group>"; };
+		41B2A6251EF1BF60002B9D7A /* WebAudioSourceProvider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WebAudioSourceProvider.h; sourceTree = "<group>"; };
 		41BF700A0FE86F49005E8DEC /* MessagePortChannel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MessagePortChannel.h; sourceTree = "<group>"; };
 		41BF700D0FE86F61005E8DEC /* PlatformMessagePortChannel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PlatformMessagePortChannel.cpp; path = default/PlatformMessagePortChannel.cpp; sourceTree = "<group>"; };
 		41BF700E0FE86F61005E8DEC /* PlatformMessagePortChannel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PlatformMessagePortChannel.h; path = default/PlatformMessagePortChannel.h; sourceTree = "<group>"; };
@@ -10732,8 +10732,6 @@
 		65FEA86809833ADE00BED4AB /* Page.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = Page.cpp; sourceTree = "<group>"; };
 		697101071C6BE1550018C7F1 /* AccessibilitySVGElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AccessibilitySVGElement.cpp; sourceTree = "<group>"; };
 		697101081C6BE1550018C7F1 /* AccessibilitySVGElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AccessibilitySVGElement.h; sourceTree = "<group>"; };
-		6A4B6D6419D22519006F11D3 /* InspectorCanvasAgent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InspectorCanvasAgent.h; sourceTree = "<group>"; };
-		6A4B6D6619D225D8006F11D3 /* InspectorCanvasAgent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InspectorCanvasAgent.cpp; sourceTree = "<group>"; };
 		6B3480920EEF50D400AC1B41 /* NativeImage.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NativeImage.h; sourceTree = "<group>"; };
 		6B693A2D1C51A82E00B03BEF /* ResourceLoadObserver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ResourceLoadObserver.h; sourceTree = "<group>"; };
 		6B693A331C51A95D00B03BEF /* ResourceLoadObserver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ResourceLoadObserver.cpp; sourceTree = "<group>"; };
@@ -16302,6 +16300,7 @@
 				5EA3D6E51C85A9C300300BBB /* SDPProcessorScriptResource.cpp */,
 				5EA3D6E61C85A9C300300BBB /* SDPProcessorScriptResource.h */,
 				070E81D01BF27656001FDA48 /* VideoTrackPrivateMediaStream.h */,
+				41B2A6251EF1BF60002B9D7A /* WebAudioSourceProvider.h */,
 			);
 			path = mediastream;
 			sourceTree = "<group>";
@@ -27935,6 +27934,7 @@
 				BE61039E18A9D65A00DD50D7 /* JSDataCue.h in Headers */,
 				BCA83E500D7CE1E9003421A8 /* JSDataTransfer.h in Headers */,
 				4162A4581011464700DFF3ED /* JSDedicatedWorkerGlobalScope.h in Headers */,
+				41B2A6261EF1BF6D002B9D7A /* WebAudioSourceProvider.h in Headers */,
 				FDA15ED212B03F94003A583A /* JSDelayNode.h in Headers */,
 				947949311E0459FA00018D85 /* JSDeprecatedCSSOMCounter.h in Headers */,
 				947949321E0459FA00018D85 /* JSDeprecatedCSSOMPrimitiveValue.h in Headers */,

Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.cpp (218496 => 218497)


--- trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.cpp	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.cpp	2017-06-19 17:12:57 UTC (rev 218497)
@@ -29,16 +29,21 @@
 
 #if ENABLE(MEDIA_STREAM)
 
-#include "AudioSourceProvider.h"
 #include "GraphicsContext.h"
 #include "IntRect.h"
 #include <wtf/UUID.h>
 
+#if PLATFORM(COCOA)
+#include "WebAudioSourceProviderAVFObjC.h"
+#else
+#include "WebAudioSourceProvider.h"
+#endif
+
 namespace WebCore {
 
 Ref<MediaStreamTrackPrivate> MediaStreamTrackPrivate::create(Ref<RealtimeMediaSource>&& source)
 {
-    return adoptRef(*new MediaStreamTrackPrivate(WTFMove(source), createCanonicalUUIDString()));
+    return create(WTFMove(source), createCanonicalUUIDString());
 }
 
 Ref<MediaStreamTrackPrivate> MediaStreamTrackPrivate::create(Ref<RealtimeMediaSource>&& source, String&& id)
@@ -93,8 +98,6 @@
     // Always update the enabled state regardless of the track being ended.
     m_isEnabled = enabled;
 
-    m_source->setEnabled(enabled);
-
     for (auto& observer : m_observers)
         observer->trackEnabledChanged(*this);
 }
@@ -148,7 +151,11 @@
 
 AudioSourceProvider* MediaStreamTrackPrivate::audioSourceProvider()
 {
-    return m_source->audioSourceProvider();
+#if PLATFORM(COCOA)
+    if (!m_audioSourceProvider)
+        m_audioSourceProvider = WebAudioSourceProviderAVFObjC::create(*this);
+#endif
+    return m_audioSourceProvider.get();
 }
 
 void MediaStreamTrackPrivate::sourceStarted()
@@ -175,12 +182,6 @@
         observer->trackMutedChanged(*this);
 }
 
-void MediaStreamTrackPrivate::sourceEnabledChanged()
-{
-    for (auto& observer : m_observers)
-        observer->trackEnabledChanged(*this);
-}
-
 void MediaStreamTrackPrivate::sourceSettingsChanged()
 {
     for (auto& observer : m_observers)
@@ -200,12 +201,15 @@
         updateReadyState();
     }
 
+    if (!enabled())
+        return;
+
     mediaSample.setTrackID(id());
     for (auto& observer : m_observers)
         observer->sampleBufferUpdated(*this, mediaSample);
 }
 
-void MediaStreamTrackPrivate::audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t)
+void MediaStreamTrackPrivate::audioSamplesAvailable(const MediaTime& mediaTime, const PlatformAudioData& data, const AudioStreamDescription& description, size_t sampleCount)
 {
     if (!m_haveProducedData) {
         m_haveProducedData = true;
@@ -212,8 +216,11 @@
         updateReadyState();
     }
 
+    if (!enabled())
+        return;
+
     for (auto& observer : m_observers)
-        observer->audioSamplesAvailable(*this);
+        observer->audioSamplesAvailable(*this, mediaTime, data, description, sampleCount);
 }
 
 

Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.h (218496 => 218497)


--- trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.h	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.h	2017-06-19 17:12:57 UTC (rev 218497)
@@ -36,6 +36,7 @@
 class GraphicsContext;
 class MediaSample;
 class RealtimeMediaSourceCapabilities;
+class WebAudioSourceProvider;
 
 class MediaStreamTrackPrivate : public RefCounted<MediaStreamTrackPrivate>, public RealtimeMediaSource::Observer {
 public:
@@ -49,7 +50,7 @@
         virtual void trackSettingsChanged(MediaStreamTrackPrivate&) = 0;
         virtual void trackEnabledChanged(MediaStreamTrackPrivate&) = 0;
         virtual void sampleBufferUpdated(MediaStreamTrackPrivate&, MediaSample&) { };
-        virtual void audioSamplesAvailable(MediaStreamTrackPrivate&) { };
+        virtual void audioSamplesAvailable(MediaStreamTrackPrivate&, const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) { };
         virtual void readyStateChanged(MediaStreamTrackPrivate&) { };
     };
 
@@ -106,7 +107,6 @@
     void sourceStarted() final;
     void sourceStopped() final;
     void sourceMutedChanged() final;
-    void sourceEnabledChanged() final;
     void sourceSettingsChanged() final;
     bool preventSourceFromStopping() final;
     void videoSampleAvailable(MediaSample&) final;
@@ -122,6 +122,7 @@
     bool m_isEnabled { true };
     bool m_isEnded { false };
     bool m_haveProducedData { false };
+    RefPtr<WebAudioSourceProvider> m_audioSourceProvider;
 };
 
 typedef Vector<RefPtr<MediaStreamTrackPrivate>> MediaStreamTrackPrivateVector;

Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp (218496 => 218497)


--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp	2017-06-19 17:12:57 UTC (rev 218497)
@@ -116,17 +116,6 @@
         observer.sourceMutedChanged();
 }
 
-void RealtimeMediaSource::setEnabled(bool enabled)
-{
-    if (m_enabled == enabled)
-        return;
-
-    m_enabled = enabled;
-
-    for (Observer& observer : m_observers)
-        observer.sourceEnabledChanged();
-}
-
 void RealtimeMediaSource::settingsDidChange()
 {
     ASSERT(isMainThread());

Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h (218496 => 218497)


--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h	2017-06-19 17:12:57 UTC (rev 218497)
@@ -35,7 +35,6 @@
 
 #if ENABLE(MEDIA_STREAM)
 
-#include "AudioSourceProvider.h"
 #include "CaptureDevice.h"
 #include "Image.h"
 #include "MediaConstraints.h"
@@ -68,12 +67,11 @@
     class Observer {
     public:
         virtual ~Observer() { }
-        
+
         // Source state changes.
         virtual void sourceStarted() { }
         virtual void sourceStopped() { }
         virtual void sourceMutedChanged() { }
-        virtual void sourceEnabledChanged() { }
         virtual void sourceSettingsChanged() { }
 
         // Observer state queries.
@@ -112,7 +110,7 @@
     public:
         virtual ~AudioCaptureFactory() = default;
         virtual CaptureSourceOrError createAudioCaptureSource(const String& audioDeviceID, const MediaConstraints*) = 0;
-        
+
     protected:
         AudioCaptureFactory() = default;
     };
@@ -147,13 +145,10 @@
 
     virtual bool interrupted() const { return m_interrupted; }
     virtual void setInterrupted(bool, bool);
-    
-    bool enabled() const { return m_enabled; }
-    void setEnabled(bool);
 
     const String& name() const { return m_name; }
     void setName(const String& name) { m_name = name; }
-    
+
     unsigned fitnessScore() const { return m_fitnessScore; }
 
     WEBCORE_EXPORT void addObserver(Observer&);
@@ -211,8 +206,6 @@
 
     virtual void monitorOrientation(OrientationNotifier&) { }
 
-    virtual AudioSourceProvider* audioSourceProvider() { return nullptr; }
-
     // Testing only
     virtual void delaySamples(float) { };
 
@@ -250,7 +243,6 @@
     virtual void stopProducingData() { }
 
     bool m_muted { false };
-    bool m_enabled { true };
 
     WeakPtrFactory<RealtimeMediaSource> m_weakPtrFactory;
     String m_id;

Added: trunk/Source/WebCore/platform/mediastream/WebAudioSourceProvider.h (0 => 218497)


--- trunk/Source/WebCore/platform/mediastream/WebAudioSourceProvider.h	                        (rev 0)
+++ trunk/Source/WebCore/platform/mediastream/WebAudioSourceProvider.h	2017-06-19 17:12:57 UTC (rev 218497)
@@ -0,0 +1,40 @@
+/*
+ * 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 COMPUTER, 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 COMPUTER, 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(WEB_AUDIO) && ENABLE(MEDIA_STREAM)
+
+#include "AudioSourceProvider.h"
+#include <wtf/RefCounted.h>
+
+namespace WebCore {
+
+class WebAudioSourceProvider : public RefCounted<WebAudioSourceProvider>, public AudioSourceProvider {
+};
+
+}
+
+#endif

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


--- trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.h	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.h	2017-06-19 17:12:57 UTC (rev 218497)
@@ -72,8 +72,6 @@
 protected:
     AVMediaCaptureSource(AVCaptureDevice*, const AtomicString&, RealtimeMediaSource::Type);
 
-    AudioSourceProvider* audioSourceProvider() override;
-
     virtual void setupCaptureSession() = 0;
     virtual void shutdownCaptureSession() = 0;
     virtual void updateSettings(RealtimeMediaSourceSettings&) = 0;

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


--- trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.mm	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.mm	2017-06-19 17:12:57 UTC (rev 218497)
@@ -312,12 +312,6 @@
     [audioOutput setSampleBufferDelegate:m_objcObserver.get() queue:globaAudioCaptureSerialQueue()];
 }
 
-AudioSourceProvider* AVMediaCaptureSource::audioSourceProvider()
-{
-    ASSERT_NOT_REACHED();
-    return nullptr;
-}
-
 bool AVMediaCaptureSource::interrupted() const
 {
     if (m_interruption != InterruptionReason::None)

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


--- trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.cpp	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.cpp	2017-06-19 17:12:57 UTC (rev 218497)
@@ -706,17 +706,11 @@
 #endif
 
     CoreAudioSharedUnit::singleton().startProducingData();
-
-    if (m_audioSourceProvider)
-        m_audioSourceProvider->prepare(&CoreAudioSharedUnit::singleton().microphoneFormat().streamDescription());
 }
 
 void CoreAudioCaptureSource::stopProducingData()
 {
     CoreAudioSharedUnit::singleton().stopProducingData();
-
-    if (m_audioSourceProvider)
-        m_audioSourceProvider->unprepare();
 }
 
 const RealtimeMediaSourceCapabilities& CoreAudioCaptureSource::capabilities() const
@@ -759,17 +753,6 @@
     RealtimeMediaSource::settingsDidChange();
 }
 
-AudioSourceProvider* CoreAudioCaptureSource::audioSourceProvider()
-{
-    if (!m_audioSourceProvider) {
-        m_audioSourceProvider = WebAudioSourceProviderAVFObjC::create(*this);
-        if (isProducingData())
-            m_audioSourceProvider->prepare(&CoreAudioSharedUnit::singleton().microphoneFormat().streamDescription());
-    }
-
-    return m_audioSourceProvider.get();
-}
-
 bool CoreAudioCaptureSource::applySampleRate(int sampleRate)
 {
     // FIXME: We should be able to describe sample rate as a discreet range constraint so that we only enter here with values that can be applied.

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


--- trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.h	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.h	2017-06-19 17:12:57 UTC (rev 218497)
@@ -88,7 +88,6 @@
     const RealtimeMediaSourceCapabilities& capabilities() const final;
     const RealtimeMediaSourceSettings& settings() const final;
     void settingsDidChange() final;
-    AudioSourceProvider* audioSourceProvider() final;
 
     uint32_t m_captureDeviceID { 0 };
 
@@ -97,7 +96,6 @@
     mutable std::optional<RealtimeMediaSourceCapabilities> m_capabilities;
     mutable std::optional<RealtimeMediaSourceSettings> m_currentSettings;
 
-    RefPtr<WebAudioSourceProviderAVFObjC> m_audioSourceProvider;
     bool m_reconfigurationOngoing { false };
 };
 

Modified: trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeAudioSourceMac.h (218496 => 218497)


--- trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeAudioSourceMac.h	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeAudioSourceMac.h	2017-06-19 17:12:57 UTC (rev 218497)
@@ -49,8 +49,7 @@
 class MockRealtimeAudioSourceMac final : public MockRealtimeAudioSource {
 private:
     friend class MockRealtimeAudioSource;
-    MockRealtimeAudioSourceMac(const String&);
-    ~MockRealtimeAudioSourceMac();
+    explicit MockRealtimeAudioSourceMac(const String&);
 
     bool applySampleRate(int) final;
     bool applySampleSize(int) final { return false; }
@@ -59,8 +58,6 @@
     void render(double) final;
     void reconfigure();
 
-    AudioSourceProvider* audioSourceProvider() final;
-
     std::unique_ptr<WebAudioBufferList> m_audioBufferList;
 
     uint32_t m_maximiumFrameCount;
@@ -69,7 +66,6 @@
 
     RetainPtr<CMFormatDescriptionRef> m_formatDescription;
     AudioStreamBasicDescription m_streamFormat;
-    RefPtr<WebAudioSourceProviderAVFObjC> m_audioSourceProvider;
 
     Vector<float> m_bipBopBuffer;
 };

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


--- trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeAudioSourceMac.mm	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeAudioSourceMac.mm	2017-06-19 17:12:57 UTC (rev 218497)
@@ -99,14 +99,6 @@
 {
 }
 
-MockRealtimeAudioSourceMac::~MockRealtimeAudioSourceMac()
-{
-    if (m_audioSourceProvider) {
-        m_audioSourceProvider->unprepare();
-        m_audioSourceProvider = nullptr;
-    }
-}
-
 void MockRealtimeAudioSourceMac::emitSampleBuffers(uint32_t frameCount)
 {
     ASSERT(m_formatDescription);
@@ -151,7 +143,7 @@
         uint32_t bipBopCount = std::min(frameCount, bipBopRemain);
         for (auto& audioBuffer : m_audioBufferList->buffers()) {
             audioBuffer.mDataByteSize = frameCount * m_streamFormat.mBytesPerFrame;
-            if (!muted() && enabled()) {
+            if (!muted()) {
                 memcpy(audioBuffer.mData, &m_bipBopBuffer[bipBopStart], sizeof(Float32) * bipBopCount);
                 addHum(HumVolume, HumFrequency, sampleRate(), m_samplesRendered, static_cast<float*>(audioBuffer.mData), bipBopCount);
             } else
@@ -190,19 +182,6 @@
     return true;
 }
 
-AudioSourceProvider* MockRealtimeAudioSourceMac::audioSourceProvider()
-{
-    if (!m_audioSourceProvider) {
-        if (!m_audioBufferList)
-            reconfigure();
-
-        m_audioSourceProvider = WebAudioSourceProviderAVFObjC::create(*this);
-        m_audioSourceProvider->prepare(&m_streamFormat);
-    }
-
-    return m_audioSourceProvider.get();
-}
-
 } // namespace WebCore
 
 #endif // ENABLE(MEDIA_STREAM)

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


--- trunk/Source/WebCore/platform/mediastream/mac/RealtimeIncomingAudioSource.cpp	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebCore/platform/mediastream/mac/RealtimeIncomingAudioSource.cpp	2017-06-19 17:12:57 UTC (rev 218497)
@@ -60,10 +60,6 @@
 
 RealtimeIncomingAudioSource::~RealtimeIncomingAudioSource()
 {
-    if (m_audioSourceProvider) {
-        m_audioSourceProvider->unprepare();
-        m_audioSourceProvider = nullptr;
-    }
     stop();
 }
 
@@ -91,24 +87,19 @@
     m_numberOfFrames += numberOfFrames;
 
     AudioStreamBasicDescription newDescription = streamDescription(sampleRate, numberOfChannels);
-    if (newDescription != m_streamFormat) {
-        m_streamFormat = newDescription;
-        if (m_audioSourceProvider)
-            m_audioSourceProvider->prepare(&m_streamFormat);
-    }
 
     // FIXME: We should not need to do the extra memory allocation and copy.
     // Instead, we should be able to directly pass audioData pointer.
-    WebAudioBufferList audioBufferList { CAAudioStreamDescription(m_streamFormat), WTF::safeCast<uint32_t>(numberOfFrames) };
+    WebAudioBufferList audioBufferList { CAAudioStreamDescription(newDescription), WTF::safeCast<uint32_t>(numberOfFrames) };
     audioBufferList.buffer(0)->mDataByteSize = numberOfChannels * numberOfFrames * bitsPerSample / 8;
     audioBufferList.buffer(0)->mNumberChannels = numberOfChannels;
 
-    if (muted() || !enabled())
+    if (muted())
         memset(audioBufferList.buffer(0)->mData, 0, audioBufferList.buffer(0)->mDataByteSize);
     else
         memcpy(audioBufferList.buffer(0)->mData, audioData, audioBufferList.buffer(0)->mDataByteSize);
 
-    audioSamplesAvailable(mediaTime, audioBufferList, CAAudioStreamDescription(m_streamFormat), numberOfFrames);
+    audioSamplesAvailable(mediaTime, audioBufferList, CAAudioStreamDescription(newDescription), numberOfFrames);
 }
 
 void RealtimeIncomingAudioSource::startProducingData()
@@ -144,17 +135,6 @@
     return m_currentSettings;
 }
 
-AudioSourceProvider* RealtimeIncomingAudioSource::audioSourceProvider()
-{
-    if (!m_audioSourceProvider) {
-        m_audioSourceProvider = WebAudioSourceProviderAVFObjC::create(*this);
-        if (m_numberOfFrames)
-            m_audioSourceProvider->prepare(&m_streamFormat);
-    }
-
-    return m_audioSourceProvider.get();
 }
 
-} // namespace WebCore
-
 #endif // USE(LIBWEBRTC)

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


--- trunk/Source/WebCore/platform/mediastream/mac/RealtimeIncomingAudioSource.h	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebCore/platform/mediastream/mac/RealtimeIncomingAudioSource.h	2017-06-19 17:12:57 UTC (rev 218497)
@@ -64,13 +64,9 @@
     const RealtimeMediaSourceCapabilities& capabilities() const final;
     const RealtimeMediaSourceSettings& settings() const final;
 
-    AudioSourceProvider* audioSourceProvider() final;
-
     RealtimeMediaSourceSettings m_currentSettings;
     rtc::scoped_refptr<webrtc::AudioTrackInterface> m_audioTrack;
 
-    RefPtr<WebAudioSourceProviderAVFObjC> m_audioSourceProvider;
-    AudioStreamBasicDescription m_streamFormat { };
     uint64_t m_numberOfFrames { 0 };
 };
 

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


--- trunk/Source/WebCore/platform/mediastream/mac/RealtimeIncomingVideoSource.cpp	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebCore/platform/mediastream/mac/RealtimeIncomingVideoSource.cpp	2017-06-19 17:12:57 UTC (rev 218497)
@@ -98,7 +98,7 @@
 
 CVPixelBufferRef RealtimeIncomingVideoSource::pixelBufferFromVideoFrame(const webrtc::VideoFrame& frame)
 {
-    if (muted() || !enabled()) {
+    if (muted()) {
         if (!m_blackFrame || m_blackFrameWidth != frame.width() || m_blackFrameHeight != frame.height()) {
             CVPixelBufferRef pixelBuffer = nullptr;
             auto status = CVPixelBufferCreate(kCFAllocatorDefault, frame.width(), frame.height(), kCVPixelFormatType_420YpCbCr8Planar, nullptr, &pixelBuffer);

Modified: trunk/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingAudioSource.cpp (218496 => 218497)


--- trunk/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingAudioSource.cpp	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingAudioSource.cpp	2017-06-19 17:12:57 UTC (rev 218497)
@@ -46,7 +46,7 @@
     return streamFormat;
 }
 
-RealtimeOutgoingAudioSource::RealtimeOutgoingAudioSource(Ref<RealtimeMediaSource>&& audioSource)
+RealtimeOutgoingAudioSource::RealtimeOutgoingAudioSource(Ref<MediaStreamTrackPrivate>&& audioSource)
     : m_audioSource(WTFMove(audioSource))
     , m_sampleConverter(AudioSampleDataSource::create(LibWebRTCAudioFormat::sampleRate * 2))
 {
@@ -54,7 +54,7 @@
     initializeConverter();
 }
 
-bool RealtimeOutgoingAudioSource::setSource(Ref<RealtimeMediaSource>&& newSource)
+bool RealtimeOutgoingAudioSource::setSource(Ref<MediaStreamTrackPrivate>&& newSource)
 {
     m_audioSource->removeObserver(*this);
     m_audioSource = WTFMove(newSource);

Modified: trunk/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingAudioSource.h (218496 => 218497)


--- trunk/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingAudioSource.h	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingAudioSource.h	2017-06-19 17:12:57 UTC (rev 218497)
@@ -32,7 +32,7 @@
 
 #include "AudioSampleDataSource.h"
 #include "LibWebRTCMacros.h"
-#include "RealtimeMediaSource.h"
+#include "MediaStreamTrackPrivate.h"
 #include <webrtc/api/mediastreaminterface.h>
 #include <wtf/ThreadSafeRefCounted.h>
 
@@ -43,18 +43,18 @@
 
 namespace WebCore {
 
-class RealtimeOutgoingAudioSource final : public ThreadSafeRefCounted<RealtimeOutgoingAudioSource>, public webrtc::AudioSourceInterface, private RealtimeMediaSource::Observer {
+class RealtimeOutgoingAudioSource final : public ThreadSafeRefCounted<RealtimeOutgoingAudioSource>, public webrtc::AudioSourceInterface, private MediaStreamTrackPrivate::Observer {
 public:
-    static Ref<RealtimeOutgoingAudioSource> create(Ref<RealtimeMediaSource>&& audioSource) { return adoptRef(*new RealtimeOutgoingAudioSource(WTFMove(audioSource))); }
+    static Ref<RealtimeOutgoingAudioSource> create(Ref<MediaStreamTrackPrivate>&& audioSource) { return adoptRef(*new RealtimeOutgoingAudioSource(WTFMove(audioSource))); }
     ~RealtimeOutgoingAudioSource() { stop(); }
 
     void stop();
 
-    bool setSource(Ref<RealtimeMediaSource>&&);
-    RealtimeMediaSource& source() const { return m_audioSource.get(); }
+    bool setSource(Ref<MediaStreamTrackPrivate>&&);
+    MediaStreamTrackPrivate& source() const { return m_audioSource.get(); }
 
 private:
-    explicit RealtimeOutgoingAudioSource(Ref<RealtimeMediaSource>&&);
+    explicit RealtimeOutgoingAudioSource(Ref<MediaStreamTrackPrivate>&&);
 
     virtual void AddSink(webrtc::AudioTrackSinkInterface* sink) { m_sinks.append(sink); }
     virtual void RemoveSink(webrtc::AudioTrackSinkInterface* sink) { m_sinks.removeFirst(sink); }
@@ -66,17 +66,23 @@
     void RegisterObserver(webrtc::ObserverInterface*) final { }
     void UnregisterObserver(webrtc::ObserverInterface*) final { }
 
-    // RealtimeMediaSource::Observer API
-    void sourceMutedChanged() final;
-    void sourceEnabledChanged() final;
-    void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final;
+    void sourceMutedChanged();
+    void sourceEnabledChanged();
+    void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t);
 
+    // MediaStreamTrackPrivate::Observer API
+    void trackMutedChanged(MediaStreamTrackPrivate&) final { sourceMutedChanged(); }
+    void trackEnabledChanged(MediaStreamTrackPrivate&) final { sourceEnabledChanged(); }
+    void audioSamplesAvailable(MediaStreamTrackPrivate&, const MediaTime& mediaTime, const PlatformAudioData& data, const AudioStreamDescription& description, size_t sampleCount) final { audioSamplesAvailable(mediaTime, data, description, sampleCount); }
+    void trackEnded(MediaStreamTrackPrivate&) final { }
+    void trackSettingsChanged(MediaStreamTrackPrivate&) final { }
+
     void pullAudioData();
 
     void initializeConverter();
 
     Vector<webrtc::AudioTrackSinkInterface*> m_sinks;
-    Ref<RealtimeMediaSource> m_audioSource;
+    Ref<MediaStreamTrackPrivate> m_audioSource;
     Ref<AudioSampleDataSource> m_sampleConverter;
     CAAudioStreamDescription m_inputStreamDescription;
     CAAudioStreamDescription m_outputStreamDescription;

Modified: trunk/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingVideoSource.cpp (218496 => 218497)


--- trunk/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingVideoSource.cpp	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingVideoSource.cpp	2017-06-19 17:12:57 UTC (rev 218497)
@@ -43,7 +43,7 @@
 
 namespace WebCore {
 
-RealtimeOutgoingVideoSource::RealtimeOutgoingVideoSource(Ref<RealtimeMediaSource>&& videoSource)
+RealtimeOutgoingVideoSource::RealtimeOutgoingVideoSource(Ref<MediaStreamTrackPrivate>&& videoSource)
     : m_videoSource(WTFMove(videoSource))
     , m_blackFrameTimer(*this, &RealtimeOutgoingVideoSource::sendOneBlackFrame)
 {
@@ -51,10 +51,10 @@
     initializeFromSource();
 }
 
-bool RealtimeOutgoingVideoSource::setSource(Ref<RealtimeMediaSource>&& newSource)
+bool RealtimeOutgoingVideoSource::setSource(Ref<MediaStreamTrackPrivate>&& newSource)
 {
     if (!m_initialSettings)
-        m_initialSettings = m_videoSource->settings();
+        m_initialSettings = m_videoSource->source().settings();
 
     m_videoSource->removeObserver(*this);
     m_videoSource = WTFMove(newSource);
@@ -103,7 +103,7 @@
 
 void RealtimeOutgoingVideoSource::initializeFromSource()
 {
-    const auto& settings = m_videoSource->settings();
+    const auto& settings = m_videoSource->source().settings();
     m_width = settings.width();
     m_height = settings.height();
 

Modified: trunk/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingVideoSource.h (218496 => 218497)


--- trunk/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingVideoSource.h	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingVideoSource.h	2017-06-19 17:12:57 UTC (rev 218497)
@@ -31,7 +31,7 @@
 #if USE(LIBWEBRTC)
 
 #include "LibWebRTCMacros.h"
-#include "RealtimeMediaSource.h"
+#include "MediaStreamTrackPrivate.h"
 #include <Timer.h>
 #include <webrtc/api/mediastreaminterface.h>
 #include <webrtc/base/optional.h>
@@ -42,14 +42,14 @@
 
 namespace WebCore {
 
-class RealtimeOutgoingVideoSource final : public ThreadSafeRefCounted<RealtimeOutgoingVideoSource>, public webrtc::VideoTrackSourceInterface, private RealtimeMediaSource::Observer {
+class RealtimeOutgoingVideoSource final : public ThreadSafeRefCounted<RealtimeOutgoingVideoSource>, public webrtc::VideoTrackSourceInterface, private MediaStreamTrackPrivate::Observer {
 public:
-    static Ref<RealtimeOutgoingVideoSource> create(Ref<RealtimeMediaSource>&& videoSource) { return adoptRef(*new RealtimeOutgoingVideoSource(WTFMove(videoSource))); }
+    static Ref<RealtimeOutgoingVideoSource> create(Ref<MediaStreamTrackPrivate>&& videoSource) { return adoptRef(*new RealtimeOutgoingVideoSource(WTFMove(videoSource))); }
     ~RealtimeOutgoingVideoSource() { stop(); }
 
     void stop();
-    bool setSource(Ref<RealtimeMediaSource>&&);
-    RealtimeMediaSource& source() const { return m_videoSource.get(); }
+    bool setSource(Ref<MediaStreamTrackPrivate>&&);
+    MediaStreamTrackPrivate& source() const { return m_videoSource.get(); }
 
     int AddRef() const final { ref(); return refCount(); }
     int Release() const final { deref(); return refCount(); }
@@ -57,7 +57,7 @@
     void setApplyRotation(bool shouldApplyRotation) { m_shouldApplyRotation = shouldApplyRotation; }
 
 private:
-    RealtimeOutgoingVideoSource(Ref<RealtimeMediaSource>&&);
+    RealtimeOutgoingVideoSource(Ref<MediaStreamTrackPrivate>&&);
 
     void sendFrame(rtc::scoped_refptr<webrtc::VideoFrameBuffer>&&);
     void sendBlackFramesIfNeeded();
@@ -82,15 +82,20 @@
     void AddOrUpdateSink(rtc::VideoSinkInterface<webrtc::VideoFrame>*, const rtc::VideoSinkWants&) final;
     void RemoveSink(rtc::VideoSinkInterface<webrtc::VideoFrame>*) final;
 
-    // RealtimeMediaSource::Observer API
-    void sourceMutedChanged() final;
-    void sourceEnabledChanged() final;
-    void sourceSettingsChanged() final { initializeFromSource(); }
-    void videoSampleAvailable(MediaSample&) final;
+    void sourceMutedChanged();
+    void sourceEnabledChanged();
+    void videoSampleAvailable(MediaSample&);
 
+    // MediaStreamTrackPrivate::Observer API
+    void trackMutedChanged(MediaStreamTrackPrivate&) final { sourceMutedChanged(); }
+    void trackEnabledChanged(MediaStreamTrackPrivate&) final { sourceEnabledChanged(); }
+    void trackSettingsChanged(MediaStreamTrackPrivate&) final { initializeFromSource(); }
+    void sampleBufferUpdated(MediaStreamTrackPrivate&, MediaSample& sample) final { videoSampleAvailable(sample); }
+    void trackEnded(MediaStreamTrackPrivate&) final { }
+
     Vector<rtc::VideoSinkInterface<webrtc::VideoFrame>*> m_sinks;
     webrtc::I420BufferPool m_bufferPool;
-    Ref<RealtimeMediaSource> m_videoSource;
+    Ref<MediaStreamTrackPrivate> m_videoSource;
     bool m_enabled { true };
     bool m_muted { false };
     std::optional<RealtimeMediaSourceSettings> m_initialSettings;

Modified: trunk/Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.h (218496 => 218497)


--- trunk/Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.h	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.h	2017-06-19 17:12:57 UTC (rev 218497)
@@ -27,8 +27,9 @@
 
 #if ENABLE(WEB_AUDIO) && ENABLE(MEDIA_STREAM)
 
-#include "AudioSourceProvider.h"
-#include "RealtimeMediaSource.h"
+#include "MediaStreamTrackPrivate.h"
+#include "WebAudioSourceProvider.h"
+#include <CoreAudio/CoreAudioTypes.h>
 #include <wtf/Lock.h>
 #include <wtf/RefCounted.h>
 #include <wtf/RefPtr.h>
@@ -44,23 +45,27 @@
 class AudioSampleDataSource;
 class CAAudioStreamDescription;
 
-class WEBCORE_EXPORT WebAudioSourceProviderAVFObjC : public RefCounted<WebAudioSourceProviderAVFObjC>, public AudioSourceProvider, RealtimeMediaSource::Observer {
+class WEBCORE_EXPORT WebAudioSourceProviderAVFObjC final : public WebAudioSourceProvider, MediaStreamTrackPrivate::Observer {
 public:
-    static Ref<WebAudioSourceProviderAVFObjC> create(RealtimeMediaSource&);
+    static Ref<WebAudioSourceProviderAVFObjC> create(MediaStreamTrackPrivate&);
     virtual ~WebAudioSourceProviderAVFObjC();
 
-    void prepare(const AudioStreamBasicDescription *);
+    void prepare(const AudioStreamBasicDescription*);
     void unprepare();
 
 private:
-    WebAudioSourceProviderAVFObjC(RealtimeMediaSource&);
+    explicit WebAudioSourceProviderAVFObjC(MediaStreamTrackPrivate&);
 
     // AudioSourceProvider
-    void provideInput(AudioBus*, size_t) override;
-    void setClient(AudioSourceProviderClient*) override;
+    void provideInput(AudioBus*, size_t) final;
+    void setClient(AudioSourceProviderClient*) final;
 
-    // RealtimeMediaSource::Observer
-    void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final;
+    // MediaStreamTrackPrivate::Observer
+    void audioSamplesAvailable(MediaStreamTrackPrivate&, const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final;
+    void trackEnded(MediaStreamTrackPrivate&) final { }
+    void trackMutedChanged(MediaStreamTrackPrivate&) final { }
+    void trackSettingsChanged(MediaStreamTrackPrivate&) final { }
+    void trackEnabledChanged(MediaStreamTrackPrivate&) final { }
 
     size_t m_listBufferSize { 0 };
     std::unique_ptr<CAAudioStreamDescription> m_inputDescription;
@@ -70,11 +75,12 @@
     uint64_t m_writeCount { 0 };
     uint64_t m_readCount { 0 };
     AudioSourceProviderClient* m_client { nullptr };
-    RealtimeMediaSource* m_captureSource { nullptr };
+    MediaStreamTrackPrivate* m_captureSource { nullptr };
     Lock m_mutex;
     bool m_connected { false };
+    AudioStreamBasicDescription m_streamFormat;
 };
-    
+
 }
 
 #endif

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


--- trunk/Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm	2017-06-19 17:12:57 UTC (rev 218497)
@@ -48,12 +48,12 @@
 
 static const double kRingBufferDuration = 1;
 
-Ref<WebAudioSourceProviderAVFObjC> WebAudioSourceProviderAVFObjC::create(RealtimeMediaSource& source)
+Ref<WebAudioSourceProviderAVFObjC> WebAudioSourceProviderAVFObjC::create(MediaStreamTrackPrivate& source)
 {
     return adoptRef(*new WebAudioSourceProviderAVFObjC(source));
 }
 
-WebAudioSourceProviderAVFObjC::WebAudioSourceProviderAVFObjC(RealtimeMediaSource& source)
+WebAudioSourceProviderAVFObjC::WebAudioSourceProviderAVFObjC(MediaStreamTrackPrivate& source)
     : m_captureSource(&source)
 {
 }
@@ -109,7 +109,6 @@
     if (m_client && !m_connected) {
         m_connected = true;
         m_captureSource->addObserver(*this);
-        m_captureSource->start();
     } else if (!m_client && m_connected) {
         m_captureSource->removeObserver(*this);
         m_connected = false;
@@ -161,8 +160,14 @@
     }
 }
 
-void WebAudioSourceProviderAVFObjC::audioSamplesAvailable(const MediaTime&, const PlatformAudioData& data, const AudioStreamDescription&, size_t frameCount)
+void WebAudioSourceProviderAVFObjC::audioSamplesAvailable(MediaStreamTrackPrivate&, const MediaTime&, const PlatformAudioData& data, const AudioStreamDescription& description, size_t frameCount)
 {
+    // FIXME: We should try to call prepare based on trackSettingsChanged callback.
+    ASSERT(description.platformDescription().type == PlatformDescription::CAAudioStreamBasicType);
+    auto& basicDescription = *WTF::get<const AudioStreamBasicDescription*>(description.platformDescription().description);
+    if (m_streamFormat != basicDescription)
+        prepare(&basicDescription);
+
     if (!m_dataSource)
         return;
 

Modified: trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp (218496 => 218497)


--- trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp	2017-06-19 17:12:57 UTC (rev 218497)
@@ -391,7 +391,7 @@
     FloatRect frameRect(FloatPoint(), size);
     context.fillRect(FloatRect(FloatPoint(), size), !deviceIndex() ? Color::black : Color::darkGray);
 
-    if (!muted() && enabled()) {
+    if (!muted()) {
         drawText(context);
         drawAnimation(context);
         drawBoxes(context);

Modified: trunk/Source/WebKit2/ChangeLog (218496 => 218497)


--- trunk/Source/WebKit2/ChangeLog	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebKit2/ChangeLog	2017-06-19 17:12:57 UTC (rev 218497)
@@ -1,3 +1,14 @@
+2017-06-19  Youenn Fablet  <[email protected]>
+
+        A cloned MediaStreamTrack should mute independently other tracks using the same source
+        https://bugs.webkit.org/show_bug.cgi?id=172831
+        <rdar://problem/32518527>
+
+        Reviewed by Eric Carlson.
+
+        * WebProcess/cocoa/UserMediaCaptureManager.cpp:
+        (WebKit::UserMediaCaptureManager::Source::setStorage):
+
 2017-06-19  Carlos Garcia Campos  <[email protected]>
 
         [GTK] Move GTK+ API files that could be shared to glib dirs

Modified: trunk/Source/WebKit2/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp (218496 => 218497)


--- trunk/Source/WebKit2/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp	2017-06-19 17:12:57 UTC (rev 218497)
@@ -72,10 +72,6 @@
         m_manager.process().send(Messages::UserMediaCaptureManager::SourceMutedChanged(m_id, m_source->muted()), 0);
     }
 
-    void sourceEnabledChanged() final {
-        m_manager.process().send(Messages::UserMediaCaptureManager::SourceEnabledChanged(m_id, m_source->enabled()), 0);
-    }
-
     void sourceSettingsChanged() final {
         m_manager.process().send(Messages::UserMediaCaptureManager::SourceSettingsChanged(m_id, m_source->settings()), 0);
     }
@@ -177,13 +173,6 @@
         iter->value->source().setMuted(muted);
 }
 
-void UserMediaCaptureManagerProxy::setEnabled(uint64_t id, bool enabled)
-{
-    auto iter = m_proxies.find(id);
-    if (iter != m_proxies.end())
-        iter->value->source().setEnabled(enabled);
-}
-
 void UserMediaCaptureManagerProxy::applyConstraints(uint64_t id, const WebCore::MediaConstraints& constraints)
 {
     auto iter = m_proxies.find(id);

Modified: trunk/Source/WebKit2/UIProcess/Cocoa/UserMediaCaptureManagerProxy.h (218496 => 218497)


--- trunk/Source/WebKit2/UIProcess/Cocoa/UserMediaCaptureManagerProxy.h	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/UserMediaCaptureManagerProxy.h	2017-06-19 17:12:57 UTC (rev 218497)
@@ -54,7 +54,6 @@
     void stopProducingData(uint64_t);
     void capabilities(uint64_t, WebCore::RealtimeMediaSourceCapabilities&);
     void setMuted(uint64_t, bool);
-    void setEnabled(uint64_t, bool);
     void applyConstraints(uint64_t, const WebCore::MediaConstraints&);
 
     class SourceProxy;

Modified: trunk/Source/WebKit2/UIProcess/Cocoa/UserMediaCaptureManagerProxy.messages.in (218496 => 218497)


--- trunk/Source/WebKit2/UIProcess/Cocoa/UserMediaCaptureManagerProxy.messages.in	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/UserMediaCaptureManagerProxy.messages.in	2017-06-19 17:12:57 UTC (rev 218497)
@@ -27,6 +27,5 @@
     StopProducingData(uint64_t id)
     Capabilities(uint64_t id) -> (WebCore::RealtimeMediaSourceCapabilities capabilities)
     SetMuted(uint64_t id, bool muted)
-    SetEnabled(uint64_t id, bool enabled)
     ApplyConstraints(uint64_t id, struct WebCore::MediaConstraints constraints)
 }

Modified: trunk/Source/WebKit2/WebProcess/cocoa/UserMediaCaptureManager.cpp (218496 => 218497)


--- trunk/Source/WebKit2/WebProcess/cocoa/UserMediaCaptureManager.cpp	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebKit2/WebProcess/cocoa/UserMediaCaptureManager.cpp	2017-06-19 17:12:57 UTC (rev 218497)
@@ -83,8 +83,6 @@
     void setStorage(const SharedMemory::Handle& handle, const WebCore::CAAudioStreamDescription& description, uint64_t numberOfFrames)
     {
         m_description = description;
-        if (m_audioSourceProvider)
-            m_audioSourceProvider->prepare(&m_description.streamDescription());
 
         if (handle.isNull()) {
             m_ringBuffer.deallocate();
@@ -131,15 +129,6 @@
     void stopProducingData() final { m_manager.stopProducingData(m_id); }
     bool isCaptureSource() const final { return true; }
 
-    AudioSourceProvider* audioSourceProvider() final {
-        if (!m_audioSourceProvider) {
-            m_audioSourceProvider = WebAudioSourceProviderAVFObjC::create(*this);
-            if (m_description.format() != AudioStreamDescription::None)
-                m_audioSourceProvider->prepare(&m_description.streamDescription());
-        }
-        return m_audioSourceProvider.get();
-    }
-
     // RealtimeMediaSource
     void beginConfiguration() final { }
     void commitConfiguration() final { }
@@ -155,7 +144,6 @@
     RealtimeMediaSourceSettings m_settings;
     CAAudioStreamDescription m_description;
     CARingBuffer m_ringBuffer;
-    RefPtr<WebAudioSourceProviderAVFObjC> m_audioSourceProvider;
 
     struct ApplyConstraintsCallback {
         SuccessHandler successHandler;
@@ -218,12 +206,6 @@
     m_sources.get(id)->setMuted(muted);
 }
 
-void UserMediaCaptureManager::sourceEnabledChanged(uint64_t id, bool enabled)
-{
-    ASSERT(m_sources.contains(id));
-    m_sources.get(id)->setEnabled(enabled);
-}
-
 void UserMediaCaptureManager::sourceSettingsChanged(uint64_t id, const RealtimeMediaSourceSettings& settings)
 {
     ASSERT(m_sources.contains(id));
@@ -272,11 +254,6 @@
     m_process.send(Messages::UserMediaCaptureManagerProxy::SetMuted(id, muted), 0);
 }
 
-void UserMediaCaptureManager::setEnabled(uint64_t id, bool enabled)
-{
-    m_process.send(Messages::UserMediaCaptureManagerProxy::SetEnabled(id, enabled), 0);
-}
-
 void UserMediaCaptureManager::applyConstraints(uint64_t id, const WebCore::MediaConstraints& constraints)
 {
     m_process.send(Messages::UserMediaCaptureManagerProxy::ApplyConstraints(id, constraints), 0);

Modified: trunk/Source/WebKit2/WebProcess/cocoa/UserMediaCaptureManager.h (218496 => 218497)


--- trunk/Source/WebKit2/WebProcess/cocoa/UserMediaCaptureManager.h	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebKit2/WebProcess/cocoa/UserMediaCaptureManager.h	2017-06-19 17:12:57 UTC (rev 218497)
@@ -64,7 +64,6 @@
     // Messages::UserMediaCaptureManager
     void sourceStopped(uint64_t id);
     void sourceMutedChanged(uint64_t id, bool muted);
-    void sourceEnabledChanged(uint64_t id, bool enabled);
     void sourceSettingsChanged(uint64_t id, const WebCore::RealtimeMediaSourceSettings&);
     void storageChanged(uint64_t id, const SharedMemory::Handle&, const WebCore::CAAudioStreamDescription&, uint64_t numberOfFrames);
     void ringBufferFrameBoundsChanged(uint64_t id, uint64_t startFrame, uint64_t endFrame);
@@ -74,7 +73,6 @@
     void stopProducingData(uint64_t);
     WebCore::RealtimeMediaSourceCapabilities capabilities(uint64_t);
     void setMuted(uint64_t, bool);
-    void setEnabled(uint64_t, bool);
     void applyConstraints(uint64_t, const WebCore::MediaConstraints&);
     void applyConstraintsSucceeded(uint64_t, const WebCore::RealtimeMediaSourceSettings&);
     void applyConstraintsFailed(uint64_t, const String&, const String&);

Modified: trunk/Source/WebKit2/WebProcess/cocoa/UserMediaCaptureManager.messages.in (218496 => 218497)


--- trunk/Source/WebKit2/WebProcess/cocoa/UserMediaCaptureManager.messages.in	2017-06-19 17:01:14 UTC (rev 218496)
+++ trunk/Source/WebKit2/WebProcess/cocoa/UserMediaCaptureManager.messages.in	2017-06-19 17:12:57 UTC (rev 218497)
@@ -24,7 +24,6 @@
 messages -> UserMediaCaptureManager {
     SourceStopped(uint64_t id)
     SourceMutedChanged(uint64_t id, bool muted)
-    SourceEnabledChanged(uint64_t id, bool enabled)
     SourceSettingsChanged(uint64_t id, WebCore::RealtimeMediaSourceSettings settings)
     StorageChanged(uint64_t id, WebKit::SharedMemory::Handle storageHandle, WebCore::CAAudioStreamDescription description, uint64_t numberOfFrames)
     AudioSamplesAvailable(uint64_t id, MediaTime time, uint64_t numberOfFrames, uint64_t startFrame, uint64_t endFrame)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to