content/media/webaudio/blink/ReverbAccumulationBuffer.cpp

Fri, 16 Jan 2015 04:50:19 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Fri, 16 Jan 2015 04:50:19 +0100
branch
TOR_BUG_9701
changeset 13
44a2da4a2ab2
permissions
-rw-r--r--

Replace accessor implementation with direct member state manipulation, by
request https://trac.torproject.org/projects/tor/ticket/9701#comment:32

     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 "ReverbAccumulationBuffer.h"
    30 #include "AudioNodeEngine.h"
    31 #include "mozilla/PodOperations.h"
    32 #include <algorithm>
    34 using namespace mozilla;
    36 namespace WebCore {
    38 ReverbAccumulationBuffer::ReverbAccumulationBuffer(size_t length)
    39     : m_readIndex(0)
    40     , m_readTimeFrame(0)
    41 {
    42   m_buffer.SetLength(length);
    43   PodZero(m_buffer.Elements(), length);
    44 }
    46 void ReverbAccumulationBuffer::readAndClear(float* destination, size_t numberOfFrames)
    47 {
    48     size_t bufferLength = m_buffer.Length();
    49     bool isCopySafe = m_readIndex <= bufferLength && numberOfFrames <= bufferLength;
    51     MOZ_ASSERT(isCopySafe);
    52     if (!isCopySafe)
    53         return;
    55     size_t framesAvailable = bufferLength - m_readIndex;
    56     size_t numberOfFrames1 = std::min(numberOfFrames, framesAvailable);
    57     size_t numberOfFrames2 = numberOfFrames - numberOfFrames1;
    59     float* source = m_buffer.Elements();
    60     memcpy(destination, source + m_readIndex, sizeof(float) * numberOfFrames1);
    61     memset(source + m_readIndex, 0, sizeof(float) * numberOfFrames1);
    63     // Handle wrap-around if necessary
    64     if (numberOfFrames2 > 0) {
    65         memcpy(destination + numberOfFrames1, source, sizeof(float) * numberOfFrames2);
    66         memset(source, 0, sizeof(float) * numberOfFrames2);
    67     }
    69     m_readIndex = (m_readIndex + numberOfFrames) % bufferLength;
    70     m_readTimeFrame += numberOfFrames;
    71 }
    73 void ReverbAccumulationBuffer::updateReadIndex(int* readIndex, size_t numberOfFrames) const
    74 {
    75     // Update caller's readIndex
    76     *readIndex = (*readIndex + numberOfFrames) % m_buffer.Length();
    77 }
    79 int ReverbAccumulationBuffer::accumulate(float* source, size_t numberOfFrames, int* readIndex, size_t delayFrames)
    80 {
    81     size_t bufferLength = m_buffer.Length();
    83     size_t writeIndex = (*readIndex + delayFrames) % bufferLength;
    85     // Update caller's readIndex
    86     *readIndex = (*readIndex + numberOfFrames) % bufferLength;
    88     size_t framesAvailable = bufferLength - writeIndex;
    89     size_t numberOfFrames1 = std::min(numberOfFrames, framesAvailable);
    90     size_t numberOfFrames2 = numberOfFrames - numberOfFrames1;
    92     float* destination = m_buffer.Elements();
    94     bool isSafe = writeIndex <= bufferLength && numberOfFrames1 + writeIndex <= bufferLength && numberOfFrames2 <= bufferLength;
    95     MOZ_ASSERT(isSafe);
    96     if (!isSafe)
    97         return 0;
    99     AudioBufferAddWithScale(source, 1.0f, destination + writeIndex, numberOfFrames1);
   101     // Handle wrap-around if necessary
   102     if (numberOfFrames2 > 0) {
   103         AudioBufferAddWithScale(source + numberOfFrames1, 1.0f, destination, numberOfFrames2);
   104     }
   106     return writeIndex;
   107 }
   109 void ReverbAccumulationBuffer::reset()
   110 {
   111     PodZero(m_buffer.Elements(), m_buffer.Length());
   112     m_readIndex = 0;
   113     m_readTimeFrame = 0;
   114 }
   116 } // namespace WebCore

mercurial