Changeset 268826 in webkit
- Timestamp:
- Oct 21, 2020, 2:33:05 PM (6 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 9 edited
-
ChangeLog (modified) (1 diff)
-
Modules/webaudio/PeriodicWave.cpp (modified) (1 diff)
-
Modules/webaudio/RealtimeAnalyser.cpp (modified) (1 diff)
-
platform/audio/AudioArray.h (modified) (1 diff)
-
platform/audio/FFTFrame.cpp (modified) (6 diffs)
-
platform/audio/FFTFrame.h (modified) (3 diffs)
-
platform/audio/FFTFrameStub.cpp (modified) (1 diff)
-
platform/audio/gstreamer/FFTFrameGStreamer.cpp (modified) (2 diffs)
-
platform/audio/mac/FFTFrameMac.cpp (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r268825 r268826 1 2020-10-21 Chris Dumez <cdumez@apple.com> 2 3 Update FFTFrame::realData() / imagData() to return an AudioFloatArray 4 https://bugs.webkit.org/show_bug.cgi?id=218048 5 6 Reviewed by Philippe Normand. 7 8 Update FFTFrame::realData() / imagData() to return an AudioFloatArray instead of a float*. 9 It is risky to expose a float* since the caller has no way to know the actual size of the 10 array. By returning an AudioFloatArray, the caller can query AudioFloatArray::size() to 11 know the actual size. Note that it is not safe to assume that the size of these arrays 12 is FFTFrame::fftSize() because this is not true for ports using GStreamer. 13 14 * Modules/webaudio/PeriodicWave.cpp: 15 (WebCore::PeriodicWave::createBandLimitedTables): 16 * Modules/webaudio/RealtimeAnalyser.cpp: 17 (WebCore::RealtimeAnalyser::doFFTAnalysisIfNecessary): 18 * platform/audio/FFTFrame.cpp: 19 (WebCore::FFTFrame::interpolateFrequencyComponents): 20 (WebCore::FFTFrame::scaleFFT): 21 (WebCore::FFTFrame::multiply): 22 (WebCore::FFTFrame::extractAverageGroupDelay): 23 (WebCore::FFTFrame::addConstantGroupDelay): 24 (WebCore::FFTFrame::print): 25 * platform/audio/FFTFrame.h: 26 (WebCore::FFTFrame::realData): 27 (WebCore::FFTFrame::imagData): 28 (WebCore::FFTFrame::realData const): 29 (WebCore::FFTFrame::imagData const): 30 * platform/audio/FFTFrameStub.cpp: 31 (WebCore::FFTFrame::realData const): Deleted. 32 (WebCore::FFTFrame::imagData const): Deleted. 33 * platform/audio/gstreamer/FFTFrameGStreamer.cpp: 34 (WebCore::FFTFrame::FFTFrame): 35 (WebCore::FFTFrame::realData const): Deleted. 36 (WebCore::FFTFrame::imagData const): Deleted. 37 * platform/audio/mac/FFTFrameMac.cpp: 38 (WebCore::FFTFrame::FFTFrame): 39 (WebCore::FFTFrame::doFFT): 40 (WebCore::FFTFrame::realData const): Deleted. 41 (WebCore::FFTFrame::imagData const): Deleted. 42 1 43 2020-10-21 Zalan Bujtas <zalan@apple.com> 2 44 -
trunk/Source/WebCore/Modules/webaudio/PeriodicWave.cpp
r268026 r268826 197 197 // This FFTFrame is used to cull partials (represented by frequency bins). 198 198 FFTFrame frame(fftSize); 199 float* realP = frame.realData(); 200 float* imagP = frame.imagData(); 199 auto& realP = frame.realData(); 200 auto& imagP = frame.imagData(); 201 202 RELEASE_ASSERT(realP.size() >= numberOfComponents); 203 RELEASE_ASSERT(imagP.size() >= numberOfComponents); 201 204 202 205 // Copy from loaded frequency data and scale. 203 VectorMath::multiplyByScalar(realData, fftSize, realP , numberOfComponents);204 VectorMath::multiplyByScalar(imagData, -static_cast<float>(fftSize), imagP , numberOfComponents);206 VectorMath::multiplyByScalar(realData, fftSize, realP.data(), numberOfComponents); 207 VectorMath::multiplyByScalar(imagData, -static_cast<float>(fftSize), imagP.data(), numberOfComponents); 205 208 206 209 // Find the starting bin where we should start culling. -
trunk/Source/WebCore/Modules/webaudio/RealtimeAnalyser.cpp
r268414 r268826 155 155 m_analysisFrame->doFFT(tempP); 156 156 157 float*realP = m_analysisFrame->realData();158 float*imagP = m_analysisFrame->imagData();157 auto& realP = m_analysisFrame->realData(); 158 auto& imagP = m_analysisFrame->imagData(); 159 159 160 160 // Blow away the packed nyquist component. -
trunk/Source/WebCore/platform/audio/AudioArray.h
r268414 r268826 82 82 } 83 83 84 const T& at(size_t i) const 85 { 86 // Note that although it is a size_t, m_size is now guaranteed to be 87 // no greater than max unsigned. This guarantee is enforced in resize(). 88 ASSERT_WITH_SECURITY_IMPLICATION(i < size()); 89 return data()[i]; 90 } 91 84 92 T& operator[](size_t i) { return at(i); } 93 const T& operator[](size_t i) const { return at(i); } 85 94 86 95 void zero() -
trunk/Source/WebCore/platform/audio/FFTFrame.cpp
r268026 r268826 76 76 // FIXME : with some work, this method could be optimized 77 77 78 float*realP = realData();79 float*imagP = imagData();80 81 const float*realP1 = frame1.realData();82 const float*imagP1 = frame1.imagData();83 const float*realP2 = frame2.realData();84 const float*imagP2 = frame2.imagData();78 auto& realP = realData(); 79 auto& imagP = imagData(); 80 81 const auto& realP1 = frame1.realData(); 82 const auto& imagP1 = frame1.imagData(); 83 const auto& realP2 = frame2.realData(); 84 const auto& imagP2 = frame2.imagData(); 85 85 86 86 m_FFTSize = frame1.fftSize(); … … 176 176 void FFTFrame::scaleFFT(float factor) 177 177 { 178 VectorMath::multiplyByScalar(realData() , factor, realData(), fftSize());179 VectorMath::multiplyByScalar(imagData() , factor, imagData(), fftSize());178 VectorMath::multiplyByScalar(realData().data(), factor, realData().data(), realData().size()); 179 VectorMath::multiplyByScalar(imagData().data(), factor, imagData().data(), realData().size()); 180 180 } 181 181 … … 185 185 const FFTFrame& frame2 = frame; 186 186 187 float*realP1 = frame1.realData();188 float*imagP1 = frame1.imagData();189 const float*realP2 = frame2.realData();190 const float*imagP2 = frame2.imagData();187 auto& realP1 = frame1.realData(); 188 auto& imagP1 = frame1.imagData(); 189 const auto& realP2 = frame2.realData(); 190 const auto& imagP2 = frame2.imagData(); 191 191 192 192 unsigned halfSize = m_FFTSize / 2; 193 194 RELEASE_ASSERT(realP1.size() >= halfSize); 195 RELEASE_ASSERT(imagP1.size() >= halfSize); 196 RELEASE_ASSERT(realP2.size() >= halfSize); 197 RELEASE_ASSERT(imagP2.size() >= halfSize); 198 193 199 float real0 = realP1[0]; 194 200 float imag0 = imagP1[0]; 195 201 196 202 // Complex multiply 197 VectorMath::multiplyComplex(realP1 , imagP1, realP2, imagP2, realP1, imagP1, halfSize);203 VectorMath::multiplyComplex(realP1.data(), imagP1.data(), realP2.data(), imagP2.data(), realP1.data(), imagP1.data(), halfSize); 198 204 199 205 // Multiply the packed DC/nyquist component … … 204 210 double FFTFrame::extractAverageGroupDelay() 205 211 { 206 float*realP = realData();207 float*imagP = imagData();212 auto& realP = realData(); 213 auto& imagP = imagData(); 208 214 209 215 double aveSum = 0.0; … … 255 261 int halfSize = fftSize() / 2; 256 262 257 float*realP = realData();258 float*imagP = imagData();263 auto& realP = realData(); 264 auto& imagP = imagData(); 259 265 260 266 const double kSamplePhaseDelay = (2.0 * piDouble) / double(fftSize()); … … 281 287 { 282 288 FFTFrame& frame = *this; 283 float*realP = frame.realData();284 float*imagP = frame.imagData();289 auto& realP = frame.realData(); 290 auto& imagP = frame.imagData(); 285 291 LOG(WebAudio, "**** \n"); 286 292 LOG(WebAudio, "DC = %f : nyquist = %f\n", realP[0], imagP[0]); -
trunk/Source/WebCore/platform/audio/FFTFrame.h
r268559 r268826 68 68 void scaleFFT(float factor); 69 69 70 float* realData() const; 71 float* imagData() const; 70 AudioFloatArray& realData() { return m_realData; } 71 AudioFloatArray& imagData() { return m_imagData; } 72 const AudioFloatArray& realData() const { return m_realData; } 73 const AudioFloatArray& imagData() const { return m_imagData; } 72 74 73 75 static int minFFTSize(); … … 104 106 105 107 DSPSplitComplex m_frame; 106 AudioFloatArray m_realData;107 AudioFloatArray m_imagData;108 108 #endif 109 109 … … 112 112 GstFFTF32* m_inverseFft; 113 113 UniqueArray<GstFFTF32Complex> m_complexData; 114 #endif // USE(WEBAUDIO_GSTREAMER) 115 114 116 AudioFloatArray m_realData; 115 117 AudioFloatArray m_imagData; 116 #endif // USE(WEBAUDIO_GSTREAMER)117 118 }; 118 119 -
trunk/Source/WebCore/platform/audio/FFTFrameStub.cpp
r268559 r268826 79 79 } 80 80 81 float* FFTFrame::realData() const82 {83 ASSERT_NOT_REACHED();84 return 0;85 }86 87 float* FFTFrame::imagData() const88 {89 ASSERT_NOT_REACHED();90 return 0;91 }92 93 81 } // namespace WebCore 94 82 -
trunk/Source/WebCore/platform/audio/gstreamer/FFTFrameGStreamer.cpp
r268559 r268826 80 80 81 81 // Copy/setup frame data. 82 memcpy(realData() , frame.realData(), sizeof(float) * unpackedFFTDataSize(m_FFTSize));83 memcpy(imagData() , frame.imagData(), sizeof(float) * unpackedFFTDataSize(m_FFTSize));82 memcpy(realData().data(), frame.realData().data(), sizeof(float) * realData().size()); 83 memcpy(imagData().data(), frame.imagData().data(), sizeof(float) * imagData().size()); 84 84 } 85 85 … … 129 129 } 130 130 131 float* FFTFrame::realData() const132 {133 return const_cast<float*>(m_realData.data());134 }135 136 float* FFTFrame::imagData() const137 {138 return const_cast<float*>(m_imagData.data());139 }140 141 131 int FFTFrame::minFFTSize() 142 132 { -
trunk/Source/WebCore/platform/audio/mac/FFTFrameMac.cpp
r268559 r268826 67 67 // Creates a blank/empty frame (interpolate() must later be called) 68 68 FFTFrame::FFTFrame() 69 : m_realData(0)70 , m_imagData(0)71 69 { 72 70 // Later will be set to correct values when interpolate() is called … … 91 89 92 90 // Copy/setup frame data 93 unsigned nbytes = sizeof(float) * m_FFTSize; 94 memcpy(realData(), frame.m_frame.realp, nbytes); 95 memcpy(imagData(), frame.m_frame.imagp, nbytes); 91 memcpy(realData().data(), frame.m_frame.realp, sizeof(float) * realData().size()); 92 memcpy(imagData().data(), frame.m_frame.imagp, sizeof(float) * imagData().size()); 96 93 } 97 94 … … 104 101 vDSP_fft_zrip(m_FFTSetup, &m_frame, 1, m_log2FFTSize, FFT_FORWARD); 105 102 103 RELEASE_ASSERT(realData().size() >= halfSize); 104 RELEASE_ASSERT(imagData().size() >= halfSize); 105 106 106 // To provide the best possible execution speeds, the vDSP library's functions don't always adhere strictly 107 107 // to textbook formulas for Fourier transforms, and must be scaled accordingly. … … 109 109 // In the case of a Real forward Transform like above: RFimp = RFmath * 2 so we need to divide the output 110 110 // by 2 to get the correct value. 111 VectorMath::multiplyByScalar(realData() , 0.5, realData(), halfSize);112 VectorMath::multiplyByScalar(imagData() , 0.5, imagData(), halfSize);111 VectorMath::multiplyByScalar(realData().data(), 0.5, realData().data(), halfSize); 112 VectorMath::multiplyByScalar(imagData().data(), 0.5, imagData().data(), halfSize); 113 113 } 114 114 … … 149 149 } 150 150 151 float* FFTFrame::realData() const152 {153 return m_frame.realp;154 }155 156 float* FFTFrame::imagData() const157 {158 return m_frame.imagp;159 }160 161 151 } // namespace WebCore 162 152
Note:
See TracChangeset
for help on using the changeset viewer.