HRTFKernel.h (5221B)
1 /* 2 * Copyright (C) 2010 Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 14 * its contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #ifndef HRTFKernel_h 30 #define HRTFKernel_h 31 32 #include "mozilla/FFTBlock.h" 33 #include "mozilla/MemoryReporting.h" 34 #include "mozilla/UniquePtr.h" 35 #include "nsAutoRef.h" 36 #include "nsTArray.h" 37 38 namespace WebCore { 39 40 using mozilla::FFTBlock; 41 using mozilla::UniquePtr; 42 43 // HRTF stands for Head-Related Transfer Function. 44 // HRTFKernel is a frequency-domain representation of an impulse-response used 45 // as part of the spatialized panning system. For a given azimuth / elevation 46 // angle there will be one HRTFKernel for the left ear transfer function, and 47 // one for the right ear. The leading delay (average group delay) for each 48 // impulse response is extracted: 49 // m_fftFrame is the frequency-domain representation of the impulse 50 // response with the delay removed 51 // m_frameDelay is the leading delay of the original impulse response. 52 class HRTFKernel { 53 public: 54 // Note: this is destructive on the passed in |impulseResponse|. 55 // The |length| of |impulseResponse| must be a power of two. 56 // The size of the DFT will be |2 * length|. 57 static nsReturnRef<HRTFKernel> create(float* impulseResponse, size_t length, 58 float sampleRate); 59 60 static nsReturnRef<HRTFKernel> create(UniquePtr<FFTBlock> fftFrame, 61 float frameDelay, float sampleRate); 62 63 // Given two HRTFKernels, and an interpolation factor x: 0 -> 1, returns an 64 // interpolated HRTFKernel. 65 static nsReturnRef<HRTFKernel> createInterpolatedKernel(HRTFKernel* kernel1, 66 HRTFKernel* kernel2, 67 float x); 68 69 FFTBlock* fftFrame() { return m_fftFrame.get(); } 70 71 size_t fftSize() const { return m_fftFrame->FFTSize(); } 72 float frameDelay() const { return m_frameDelay; } 73 74 float sampleRate() const { return m_sampleRate; } 75 double nyquist() const { return 0.5 * sampleRate(); } 76 77 size_t sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const { 78 size_t amount = aMallocSizeOf(this); 79 amount += m_fftFrame->SizeOfIncludingThis(aMallocSizeOf); 80 return amount; 81 } 82 83 private: 84 HRTFKernel(const HRTFKernel& other) = delete; 85 void operator=(const HRTFKernel& other) = delete; 86 87 // Note: this is destructive on the passed in |impulseResponse|. 88 HRTFKernel(float* impulseResponse, size_t fftSize, float sampleRate); 89 90 HRTFKernel(UniquePtr<FFTBlock> fftFrame, float frameDelay, float sampleRate) 91 : m_fftFrame(std::move(fftFrame)), 92 m_frameDelay(frameDelay), 93 m_sampleRate(sampleRate) {} 94 95 UniquePtr<FFTBlock> m_fftFrame; 96 float m_frameDelay; 97 float m_sampleRate; 98 }; 99 100 typedef nsTArray<nsAutoRef<HRTFKernel> > HRTFKernelList; 101 102 } // namespace WebCore 103 104 template <> 105 class nsAutoRefTraits<WebCore::HRTFKernel> 106 : public nsPointerRefTraits<WebCore::HRTFKernel> { 107 public: 108 static void Release(WebCore::HRTFKernel* ptr) { delete (ptr); } 109 }; 110 111 namespace WebCore { 112 113 inline nsReturnRef<HRTFKernel> HRTFKernel::create(float* impulseResponse, 114 size_t length, 115 float sampleRate) { 116 return nsReturnRef<HRTFKernel>( 117 new HRTFKernel(impulseResponse, length, sampleRate)); 118 } 119 120 inline nsReturnRef<HRTFKernel> HRTFKernel::create(UniquePtr<FFTBlock> fftFrame, 121 float frameDelay, 122 float sampleRate) { 123 return nsReturnRef<HRTFKernel>( 124 new HRTFKernel(std::move(fftFrame), frameDelay, sampleRate)); 125 } 126 127 } // namespace WebCore 128 129 #endif // HRTFKernel_h