Title: [212581] trunk/Source/WebCore
Revision
212581
Author
jer.no...@apple.com
Date
2017-02-17 14:51:12 -0800 (Fri, 17 Feb 2017)

Log Message

Refactoring: Make sure to unprepare WebAudioSourceProviderAVFObjC when its owner is destroyed.
https://bugs.webkit.org/show_bug.cgi?id=168532

Reviewed by Youenn Fablet.

Because WebAudioSourceProviderAVFObjC has a back-pointer to the object which creted it, make
sure that back-pointer is invalidated once the creating object is destroyed by calling
WebAudioSOurceProviderAVFObjC::unprepare().

Drive-by Fix: In WebAudioSourceProviderAVFObjC::audioSamplesAvailable(), PlatformAudioData will
always be of the WebAudioBufferList type. If this ever becomes untrue, an invalid downcast will
be caught by downcast<>, so just remove the is<> check.

* platform/mediastream/mac/AVAudioCaptureSource.mm:
(WebCore::AVAudioCaptureSource::~AVAudioCaptureSource):
* platform/mediastream/mac/MockRealtimeAudioSourceMac.h:
* platform/mediastream/mac/MockRealtimeAudioSourceMac.mm:
(WebCore::MockRealtimeAudioSourceMac::~MockRealtimeAudioSourceMac):
* platform/mediastream/mac/RealtimeIncomingAudioSource.cpp:
(WebCore::RealtimeIncomingAudioSource::~RealtimeIncomingAudioSource):
* platform/mediastream/mac/RealtimeIncomingAudioSource.h:
* platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:
(WebCore::WebAudioSourceProviderAVFObjC::~WebAudioSourceProviderAVFObjC):
(WebCore::WebAudioSourceProviderAVFObjC::setClient):
(WebCore::WebAudioSourceProviderAVFObjC::unprepare):
(WebCore::WebAudioSourceProviderAVFObjC::audioSamplesAvailable):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (212580 => 212581)


--- trunk/Source/WebCore/ChangeLog	2017-02-17 22:47:23 UTC (rev 212580)
+++ trunk/Source/WebCore/ChangeLog	2017-02-17 22:51:12 UTC (rev 212581)
@@ -1,3 +1,32 @@
+2017-02-17  Jer Noble  <jer.no...@apple.com>
+
+        Refactoring: Make sure to unprepare WebAudioSourceProviderAVFObjC when its owner is destroyed.
+        https://bugs.webkit.org/show_bug.cgi?id=168532
+
+        Reviewed by Youenn Fablet.
+
+        Because WebAudioSourceProviderAVFObjC has a back-pointer to the object which creted it, make
+        sure that back-pointer is invalidated once the creating object is destroyed by calling
+        WebAudioSOurceProviderAVFObjC::unprepare().
+
+        Drive-by Fix: In WebAudioSourceProviderAVFObjC::audioSamplesAvailable(), PlatformAudioData will
+        always be of the WebAudioBufferList type. If this ever becomes untrue, an invalid downcast will
+        be caught by downcast<>, so just remove the is<> check.
+
+        * platform/mediastream/mac/AVAudioCaptureSource.mm:
+        (WebCore::AVAudioCaptureSource::~AVAudioCaptureSource):
+        * platform/mediastream/mac/MockRealtimeAudioSourceMac.h:
+        * platform/mediastream/mac/MockRealtimeAudioSourceMac.mm:
+        (WebCore::MockRealtimeAudioSourceMac::~MockRealtimeAudioSourceMac):
+        * platform/mediastream/mac/RealtimeIncomingAudioSource.cpp:
+        (WebCore::RealtimeIncomingAudioSource::~RealtimeIncomingAudioSource):
+        * platform/mediastream/mac/RealtimeIncomingAudioSource.h:
+        * platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:
+        (WebCore::WebAudioSourceProviderAVFObjC::~WebAudioSourceProviderAVFObjC):
+        (WebCore::WebAudioSourceProviderAVFObjC::setClient):
+        (WebCore::WebAudioSourceProviderAVFObjC::unprepare):
+        (WebCore::WebAudioSourceProviderAVFObjC::audioSamplesAvailable):
+
 2017-02-17  Antoine Quint  <grao...@apple.com>
 
         [Modern Media Controls] Improve handling of <video> with only audio tracks

Modified: trunk/Source/WebCore/platform/mediastream/mac/AVAudioCaptureSource.mm (212580 => 212581)


--- trunk/Source/WebCore/platform/mediastream/mac/AVAudioCaptureSource.mm	2017-02-17 22:47:23 UTC (rev 212580)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVAudioCaptureSource.mm	2017-02-17 22:51:12 UTC (rev 212581)
@@ -96,6 +96,7 @@
     
 AVAudioCaptureSource::~AVAudioCaptureSource()
 {
+    shutdownCaptureSession();
 }
 
 void AVAudioCaptureSource::initializeCapabilities(RealtimeMediaSourceCapabilities& capabilities)

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


--- trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeAudioSourceMac.h	2017-02-17 22:47:23 UTC (rev 212580)
+++ trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeAudioSourceMac.h	2017-02-17 22:51:12 UTC (rev 212581)
@@ -49,6 +49,7 @@
 private:
     friend class MockRealtimeAudioSource;
     MockRealtimeAudioSourceMac(const String&);
+    ~MockRealtimeAudioSourceMac();
 
     bool applySampleRate(int) final;
     bool applySampleSize(int) final { return false; }

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


--- trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeAudioSourceMac.mm	2017-02-17 22:47:23 UTC (rev 212580)
+++ trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeAudioSourceMac.mm	2017-02-17 22:51:12 UTC (rev 212581)
@@ -71,6 +71,14 @@
 {
 }
 
+MockRealtimeAudioSourceMac::~MockRealtimeAudioSourceMac()
+{
+    if (m_audioSourceProvider) {
+        m_audioSourceProvider->unprepare();
+        m_audioSourceProvider = nullptr;
+    }
+}
+
 RefPtr<MockRealtimeAudioSource> MockRealtimeAudioSource::createMuted(const String& name)
 {
     auto source = adoptRef(new MockRealtimeAudioSource(name));

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


--- trunk/Source/WebCore/platform/mediastream/mac/RealtimeIncomingAudioSource.cpp	2017-02-17 22:47:23 UTC (rev 212580)
+++ trunk/Source/WebCore/platform/mediastream/mac/RealtimeIncomingAudioSource.cpp	2017-02-17 22:51:12 UTC (rev 212581)
@@ -51,6 +51,14 @@
 {
 }
 
+RealtimeIncomingAudioSource::~RealtimeIncomingAudioSource()
+{
+    if (m_audioSourceProvider) {
+        m_audioSourceProvider->unprepare();
+        m_audioSourceProvider = nullptr;
+    }
+}
+
 void RealtimeIncomingAudioSource::OnData(const void* audioData, int bitsPerSample, int sampleRate, size_t numberOfChannels, size_t numberOfFrames)
 {
     // FIXME: Implement this.

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


--- trunk/Source/WebCore/platform/mediastream/mac/RealtimeIncomingAudioSource.h	2017-02-17 22:47:23 UTC (rev 212580)
+++ trunk/Source/WebCore/platform/mediastream/mac/RealtimeIncomingAudioSource.h	2017-02-17 22:51:12 UTC (rev 212581)
@@ -50,6 +50,7 @@
 
 private:
     RealtimeIncomingAudioSource(rtc::scoped_refptr<webrtc::AudioTrackInterface>&&, String&&);
+    ~RealtimeIncomingAudioSource();
 
     // webrtc::AudioTrackSinkInterface API
     void OnData(const void* audioData, int bitsPerSample, int sampleRate, size_t numberOfChannels, size_t numberOfFrames) final;

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


--- trunk/Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm	2017-02-17 22:47:23 UTC (rev 212580)
+++ trunk/Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm	2017-02-17 22:51:12 UTC (rev 212581)
@@ -73,7 +73,7 @@
         AudioConverterDispose(m_converter);
         m_converter = nullptr;
     }
-    if (m_connected)
+    if (m_connected && m_captureSource)
         m_captureSource->removeObserver(*this);
 }
 
@@ -128,6 +128,9 @@
 
     m_client = client;
 
+    if (!m_captureSource)
+        return;
+
     if (m_client && !m_connected) {
         m_connected = true;
         m_captureSource->addObserver(*this);
@@ -213,6 +216,11 @@
     m_ringBuffer = nullptr;
     m_list = nullptr;
     m_listBufferSize = 0;
+    if (m_captureSource) {
+        m_captureSource->removeObserver(*this);
+        m_captureSource = nullptr;
+    }
+
     if (m_converter) {
         // FIXME: make and use a smart pointer for AudioConverter
         AudioConverterDispose(m_converter);
@@ -222,7 +230,7 @@
 
 void WebAudioSourceProviderAVFObjC::audioSamplesAvailable(const MediaTime&, const PlatformAudioData& data, const AudioStreamDescription&, size_t frameCount)
 {
-    if (!m_ringBuffer || !is<WebAudioBufferList>(data))
+    if (!m_ringBuffer)
         return;
 
     auto& bufferList = downcast<WebAudioBufferList>(data);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to