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 #include "ReverbInputBuffer.h"
30 #include "mozilla/PodOperations.h"
31 
32 using namespace mozilla;
33 
34 namespace WebCore {
35 
ReverbInputBuffer(size_t length)36 ReverbInputBuffer::ReverbInputBuffer(size_t length) : m_writeIndex(0) {
37   m_buffer.SetLength(length);
38   PodZero(m_buffer.Elements(), length);
39 }
40 
write(const float * sourceP,size_t numberOfFrames)41 void ReverbInputBuffer::write(const float* sourceP, size_t numberOfFrames) {
42   // m_writeIndex is atomic and checked by other threads, so only touch
43   // it at the start and end.
44   size_t bufferLength = m_buffer.Length();
45   size_t index = m_writeIndex;
46   size_t newIndex = index + numberOfFrames;
47 
48   MOZ_RELEASE_ASSERT(newIndex <= bufferLength);
49 
50   memcpy(m_buffer.Elements() + index, sourceP, sizeof(float) * numberOfFrames);
51 
52   if (newIndex >= bufferLength) {
53     newIndex = 0;
54   }
55   m_writeIndex = newIndex;
56 }
57 
directReadFrom(int * readIndex,size_t numberOfFrames)58 float* ReverbInputBuffer::directReadFrom(int* readIndex,
59                                          size_t numberOfFrames) {
60   size_t bufferLength = m_buffer.Length();
61   bool isPointerGood = readIndex && *readIndex >= 0 &&
62                        *readIndex + numberOfFrames <= bufferLength;
63   MOZ_ASSERT(isPointerGood);
64   if (!isPointerGood) {
65     // Should never happen in practice but return pointer to start of buffer
66     // (avoid crash)
67     if (readIndex) *readIndex = 0;
68     return m_buffer.Elements();
69   }
70 
71   float* sourceP = m_buffer.Elements();
72   float* p = sourceP + *readIndex;
73 
74   // Update readIndex
75   *readIndex = (*readIndex + numberOfFrames) % bufferLength;
76 
77   return p;
78 }
79 
reset()80 void ReverbInputBuffer::reset() {
81   PodZero(m_buffer.Elements(), m_buffer.Length());
82   m_writeIndex = 0;
83 }
84 
85 }  // namespace WebCore
86