content/media/webaudio/blink/HRTFKernel.cpp

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     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  */
    29 #include "HRTFKernel.h"
    30 namespace WebCore {
    32 // Takes the input audio channel |impulseP| as an input impulse response and calculates the average group delay.
    33 // This represents the initial delay before the most energetic part of the impulse response.
    34 // The sample-frame delay is removed from the |impulseP| impulse response, and this value  is returned.
    35 // The |length| of the passed in |impulseP| must be must be a power of 2.
    36 static float extractAverageGroupDelay(float* impulseP, size_t length)
    37 {
    38     // Check for power-of-2.
    39     MOZ_ASSERT(length && (length & (length - 1)) == 0);
    41     FFTBlock estimationFrame(length);
    42     estimationFrame.PerformFFT(impulseP);
    44     float frameDelay = static_cast<float>(estimationFrame.ExtractAverageGroupDelay());
    45     estimationFrame.GetInverse(impulseP);
    47     return frameDelay;
    48 }
    50 HRTFKernel::HRTFKernel(float* impulseResponse, size_t length, float sampleRate)
    51     : m_frameDelay(0)
    52     , m_sampleRate(sampleRate)
    53 {
    54     // Determine the leading delay (average group delay) for the response.
    55     m_frameDelay = extractAverageGroupDelay(impulseResponse, length);
    57     // The FFT size (with zero padding) needs to be twice the response length
    58     // in order to do proper convolution.
    59     unsigned fftSize = 2 * length;
    61     // Quick fade-out (apply window) at truncation point
    62     // because the impulse response has been truncated.
    63     unsigned numberOfFadeOutFrames = static_cast<unsigned>(sampleRate / 4410); // 10 sample-frames @44.1KHz sample-rate
    64     MOZ_ASSERT(numberOfFadeOutFrames < length);
    65     if (numberOfFadeOutFrames < length) {
    66         for (unsigned i = length - numberOfFadeOutFrames; i < length; ++i) {
    67             float x = 1.0f - static_cast<float>(i - (length - numberOfFadeOutFrames)) / numberOfFadeOutFrames;
    68             impulseResponse[i] *= x;
    69         }
    70     }
    72     m_fftFrame = new FFTBlock(fftSize);
    73     m_fftFrame->PadAndMakeScaledDFT(impulseResponse, length);
    74 }
    76 // Interpolates two kernels with x: 0 -> 1 and returns the result.
    77 nsReturnRef<HRTFKernel> HRTFKernel::createInterpolatedKernel(HRTFKernel* kernel1, HRTFKernel* kernel2, float x)
    78 {
    79     MOZ_ASSERT(kernel1 && kernel2);
    80     if (!kernel1 || !kernel2)
    81         return nsReturnRef<HRTFKernel>();
    83     MOZ_ASSERT(x >= 0.0 && x < 1.0);
    84     x = mozilla::clamped(x, 0.0f, 1.0f);
    86     float sampleRate1 = kernel1->sampleRate();
    87     float sampleRate2 = kernel2->sampleRate();
    88     MOZ_ASSERT(sampleRate1 == sampleRate2);
    89     if (sampleRate1 != sampleRate2)
    90         return nsReturnRef<HRTFKernel>();
    92     float frameDelay = (1 - x) * kernel1->frameDelay() + x * kernel2->frameDelay();
    94     nsAutoPtr<FFTBlock> interpolatedFrame(
    95         FFTBlock::CreateInterpolatedBlock(*kernel1->fftFrame(), *kernel2->fftFrame(), x));
    96     return HRTFKernel::create(interpolatedFrame, frameDelay, sampleRate1);
    97 }
    99 } // namespace WebCore

mercurial