2013-06-11 00:08:38 +04:00
/*
* Copyright ( C ) 2010 Google Inc . All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions
* are met :
*
* 1. Redistributions of source code must retain the above copyright
* notice , this list of conditions and the following disclaimer .
* 2. Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in the
* documentation and / or other materials provided with the distribution .
* 3. Neither the name of Apple Computer , Inc . ( " Apple " ) nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission .
*
* THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS " AS IS " AND ANY
* EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED . IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES
* ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ;
* LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*/
# ifndef Reverb_h
# define Reverb_h
2013-06-11 00:09:01 +04:00
# include "ReverbConvolver.h"
# include "nsAutoPtr.h"
# include "nsTArray.h"
namespace mozilla {
class ThreadSharedFloatArrayBufferList ;
}
2013-06-11 00:08:38 +04:00
namespace WebCore {
// Multi-channel convolution reverb with channel matrixing - one or more ReverbConvolver objects are used internally.
class Reverb {
public :
enum { MaxFrameSize = 256 } ;
// renderSliceSize is a rendering hint, so the FFTs can be optimized to not all occur at the same time (very bad when rendering on a real-time thread).
2013-06-11 00:09:01 +04:00
Reverb ( mozilla : : ThreadSharedFloatArrayBufferList * impulseResponseBuffer , size_t impulseResponseBufferLength , size_t renderSliceSize , size_t maxFFTSize , size_t numberOfChannels , bool useBackgroundThreads , bool normalize , float sampleRate ) ;
2013-06-11 00:08:38 +04:00
2013-06-11 00:09:01 +04:00
void process ( const mozilla : : AudioChunk * sourceBus , mozilla : : AudioChunk * destinationBus , size_t framesToProcess ) ;
2013-06-11 00:08:38 +04:00
void reset ( ) ;
size_t impulseResponseLength ( ) const { return m_impulseResponseLength ; }
size_t latencyFrames ( ) const ;
private :
2013-07-26 05:35:22 +04:00
void initialize ( const nsTArray < const float * > & impulseResponseBuffer , size_t impulseResponseBufferLength , size_t renderSliceSize , size_t maxFFTSize , size_t numberOfChannels , bool useBackgroundThreads ) ;
2013-06-11 00:08:38 +04:00
size_t m_impulseResponseLength ;
2013-06-11 00:09:01 +04:00
nsTArray < nsAutoPtr < ReverbConvolver > > m_convolvers ;
2013-06-11 00:08:38 +04:00
// For "True" stereo processing
2013-06-11 00:09:01 +04:00
mozilla : : AudioChunk m_tempBuffer ;
2013-06-11 00:08:38 +04:00
} ;
} // namespace WebCore
# endif // Reverb_h