1bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen/* 2bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * Copyright (C) 2010 Google Inc. All rights reserved. 3bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * 4bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * Redistribution and use in source and binary forms, with or without 5bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * modification, are permitted provided that the following conditions 6bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * are met: 7bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * 8bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * 1. Redistributions of source code must retain the above copyright 9bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * notice, this list of conditions and the following disclaimer. 10bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * 2. Redistributions in binary form must reproduce the above copyright 11bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * notice, this list of conditions and the following disclaimer in the 12bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * documentation and/or other materials provided with the distribution. 13bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 14bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * its contributors may be used to endorse or promote products derived 15bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * from this software without specific prior written permission. 16bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * 17bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 18bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 19bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 21bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 24bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen */ 28bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 29bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#ifndef HRTFKernel_h 30bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#define HRTFKernel_h 31bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 32bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "FFTFrame.h" 33bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include <wtf/OwnPtr.h> 34bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include <wtf/PassOwnPtr.h> 35bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include <wtf/PassRefPtr.h> 36bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include <wtf/RefCounted.h> 37bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include <wtf/RefPtr.h> 38bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include <wtf/Vector.h> 39bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 40bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsennamespace WebCore { 41bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 42bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenclass AudioChannel; 43bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 44bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen// HRTF stands for Head-Related Transfer Function. 45bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen// HRTFKernel is a frequency-domain representation of an impulse-response used as part of the spatialized panning system. 46bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen// For a given azimuth / elevation angle there will be one HRTFKernel for the left ear transfer function, and one for the right ear. 47bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen// The leading delay (average group delay) for each impulse response is extracted: 48bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen// m_fftFrame is the frequency-domain representation of the impulse response with the delay removed 49bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen// m_frameDelay is the leading delay of the original impulse response. 50bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenclass HRTFKernel : public RefCounted<HRTFKernel> { 51bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenpublic: 52bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen // Note: this is destructive on the passed in AudioChannel. 53bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen // The length of channel must be a power of two. 54bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen static PassRefPtr<HRTFKernel> create(AudioChannel* channel, size_t fftSize, double sampleRate, bool bassBoost) 55bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen { 56bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return adoptRef(new HRTFKernel(channel, fftSize, sampleRate, bassBoost)); 57bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen } 58bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 59bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen static PassRefPtr<HRTFKernel> create(PassOwnPtr<FFTFrame> fftFrame, double frameDelay, double sampleRate) 60bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen { 61bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return adoptRef(new HRTFKernel(fftFrame, frameDelay, sampleRate)); 62bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen } 63bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 64bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen // Given two HRTFKernels, and an interpolation factor x: 0 -> 1, returns an interpolated HRTFKernel. 65bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen static PassRefPtr<HRTFKernel> createInterpolatedKernel(HRTFKernel* kernel1, HRTFKernel* kernel2, double x); 66bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 67bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen FFTFrame* fftFrame() { return m_fftFrame.get(); } 68bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 69bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen size_t fftSize() const { return m_fftFrame->fftSize(); } 70bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen double frameDelay() const { return m_frameDelay; } 71bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 72bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen double sampleRate() const { return m_sampleRate; } 73bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen double nyquist() const { return 0.5 * sampleRate(); } 74bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 75bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen // Converts back into impulse-response form. 76bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen PassOwnPtr<AudioChannel> createImpulseResponse(); 77bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 78bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenprivate: 79bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen // Note: this is destructive on the passed in AudioChannel. 80bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen HRTFKernel(AudioChannel* channel, size_t fftSize, double sampleRate, bool bassBoost); 81bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 82bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen HRTFKernel(PassOwnPtr<FFTFrame> fftFrame, double frameDelay, double sampleRate) 83bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen : m_fftFrame(fftFrame) 84bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen , m_frameDelay(frameDelay) 85bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen , m_sampleRate(sampleRate) 86bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen { 87bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen } 88bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 89bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen OwnPtr<FFTFrame> m_fftFrame; 90bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen double m_frameDelay; 91bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen double m_sampleRate; 92bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}; 93bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 94bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsentypedef Vector<RefPtr<HRTFKernel> > HRTFKernelList; 95bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 96bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen} // namespace WebCore 97bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 98bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#endif // HRTFKernel_h 99