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_INPUT_BUFFER_H_ 30 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_AUDIO_REVERB_INPUT_BUFFER_H_ 31 32 #include <atomic> 33 #include "base/macros.h" 34 #include "third_party/blink/renderer/platform/audio/audio_array.h" 35 #include "third_party/blink/renderer/platform/platform_export.h" 36 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" 37 38 namespace blink { 39 40 // ReverbInputBuffer is used to buffer input samples for deferred processing by 41 // the background threads. 42 class PLATFORM_EXPORT ReverbInputBuffer { 43 DISALLOW_NEW(); 44 45 public: 46 ReverbInputBuffer(size_t length); 47 48 // The realtime audio thread keeps writing samples here. 49 // The assumption is that the buffer's length is evenly divisible by 50 // numberOfFrames (for nearly all cases this will be fine). 51 // FIXME: remove numberOfFrames restriction... 52 void Write(const float* source_p, size_t number_of_frames); 53 54 // Background threads can call this to check if there's anything to read... WriteIndex()55 size_t WriteIndex() const { 56 return write_index_.load(std::memory_order_acquire); 57 } 58 59 // The individual background threads read here (and hope that they can keep up 60 // with the buffer writing). 61 // readIndex is updated with the next readIndex to read from... 62 // The assumption is that the buffer's length is evenly divisible by 63 // numberOfFrames. 64 // FIXME: remove numberOfFrames restriction... 65 float* DirectReadFrom(int* read_index, size_t number_of_frames); 66 67 void Reset(); 68 69 private: SetWriteIndex(size_t new_index)70 void SetWriteIndex(size_t new_index) { 71 write_index_.store(new_index, std::memory_order_release); 72 } 73 74 AudioFloatArray buffer_; 75 76 // |write_index_| can be accessed from several threads. Only use 77 // the getter and setter to access it atomically. Don't access 78 // directly! 79 std::atomic_size_t write_index_; 80 81 DISALLOW_COPY_AND_ASSIGN(ReverbInputBuffer); 82 }; 83 84 } // namespace blink 85 86 #endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_AUDIO_REVERB_INPUT_BUFFER_H_ 87