zoukankan      html  css  js  c++  java
  • JUCE_FIFO实现分析

    JUCE_FIFO代码简单剖析,此处的剖析就是给自己留一个方便查询的内容;不做太多内容的要求,只做简单的记录;本文以初学者的角度来些,大牛请飘过O(∩_∩)O

    FIFO的功能在博客的其他帖子里面已经有说明了,这里就简单通过图表说明下类里面的两个函数的实现机制,以及使用方法。下面写贴出代码和例子

     1 void AbstractFifo::prepareToWrite (int numToWrite, int& startIndex1,
     2  int& blockSize1, int& startIndex2, int& blockSize2) const noexcept
     3 {
     4  const int vs = validStart.get();
     5  const int ve = validEnd.value;
     6  const int freeSpace = ve >= vs ? (bufferSize - (ve - vs)) : (vs - ve);
     7  numToWrite = jmin (numToWrite, freeSpace - 1);
     8  if (numToWrite <= 0)
     9  {
    10  startIndex1 = 0;
    11  startIndex2 = 0;
    12  blockSize1 = 0;
    13  blockSize2 = 0;
    14  }
    15  else
    16  {
    17  startIndex1 = ve;
    18  startIndex2 = 0;
    19  blockSize1 = jmin (bufferSize - ve, numToWrite);
    20  numToWrite -= blockSize1;
    21  blockSize2 = numToWrite <= 0 ? 0 : jmin (numToWrite, vs);
    22  }
    23 }
    24  
    25 
    26 void AbstractFifo::prepareToRead (int numWanted, int& startIndex1, int& blockSize1, 
    27 int& startIndex2, int& blockSize2) const noexcept
    28 {
    29  const int vs = validStart.value;
    30  const int ve = validEnd.get();
    31  const int numReady = ve >= vs ? (ve - vs) : (bufferSize - (vs - ve));
    32  numWanted = jmin (numWanted, numReady);
    33  if (numWanted <= 0)
    34  {
    35  startIndex1 = 0;
    36  startIndex2 = 0;
    37  blockSize1 = 0;
    38  blockSize2 = 0;
    39  }
    40  else
    41  {
    42  startIndex1 = vs;
    43  startIndex2 = 0;
    44  blockSize1 = jmin (bufferSize - vs, numWanted);
    45  numWanted -= blockSize1;
    46  blockSize2 = numWanted <= 0 ? 0 : jmin (numWanted, ve);
    47  }
    48 }

    以上是程序具体实现,下面贴出代码例子;

     1 e.g.
     2  @code
     3  class MyFifo
     4  {
     5  public:
     6  MyFifo() : abstractFifo (1024)
     7  {
     8  }
     9  void addToFifo (const int* someData, int numItems)
    10  {
    11  int start1, size1, start2, size2;
    12  abstractFifo.prepareToWrite (numItems, start1, size1, start2, size2);
    13  if (size1 > 0)
    14  copySomeData (myBuffer + start1, someData, size1);
    15  if (size2 > 0)
    16  copySomeData (myBuffer + start2, someData + size1, size2);
    17  abstractFifo.finishedWrite (size1 + size2);
    18  }
    19  void readFromFifo (int* someData, int numItems)
    20  {
    21  int start1, size1, start2, size2;
    22  abstractFifo.prepareToRead (numSamples, start1, size1, start2, size2);
    23  if (size1 > 0)
    24  copySomeData (someData, myBuffer + start1, size1);
    25  if (size2 > 0)
    26  copySomeData (someData + size1, myBuffer + start2, size2);
    27  abstractFifo.finishedRead (size1 + size2);
    28  }
    29  private:
    30  AbstractFifo abstractFifo;
    31  int myBuffer [1024];
    32  };
    33  @endcode
    34 */

    其实在这我不想说的太多,主要是刚开始看代码和我自己的想法不太一致,后来详细看了下其实也很简单,就是一个循环队列的实现;使用开始和技术指针确定写入、读取位置提供给外部使用,外部程序无需再自己处理写入、读取位置的判断。就一下两种可能性,一个是开始位置在前结束位置在后,一个是开始位置在后结束位置在前;

  • 相关阅读:
    Java学习之集合(HashSet)
    Java学习之集合(LinkedList链表集合)
    Java学习之集合(List接口)
    Java学习之集合(Collection接口)
    【Spring Session】和 Redis 结合实现 Session 共享
    【NodeJS】nvm
    【Html JS】使用问题记录
    【VUE】使用问题记录
    【RabbitMQ】显示耗时处理进度
    【CentOS7】开发环境配置
  • 原文地址:https://www.cnblogs.com/davygeek/p/4211587.html
Copyright © 2011-2022 走看看