Title: [276251] trunk/Source/WebCore
Revision
276251
Author
[email protected]
Date
2021-04-19 06:54:15 -0700 (Mon, 19 Apr 2021)

Log Message

Add assertions to check for no memory allocation in AudioMediaStreamTrackRendererUnit rendering thread
https://bugs.webkit.org/show_bug.cgi?id=224674

Reviewed by Eric Carlson.

Add ForbidMallocUseForCurrentThreadScope in audio rendering code path to prevent memory allocation.
Rename inputProc to renderingCallback.
Remove use of AudioMediaStreamTrackRendererUnit::singleton and instead use the pointer given to renderingCallback.
This is safe as AudioMediaStreamTrackRendererUnit destructor stops the audio unit.

* platform/mediastream/mac/AudioMediaStreamTrackRendererUnit.cpp:
(WebCore::AudioMediaStreamTrackRendererUnit::createAudioUnitIfNeeded):
(WebCore::AudioMediaStreamTrackRendererUnit::render):
(WebCore::AudioMediaStreamTrackRendererUnit::renderingCallback):
(WebCore::AudioMediaStreamTrackRendererUnit::inputProc): Deleted.
* platform/mediastream/mac/AudioMediaStreamTrackRendererUnit.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (276250 => 276251)


--- trunk/Source/WebCore/ChangeLog	2021-04-19 13:43:09 UTC (rev 276250)
+++ trunk/Source/WebCore/ChangeLog	2021-04-19 13:54:15 UTC (rev 276251)
@@ -1,3 +1,22 @@
+2021-04-19  Youenn Fablet  <[email protected]>
+
+        Add assertions to check for no memory allocation in AudioMediaStreamTrackRendererUnit rendering thread
+        https://bugs.webkit.org/show_bug.cgi?id=224674
+
+        Reviewed by Eric Carlson.
+
+        Add ForbidMallocUseForCurrentThreadScope in audio rendering code path to prevent memory allocation.
+        Rename inputProc to renderingCallback.
+        Remove use of AudioMediaStreamTrackRendererUnit::singleton and instead use the pointer given to renderingCallback.
+        This is safe as AudioMediaStreamTrackRendererUnit destructor stops the audio unit.
+
+        * platform/mediastream/mac/AudioMediaStreamTrackRendererUnit.cpp:
+        (WebCore::AudioMediaStreamTrackRendererUnit::createAudioUnitIfNeeded):
+        (WebCore::AudioMediaStreamTrackRendererUnit::render):
+        (WebCore::AudioMediaStreamTrackRendererUnit::renderingCallback):
+        (WebCore::AudioMediaStreamTrackRendererUnit::inputProc): Deleted.
+        * platform/mediastream/mac/AudioMediaStreamTrackRendererUnit.h:
+
 2021-04-19  Zalan Bujtas  <[email protected]>
 
         [LFC] Implement Box::isLayoutContainmentBox

Modified: trunk/Source/WebCore/platform/mediastream/mac/AudioMediaStreamTrackRendererUnit.cpp (276250 => 276251)


--- trunk/Source/WebCore/platform/mediastream/mac/AudioMediaStreamTrackRendererUnit.cpp	2021-04-19 13:43:09 UTC (rev 276250)
+++ trunk/Source/WebCore/platform/mediastream/mac/AudioMediaStreamTrackRendererUnit.cpp	2021-04-19 13:54:15 UTC (rev 276251)
@@ -34,6 +34,7 @@
 #include "Logging.h"
 
 #include <pal/spi/cocoa/AudioToolboxSPI.h>
+#include <wtf/FastMalloc.h>
 #include <wtf/Lock.h>
 
 #if PLATFORM(COCOA)
@@ -203,7 +204,7 @@
     }
 #endif
 
-    AURenderCallbackStruct callback = { inputProc, nullptr };
+    AURenderCallbackStruct callback = { renderingCallback, this };
     error = AudioUnitSetProperty(remoteIOUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Global, 0, &callback, sizeof(callback));
     if (error) {
         RELEASE_LOG_ERROR(WebRTC, "AudioMediaStreamTrackRendererUnit::createAudioUnit unable to set vpio unit speaker proc, error = %d", error);
@@ -237,6 +238,9 @@
 
 OSStatus AudioMediaStreamTrackRendererUnit::render(UInt32 sampleCount, AudioBufferList& ioData, UInt32 /*inBusNumber*/, const AudioTimeStamp& timeStamp, AudioUnitRenderActionFlags& actionFlags)
 {
+    // For performance reasons, we forbid heap allocations while doing rendering on the audio thread.
+    ForbidMallocUseForCurrentThreadScope forbidMallocUse;
+
     ASSERT(!isMainThread());
     if (m_shouldUpdateRenderSources) {
         auto locker = tryHoldLock(m_sourcesLock);
@@ -263,9 +267,9 @@
     return 0;
 }
 
-OSStatus AudioMediaStreamTrackRendererUnit::inputProc(void*, AudioUnitRenderActionFlags* actionFlags, const AudioTimeStamp* timeStamp, UInt32 inBusNumber, UInt32 sampleCount, AudioBufferList* ioData)
+OSStatus AudioMediaStreamTrackRendererUnit::renderingCallback(void* processor, AudioUnitRenderActionFlags* actionFlags, const AudioTimeStamp* timeStamp, UInt32 inBusNumber, UInt32 sampleCount, AudioBufferList* ioData)
 {
-    return AudioMediaStreamTrackRendererUnit::singleton().render(sampleCount, *ioData, inBusNumber, *timeStamp, *actionFlags);
+    return static_cast<AudioMediaStreamTrackRendererUnit*>(processor)->render(sampleCount, *ioData, inBusNumber, *timeStamp, *actionFlags);
 }
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/platform/mediastream/mac/AudioMediaStreamTrackRendererUnit.h (276250 => 276251)


--- trunk/Source/WebCore/platform/mediastream/mac/AudioMediaStreamTrackRendererUnit.h	2021-04-19 13:43:09 UTC (rev 276250)
+++ trunk/Source/WebCore/platform/mediastream/mac/AudioMediaStreamTrackRendererUnit.h	2021-04-19 13:54:15 UTC (rev 276251)
@@ -46,7 +46,7 @@
     AudioMediaStreamTrackRendererUnit() = default;
     ~AudioMediaStreamTrackRendererUnit();
 
-    static OSStatus inputProc(void*, AudioUnitRenderActionFlags*, const AudioTimeStamp*, UInt32 inBusNumber, UInt32 numberOfFrames, AudioBufferList*);
+    static OSStatus renderingCallback(void*, AudioUnitRenderActionFlags*, const AudioTimeStamp*, UInt32 inBusNumber, UInt32 numberOfFrames, AudioBufferList*);
 
     void start();
     void stop();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to