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