Title: [294221] trunk/Source/WebCore
Revision
294221
Author
you...@apple.com
Date
2022-05-15 23:37:21 -0700 (Sun, 15 May 2022)

Log Message

Audio playback rate sped up for few seconds when using createMediaElementSource
https://bugs.webkit.org/show_bug.cgi?id=239696
<rdar://problem/92569332>

Reviewed by Eric Carlson.

We added a way for AudioSampleDataSource to reduce latency due to its audio buffer by reading the audio buffer faster
until the audio buffer size decreases to a reasonnable value.
The reasonnable buffer size was computed in terms of multiple of 10ms as RTC sources are pushing 10 or 20 millisecond chunks.
Other sources may push much bigger chunks (100 milliseconds for instance), in which case it does not make real sense to try to reduce the delay below it.
To prevent this, we will decrease the buffer size if it is above 100 milliseconds (as previously) AND the buffer size is 4 times the size of the pushed audio chunk.
4 times the size of the pushed audio chunk is 40 ms for RTC sources which is a reasonnable buffer size.

Manually tested with https://webaudioapi.com/samples/audio-tag/.

* platform/audio/cocoa/AudioSampleDataConverter.h:
* platform/audio/cocoa/AudioSampleDataConverter.mm:
(WebCore::AudioSampleDataConverter::updateBufferedAmount):
* platform/audio/cocoa/AudioSampleDataSource.mm:
(WebCore::AudioSampleDataSource::pushSamplesInternal):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (294220 => 294221)


--- trunk/Source/WebCore/ChangeLog	2022-05-16 02:32:13 UTC (rev 294220)
+++ trunk/Source/WebCore/ChangeLog	2022-05-16 06:37:21 UTC (rev 294221)
@@ -1,3 +1,26 @@
+2022-05-15  Youenn Fablet  <you...@apple.com>
+
+        Audio playback rate sped up for few seconds when using createMediaElementSource
+        https://bugs.webkit.org/show_bug.cgi?id=239696
+        <rdar://problem/92569332>
+
+        Reviewed by Eric Carlson.
+
+        We added a way for AudioSampleDataSource to reduce latency due to its audio buffer by reading the audio buffer faster
+        until the audio buffer size decreases to a reasonnable value.
+        The reasonnable buffer size was computed in terms of multiple of 10ms as RTC sources are pushing 10 or 20 millisecond chunks.
+        Other sources may push much bigger chunks (100 milliseconds for instance), in which case it does not make real sense to try to reduce the delay below it.
+        To prevent this, we will decrease the buffer size if it is above 100 milliseconds (as previously) AND the buffer size is 4 times the size of the pushed audio chunk.
+        4 times the size of the pushed audio chunk is 40 ms for RTC sources which is a reasonnable buffer size.
+
+        Manually tested with https://webaudioapi.com/samples/audio-tag/.
+
+        * platform/audio/cocoa/AudioSampleDataConverter.h:
+        * platform/audio/cocoa/AudioSampleDataConverter.mm:
+        (WebCore::AudioSampleDataConverter::updateBufferedAmount):
+        * platform/audio/cocoa/AudioSampleDataSource.mm:
+        (WebCore::AudioSampleDataSource::pushSamplesInternal):
+
 2022-05-15  Wenson Hsieh  <wenson_hs...@apple.com>
 
         Right click > "Open Link" should trigger a navigation action with WKNavigationTypeLinkActivated

Modified: trunk/Source/WebCore/platform/audio/cocoa/AudioSampleDataConverter.h (294220 => 294221)


--- trunk/Source/WebCore/platform/audio/cocoa/AudioSampleDataConverter.h	2022-05-16 02:32:13 UTC (rev 294220)
+++ trunk/Source/WebCore/platform/audio/cocoa/AudioSampleDataConverter.h	2022-05-16 06:37:21 UTC (rev 294221)
@@ -42,7 +42,7 @@
     ~AudioSampleDataConverter();
 
     OSStatus setFormats(const CAAudioStreamDescription& inputDescription, const CAAudioStreamDescription& outputDescription);
-    bool updateBufferedAmount(size_t currentBufferedAmount);
+    bool updateBufferedAmount(size_t currentBufferedAmount, size_t pushedSampleSize);
     OSStatus convert(const AudioBufferList&, AudioSampleBufferList&, size_t sampleCount);
     size_t regularBufferSize() const { return m_regularBufferSize; }
     bool isRegular() const { return m_selectedConverter == m_regularConverter; }

Modified: trunk/Source/WebCore/platform/audio/cocoa/AudioSampleDataConverter.mm (294220 => 294221)


--- trunk/Source/WebCore/platform/audio/cocoa/AudioSampleDataConverter.mm	2022-05-16 02:32:13 UTC (rev 294220)
+++ trunk/Source/WebCore/platform/audio/cocoa/AudioSampleDataConverter.mm	2022-05-16 06:37:21 UTC (rev 294221)
@@ -72,13 +72,13 @@
     return noErr;
 }
 
-bool AudioSampleDataConverter::updateBufferedAmount(size_t currentBufferedAmount)
+bool AudioSampleDataConverter::updateBufferedAmount(size_t currentBufferedAmount, size_t pushedSampleSize)
 {
     if (currentBufferedAmount) {
         if (m_selectedConverter == m_regularConverter) {
             if (currentBufferedAmount <= m_lowBufferSize)
                 m_selectedConverter = m_lowConverter;
-            else if (currentBufferedAmount >= m_highBufferSize)
+            else if (currentBufferedAmount >= m_highBufferSize && currentBufferedAmount >= 4 * pushedSampleSize)
                 m_selectedConverter = m_highConverter;
         } else if (m_selectedConverter == m_highConverter) {
             if (currentBufferedAmount < m_regularLowBufferSize)

Modified: trunk/Source/WebCore/platform/audio/cocoa/AudioSampleDataSource.mm (294220 => 294221)


--- trunk/Source/WebCore/platform/audio/cocoa/AudioSampleDataSource.mm	2022-05-16 02:32:13 UTC (rev 294220)
+++ trunk/Source/WebCore/platform/audio/cocoa/AudioSampleDataSource.mm	2022-05-16 06:37:21 UTC (rev 294221)
@@ -129,7 +129,7 @@
     int64_t offset = 0;
     const AudioBufferList* sampleBufferList;
 
-    if (m_converter.updateBufferedAmount(m_lastBufferedAmount)) {
+    if (m_converter.updateBufferedAmount(m_lastBufferedAmount, sampleCount)) {
         m_scratchBuffer->reset();
         m_converter.convert(bufferList, *m_scratchBuffer, sampleCount);
         auto expectedSampleCount = sampleCount * m_outputDescription->sampleRate() / m_inputDescription->sampleRate();
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to