15ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen/* 25ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * Copyright (C) 2010 Google Inc. All rights reserved. 35ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * 45ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * Redistribution and use in source and binary forms, with or without 55ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * modification, are permitted provided that the following conditions 65ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * are met: 75ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * 85ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * 1. Redistributions of source code must retain the above copyright 95ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * notice, this list of conditions and the following disclaimer. 105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * 2. Redistributions in binary form must reproduce the above copyright 115ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * notice, this list of conditions and the following disclaimer in the 125ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * documentation and/or other materials provided with the distribution. 135ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 145ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * its contributors may be used to endorse or promote products derived 155ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * from this software without specific prior written permission. 165ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * 175ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 185ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 195ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 205ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 215ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 225ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 235ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 245ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 265ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen */ 285ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 295ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "config.h" 305ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 315ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if ENABLE(WEB_AUDIO) 325ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 335ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "ReverbInputBuffer.h" 345ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 355ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsennamespace WebCore { 365ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 375ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenReverbInputBuffer::ReverbInputBuffer(size_t length) 385ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen : m_buffer(length) 395ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen , m_writeIndex(0) 405ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{ 415ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} 425ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 435ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid ReverbInputBuffer::write(float* sourceP, size_t numberOfFrames) 445ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{ 455ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen size_t bufferLength = m_buffer.size(); 465ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen bool isCopySafe = m_writeIndex + numberOfFrames <= bufferLength; 475ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen ASSERT(isCopySafe); 485ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (!isCopySafe) 495ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return; 505ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 515ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen memcpy(m_buffer.data() + m_writeIndex, sourceP, sizeof(float) * numberOfFrames); 525ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 535ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen m_writeIndex += numberOfFrames; 545ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen ASSERT(m_writeIndex <= bufferLength); 555ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 565ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (m_writeIndex >= bufferLength) 575ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen m_writeIndex = 0; 585ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} 595ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 605ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenfloat* ReverbInputBuffer::directReadFrom(int* readIndex, size_t numberOfFrames) 615ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{ 625ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen size_t bufferLength = m_buffer.size(); 635ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen bool isPointerGood = readIndex && *readIndex >= 0 && *readIndex + numberOfFrames <= bufferLength; 645ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen ASSERT(isPointerGood); 655ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (!isPointerGood) { 665ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // Should never happen in practice but return pointer to start of buffer (avoid crash) 675ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (readIndex) 685ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen *readIndex = 0; 695ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return m_buffer.data(); 705ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen } 715ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 725ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen float* sourceP = m_buffer.data(); 735ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen float* p = sourceP + *readIndex; 745ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 755ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // Update readIndex 765ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen *readIndex = (*readIndex + numberOfFrames) % bufferLength; 775ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 785ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return p; 795ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} 805ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 815ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid ReverbInputBuffer::reset() 825ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{ 835ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen m_buffer.zero(); 845ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen m_writeIndex = 0; 855ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} 865ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 875ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} // namespace WebCore 885ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 895ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif // ENABLE(WEB_AUDIO) 90