Changeset 261626 in webkit
- Timestamp:
- May 13, 2020 11:02:09 AM (4 years ago)
- Location:
- trunk/Source
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r261625 r261626 1 2020-05-13 Youenn Fablet <youenn@apple.com> 2 3 Allow WebAudioBufferList to dynamically change its number of frames 4 https://bugs.webkit.org/show_bug.cgi?id=211720 5 6 Reviewed by Eric Carlson. 7 8 We sometimes create WebAudioBufferList on the stack which triggers allocation of several vectors. 9 Instead of doing that for every audio sample chunk, we should allocate the WebAudioBufferList and resize it as necessary. 10 For that purpose, we introduce WebAudioBufferList::updateWithNumberOfFrames and use it in two places: 11 - When creating an audio track into WebAudio. 12 - When receiving audio chunks from another process. 13 Covered by existing tests. 14 15 * Modules/webaudio/MediaStreamAudioSource.cpp: 16 (WebCore::MediaStreamAudioSource::~MediaStreamAudioSource): 17 * Modules/webaudio/MediaStreamAudioSource.h: 18 * Modules/webaudio/MediaStreamAudioSourceCocoa.cpp: 19 (WebCore::streamDescription): 20 (WebCore::MediaStreamAudioSource::consumeAudio): 21 * platform/audio/cocoa/WebAudioBufferList.cpp: 22 (WebCore::WebAudioBufferList::WebAudioBufferList): 23 (WebCore::WebAudioBufferList::updateWithNumberOfFrames): 24 (WebCore::WebAudioBufferList::channelCount const): 25 * platform/audio/cocoa/WebAudioBufferList.h: 26 * platform/mediastream/mac/MockAudioSharedUnit.mm: 27 (WebCore::MockAudioSharedUnit::reconfigure): 28 Drive-by fix, we do not need to give the size in bytes but the size in samples. 29 1 30 2020-05-13 Andres Gonzalez <andresg_22@apple.com> 2 31 -
trunk/Source/WebCore/Modules/webaudio/MediaStreamAudioSource.cpp
r261566 r261626 30 30 31 31 #include "NotImplemented.h" 32 #include <wtf/UUID.h>32 #include "PlatformAudioData.h" 33 33 34 34 namespace WebCore { … … 39 39 m_currentSettings.setSampleRate(sampleRate); 40 40 } 41 42 MediaStreamAudioSource::~MediaStreamAudioSource() = default; 41 43 42 44 const RealtimeMediaSourceCapabilities& MediaStreamAudioSource::capabilities() -
trunk/Source/WebCore/Modules/webaudio/MediaStreamAudioSource.h
r261566 r261626 36 36 37 37 class AudioBus; 38 class PlatformAudioData; 38 39 class RealtimeMediaSourceCapabilities; 39 40 … … 42 43 static Ref<MediaStreamAudioSource> create(float sampleRate) { return adoptRef(*new MediaStreamAudioSource { sampleRate }); } 43 44 44 ~MediaStreamAudioSource() = default;45 ~MediaStreamAudioSource(); 45 46 46 47 const RealtimeMediaSourceCapabilities& capabilities() final; … … 59 60 String m_deviceId; 60 61 RealtimeMediaSourceSettings m_currentSettings; 62 std::unique_ptr<PlatformAudioData> m_audioBuffer; 61 63 #if USE(AVFOUNDATION) 62 64 size_t m_numberOfFrames { 0 }; -
trunk/Source/WebCore/Modules/webaudio/MediaStreamAudioSourceCocoa.cpp
r261566 r261626 42 42 namespace WebCore { 43 43 44 static inline AudioStreamBasicDescription streamDescription(size_t sampleRate, size_t channelCount)44 static inline CAAudioStreamDescription streamDescription(size_t sampleRate, size_t channelCount) 45 45 { 46 46 bool isFloat = true; … … 76 76 m_numberOfFrames += numberOfFrames; 77 77 78 AudioStreamBasicDescription newDescription = streamDescription(m_currentSettings.sampleRate(), bus.numberOfChannels());78 auto* audioBuffer = m_audioBuffer ? &downcast<WebAudioBufferList>(*m_audioBuffer) : nullptr; 79 79 80 // FIXME: We should do the memory allocation once in MediaStreamAudioSource and resize it according numberOfFrames. 81 WebAudioBufferList audioBufferList { CAAudioStreamDescription(newDescription), WTF::safeCast<uint32_t>(numberOfFrames) }; 80 auto description = streamDescription(m_currentSettings.sampleRate(), bus.numberOfChannels()); 81 if (!audioBuffer || audioBuffer->channelCount() != bus.numberOfChannels()) { 82 m_audioBuffer = makeUnique<WebAudioBufferList>(description, WTF::safeCast<uint32_t>(numberOfFrames)); 83 audioBuffer = &downcast<WebAudioBufferList>(*m_audioBuffer); 84 } else 85 audioBuffer->setSampleCount(numberOfFrames); 82 86 83 87 for (size_t cptr = 0; cptr < bus.numberOfChannels(); ++cptr) 84 copyChannelData(*bus.channel(cptr), *audioBuffer List.buffer(cptr), numberOfFrames, muted());88 copyChannelData(*bus.channel(cptr), *audioBuffer->buffer(cptr), numberOfFrames, muted()); 85 89 86 audioSamplesAvailable(mediaTime, audioBufferList, CAAudioStreamDescription(newDescription), numberOfFrames);90 audioSamplesAvailable(mediaTime, *m_audioBuffer, description, numberOfFrames); 87 91 } 88 92 -
trunk/Source/WebCore/platform/audio/cocoa/WebAudioBufferList.cpp
r261566 r261626 34 34 35 35 WebAudioBufferList::WebAudioBufferList(const CAAudioStreamDescription& format) 36 : m_bytesPerFrame(format.bytesPerFrame()) 37 , m_channelCount(format.numberOfInterleavedChannels()) 36 38 { 37 39 // AudioBufferList is a variable-length struct, so create on the heap with a generic new() operator 38 40 // with a custom size, and initialize the struct manually. 39 41 uint32_t bufferCount = format.numberOfChannelStreams(); 40 uint32_t channelCount = format.numberOfInterleavedChannels();41 42 42 43 uint64_t bufferListSize = offsetof(AudioBufferList, mBuffers) + (sizeof(AudioBuffer) * std::max(1U, bufferCount)); … … 48 49 m_canonicalList->mNumberBuffers = bufferCount; 49 50 for (uint32_t buffer = 0; buffer < bufferCount; ++buffer) 50 m_canonicalList->mBuffers[buffer].mNumberChannels = channelCount;51 m_canonicalList->mBuffers[buffer].mNumberChannels = m_channelCount; 51 52 52 53 reset(); … … 56 57 : WebAudioBufferList(format) 57 58 { 58 if (!sampleCount) 59 setSampleCount(sampleCount); 60 } 61 62 void WebAudioBufferList::setSampleCount(uint32_t sampleCount) 63 { 64 if (!sampleCount || m_sampleCount == sampleCount) 59 65 return; 60 66 61 uint32_t bufferCount = format.numberOfChannelStreams(); 62 uint32_t channelCount = format.numberOfInterleavedChannels(); 63 64 size_t bytesPerBuffer = sampleCount * channelCount * format.bytesPerFrame(); 65 m_flatBuffer.reserveInitialCapacity(bufferCount * bytesPerBuffer); 66 auto data = m_flatBuffer.data(); 67 m_sampleCount = sampleCount; 68 size_t bytesPerBuffer = m_sampleCount * m_channelCount * m_bytesPerFrame; 69 m_flatBuffer.resize(m_canonicalList->mNumberBuffers * bytesPerBuffer); 70 auto* data = m_flatBuffer.data(); 67 71 68 72 for (uint32_t buffer = 0; buffer < m_canonicalList->mNumberBuffers; ++buffer) { … … 78 82 : WebAudioBufferList(format) 79 83 { 80 81 84 if (!sampleBuffer) 82 85 return; -
trunk/Source/WebCore/platform/audio/cocoa/WebAudioBufferList.h
r261566 r261626 47 47 48 48 void reset(); 49 WEBCORE_EXPORT void setSampleCount(uint32_t); 49 50 50 51 AudioBufferList* list() const { return m_list.get(); } … … 52 53 53 54 uint32_t bufferCount() const; 55 uint32_t channelCount() const { return m_channelCount; } 54 56 AudioBuffer* buffer(uint32_t index) const; 55 57 WTF::IteratorRange<AudioBuffer*> buffers() const; … … 59 61 60 62 size_t m_listBufferSize { 0 }; 63 uint32_t m_bytesPerFrame { 0 }; 64 uint32_t m_channelCount { 0 }; 65 uint32_t m_sampleCount { 0 }; 61 66 std::unique_ptr<AudioBufferList> m_canonicalList; 62 67 std::unique_ptr<AudioBufferList> m_list; -
trunk/Source/WebCore/platform/mediastream/mac/MockAudioSharedUnit.mm
r254259 r261626 214 214 FillOutASBDForLPCM(m_streamFormat, rate, channelCount, bitsPerByte * bytesPerFloat, bitsPerByte * bytesPerFloat, isFloat, isBigEndian, isNonInterleaved); 215 215 216 m_audioBufferList = makeUnique<WebAudioBufferList>(m_streamFormat, m_ streamFormat.mBytesPerFrame * m_maximiumFrameCount);216 m_audioBufferList = makeUnique<WebAudioBufferList>(m_streamFormat, m_maximiumFrameCount); 217 217 218 218 CMFormatDescriptionRef formatDescription; -
trunk/Source/WebKit/ChangeLog
r261624 r261626 1 2020-05-13 Youenn Fablet <youenn@apple.com> 2 3 Allow WebAudioBufferList to dynamically change its number of frames 4 https://bugs.webkit.org/show_bug.cgi?id=211720 5 6 Reviewed by Eric Carlson. 7 8 * WebProcess/cocoa/RemoteCaptureSampleManager.cpp: 9 (WebKit::RemoteCaptureSampleManager::RemoteAudio::setStorage): 10 (WebKit::RemoteCaptureSampleManager::RemoteAudio::audioSamplesAvailable): 11 * WebProcess/cocoa/RemoteCaptureSampleManager.h: 12 1 13 2020-05-13 Per Arne Vollan <pvollan@apple.com> 2 14 -
trunk/Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.cpp
r261566 r261626 139 139 storage.setReadOnly(true); 140 140 m_ringBuffer->allocate(description, numberOfFrames); 141 m_buffer = makeUnique<WebAudioBufferList>(description, numberOfFrames); 141 142 } 142 143 143 144 void RemoteCaptureSampleManager::RemoteAudio::audioSamplesAvailable(MediaTime time, uint64_t numberOfFrames, uint64_t startFrame, uint64_t endFrame) 144 145 { 145 // FIXME: We should allocate this buffer once and resize it as needed. 146 WebAudioBufferList audioData(m_description, numberOfFrames); 146 m_buffer->setSampleCount(numberOfFrames); 147 147 148 148 m_ringBuffer->setCurrentFrameBounds(startFrame, endFrame); 149 m_ringBuffer->fetch( audioData.list(), numberOfFrames, time.timeValue());149 m_ringBuffer->fetch(m_buffer->list(), numberOfFrames, time.timeValue()); 150 150 151 m_source->remoteAudioSamplesAvailable(time, audioData, m_description, numberOfFrames);151 m_source->remoteAudioSamplesAvailable(time, *m_buffer, m_description, numberOfFrames); 152 152 } 153 153 -
trunk/Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.h
r261566 r261626 34 34 #include <WebCore/CAAudioStreamDescription.h> 35 35 #include <WebCore/CARingBuffer.h> 36 #include <WebCore/WebAudioBufferList.h> 36 37 #include <wtf/HashMap.h> 37 38 #include <wtf/WorkQueue.h> … … 72 73 WebCore::CAAudioStreamDescription m_description; 73 74 std::unique_ptr<WebCore::CARingBuffer> m_ringBuffer; 75 std::unique_ptr<WebCore::WebAudioBufferList> m_buffer; 74 76 }; 75 77
Note: See TracChangeset
for help on using the changeset viewer.