OpenShot Audio Library | OpenShotAudio  0.3.3
juce_AbstractFifo.h
1 /*
2  ==============================================================================
3 
4  This file is part of the JUCE library.
5  Copyright (c) 2017 - ROLI Ltd.
6 
7  JUCE is an open source library subject to commercial or open-source
8  licensing.
9 
10  The code included in this file is provided under the terms of the ISC license
11  http://www.isc.org/downloads/software-support-policy/isc-license. Permission
12  To use, copy, modify, and/or distribute this software for any purpose with or
13  without fee is hereby granted provided that the above copyright notice and
14  this permission notice appear in all copies.
15 
16  JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
17  EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
18  DISCLAIMED.
19 
20  ==============================================================================
21 */
22 
23 namespace juce
24 {
25 
26 //==============================================================================
78 class JUCE_API AbstractFifo
79 {
80 public:
81  //==============================================================================
83  AbstractFifo (int capacity) noexcept;
84 
86  ~AbstractFifo();
87 
88  //==============================================================================
90  int getTotalSize() const noexcept;
91 
93  int getFreeSpace() const noexcept;
94 
96  int getNumReady() const noexcept;
97 
99  void reset() noexcept;
100 
105  void setTotalSize (int newSize) noexcept;
106 
107  //==============================================================================
147  void prepareToWrite (int numToWrite, int& startIndex1, int& blockSize1, int& startIndex2, int& blockSize2) const noexcept;
148 
152  void finishedWrite (int numWritten) noexcept;
153 
192  void prepareToRead (int numWanted, int& startIndex1, int& blockSize1, int& startIndex2, int& blockSize2) const noexcept;
193 
197  void finishedRead (int numRead) noexcept;
198 
199  //==============================================================================
200 
201 private:
202  enum class ReadOrWrite
203  {
204  read,
205  write
206  };
207 
208 public:
210  template <ReadOrWrite mode>
211  class ScopedReadWrite final
212  {
213  public:
215  ScopedReadWrite() = default;
216 
222  ScopedReadWrite (AbstractFifo& f, int num) noexcept : fifo (&f)
223  {
224  prepare (*fifo, num);
225  }
226 
227  ScopedReadWrite (const ScopedReadWrite&) = delete;
228  ScopedReadWrite (ScopedReadWrite&&) noexcept;
229 
230  ScopedReadWrite& operator= (const ScopedReadWrite&) = delete;
231  ScopedReadWrite& operator= (ScopedReadWrite&&) noexcept;
232 
236  ~ScopedReadWrite() noexcept
237  {
238  if (fifo != nullptr)
239  finish (*fifo, blockSize1 + blockSize2);
240  }
241 
245  template <typename FunctionToApply>
246  void forEach (FunctionToApply&& func) const
247  {
248  for (auto i = startIndex1, e = startIndex1 + blockSize1; i != e; ++i) func (i);
249  for (auto i = startIndex2, e = startIndex2 + blockSize2; i != e; ++i) func (i);
250  }
251 
252  int startIndex1, blockSize1, startIndex2, blockSize2;
253 
254  private:
255  void prepare (AbstractFifo&, int) noexcept;
256  static void finish (AbstractFifo&, int) noexcept;
257  void swap (ScopedReadWrite&) noexcept;
258 
259  AbstractFifo* fifo = nullptr;
260  };
261 
262  using ScopedRead = ScopedReadWrite<ReadOrWrite::read>;
263  using ScopedWrite = ScopedReadWrite<ReadOrWrite::write>;
264 
285  ScopedRead read (int numToRead) noexcept;
286 
307  ScopedWrite write (int numToWrite) noexcept;
308 
309 private:
310  //==============================================================================
311  int bufferSize;
312  Atomic<int> validStart, validEnd;
313 
314  JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AbstractFifo)
315 };
316 
317 template<>
318 inline void AbstractFifo::ScopedReadWrite<AbstractFifo::ReadOrWrite::read>::finish (AbstractFifo& f, int num) noexcept
319 {
320  f.finishedRead (num);
321 }
322 
323 template<>
324 inline void AbstractFifo::ScopedReadWrite<AbstractFifo::ReadOrWrite::write>::finish (AbstractFifo& f, int num) noexcept
325 {
326  f.finishedWrite (num);
327 }
328 
329 template<>
330 inline void AbstractFifo::ScopedReadWrite<AbstractFifo::ReadOrWrite::read>::prepare (AbstractFifo& f, int num) noexcept
331 {
332  f.prepareToRead (num, startIndex1, blockSize1, startIndex2, blockSize2);
333 }
334 
335 template<>
336 inline void AbstractFifo::ScopedReadWrite<AbstractFifo::ReadOrWrite::write>::prepare (AbstractFifo& f, int num) noexcept
337 {
338  f.prepareToWrite (num, startIndex1, blockSize1, startIndex2, blockSize2);
339 }
340 
341 
342 } // namespace juce
ScopedReadWrite(AbstractFifo &f, int num) noexcept
void forEach(FunctionToApply &&func) const