Line data Source code
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 HRTFElevation_h
30 : #define HRTFElevation_h
31 :
32 : #include "HRTFKernel.h"
33 : #include "nsAutoRef.h"
34 : #include "mozilla/MemoryReporting.h"
35 :
36 : struct SpeexResamplerState_;
37 : typedef struct SpeexResamplerState_ SpeexResamplerState;
38 :
39 : namespace WebCore {
40 :
41 : // HRTFElevation contains all of the HRTFKernels (one left ear and one right ear per azimuth angle) for a particular elevation.
42 :
43 0 : class HRTFElevation {
44 : public:
45 : // Loads and returns an HRTFElevation with the given HRTF database subject name and elevation from browser (or WebKit.framework) resources.
46 : // Normally, there will only be a single HRTF database set, but this API supports the possibility of multiple ones with different names.
47 : // Interpolated azimuths will be generated based on InterpolationFactor.
48 : // Valid values for elevation are -45 -> +90 in 15 degree increments.
49 : static nsReturnRef<HRTFElevation> createBuiltin(int elevation, float sampleRate);
50 :
51 : // Given two HRTFElevations, and an interpolation factor x: 0 -> 1, returns an interpolated HRTFElevation.
52 : static nsReturnRef<HRTFElevation> createByInterpolatingSlices(HRTFElevation* hrtfElevation1, HRTFElevation* hrtfElevation2, float x, float sampleRate);
53 :
54 0 : double elevationAngle() const { return m_elevationAngle; }
55 : unsigned numberOfAzimuths() const { return NumberOfTotalAzimuths; }
56 : float sampleRate() const { return m_sampleRate; }
57 :
58 : // Returns the left and right kernels for the given azimuth index.
59 : // The interpolated delays based on azimuthBlend: 0 -> 1 are returned in frameDelayL and frameDelayR.
60 : void getKernelsFromAzimuth(double azimuthBlend, unsigned azimuthIndex, HRTFKernel* &kernelL, HRTFKernel* &kernelR, double& frameDelayL, double& frameDelayR);
61 :
62 : // Total number of azimuths after interpolation.
63 : static const unsigned NumberOfTotalAzimuths;
64 :
65 : static size_t fftSizeForSampleRate(float sampleRate);
66 :
67 : size_t sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
68 :
69 : private:
70 : HRTFElevation(const HRTFElevation& other) = delete;
71 : void operator=(const HRTFElevation& other) = delete;
72 :
73 0 : HRTFElevation(HRTFKernelList *kernelListL, int elevation, float sampleRate)
74 0 : : m_elevationAngle(elevation)
75 0 : , m_sampleRate(sampleRate)
76 : {
77 0 : m_kernelListL.SwapElements(*kernelListL);
78 0 : }
79 :
80 : // Returns the list of left ear HRTFKernels for all the azimuths going from 0 to 360 degrees.
81 0 : const HRTFKernelList& kernelListL() { return m_kernelListL; }
82 :
83 : // Given a specific azimuth and elevation angle, returns the left HRTFKernel.
84 : // Values for azimuth must be multiples of 15 in 0 -> 345,
85 : // but not all azimuths are available for elevations > +45.
86 : // Valid values for elevation are -45 -> +90 in 15 degree increments.
87 : static nsReturnRef<HRTFKernel> calculateKernelForAzimuthElevation(int azimuth, int elevation, SpeexResamplerState* resampler, float sampleRate);
88 :
89 : HRTFKernelList m_kernelListL;
90 : double m_elevationAngle;
91 : float m_sampleRate;
92 : };
93 :
94 : } // namespace WebCore
95 :
96 : template <>
97 0 : class nsAutoRefTraits<WebCore::HRTFElevation> :
98 : public nsPointerRefTraits<WebCore::HRTFElevation> {
99 : public:
100 0 : static void Release(WebCore::HRTFElevation* ptr) { delete(ptr); }
101 : };
102 :
103 : #endif // HRTFElevation_h
|