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 #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_AUDIO_REVERB_H_ 30 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_AUDIO_REVERB_H_ 31 32 #include <memory> 33 34 #include "base/macros.h" 35 #include "third_party/blink/renderer/platform/audio/reverb_convolver.h" 36 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" 37 #include "third_party/blink/renderer/platform/wtf/vector.h" 38 39 namespace blink { 40 41 class AudioBus; 42 43 // Multi-channel convolution reverb with channel matrixing - one or more 44 // ReverbConvolver objects are used internally. 45 46 class PLATFORM_EXPORT Reverb { 47 USING_FAST_MALLOC(Reverb); 48 49 public: 50 enum { kMaxFrameSize = 256 }; 51 52 // renderSliceSize is a rendering hint, so the FFTs can be optimized to not 53 // all occur at the same time (very bad when rendering on a real-time thread). 54 Reverb(AudioBus* impulse_response_buffer, 55 size_t render_slice_size, 56 size_t max_fft_size, 57 bool use_background_threads, 58 bool normalize); 59 60 void Process(const AudioBus* source_bus, 61 AudioBus* destination_bus, 62 uint32_t frames_to_process); 63 void Reset(); 64 ImpulseResponseLength()65 size_t ImpulseResponseLength() const { return impulse_response_length_; } 66 size_t LatencyFrames() const; 67 68 private: 69 void Initialize(AudioBus* impulse_response_buffer, 70 size_t render_slice_size, 71 size_t max_fft_size, 72 bool use_background_threads, 73 float scale); 74 75 size_t impulse_response_length_; 76 // The actual number of channels in the response. This can be less 77 // than the number of ReverbConvolver's in |m_convolvers|. 78 unsigned number_of_response_channels_; 79 80 Vector<std::unique_ptr<ReverbConvolver>> convolvers_; 81 82 // For "True" stereo processing 83 scoped_refptr<AudioBus> temp_buffer_; 84 85 DISALLOW_COPY_AND_ASSIGN(Reverb); 86 }; 87 88 } // namespace blink 89 90 #endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_AUDIO_REVERB_H_ 91