- 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);