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