cb.cpp
上传用户:lqyjxl
上传日期:2015-08-21
资源大小:14k
文件大小:2k
源码类别:

Audio

开发平台:

Visual C++

  1. // file: cb.cc
  2. //
  3. // this file contains an implementation of the circular buffer class.
  4. // for convenience, we have grouped all methods into a single file.
  5. //
  6. //
  7. //-----------------------------------------------------------------------------
  8. // system include files
  9. //
  10. #include <stdlib.h>
  11. #include <memory.h>
  12. // isip include files
  13. //
  14. #include "cb.h"
  15. //-----------------------------------------------------------------------------
  16. //
  17. // class: Circular_buffer
  18. //
  19. // description: a circular buffer class implemented as a linear array
  20. //              with logic that checks for wrap-around of pointers
  21. //
  22. //-----------------------------------------------------------------------------
  23. // constructors/destructors
  24. //-----------------------------------------------------------------------------
  25. Circular_buffer::Circular_buffer() {
  26.   idx_d = -1;
  27.   size_d = 0;
  28.   buf_d = (double*)NULL;
  29. }
  30. Circular_buffer::~Circular_buffer() {
  31.   idx_d = -1;
  32.   size_d = 0;
  33.   delete [] buf_d;
  34. }
  35. //-----------------------------------------------------------------------------
  36. // allocation
  37. //-----------------------------------------------------------------------------
  38. void Circular_buffer::allocate_cc(int num_elements) {
  39.   // check if a buffer already exists
  40.   //
  41.   if (buf_d != (double*)NULL)
  42.     {delete [] buf_d;}
  43.   // allocate a buffer
  44.   //
  45.   idx_d = 0;
  46.   size_d = num_elements;
  47.   buf_d = new double[size_d];
  48.   // clear memory
  49.   //
  50.   memset(buf_d, (int)0, size_d*sizeof(double));
  51.   // exit gracefully
  52.   //
  53. }
  54. //-----------------------------------------------------------------------------
  55. // indexing methods
  56. //-----------------------------------------------------------------------------
  57. int Circular_buffer::add_cc(double new_value) {
  58.   // increment the pointer
  59.   //
  60.   idx_d++;
  61.   if (idx_d >= size_d)
  62.     {idx_d -= size_d;}
  63.   else if (idx_d < (int)0)
  64.     {idx_d += size_d;}
  65.     
  66.   // assign the value
  67.   //
  68.   buf_d[idx_d] = new_value;
  69.   // return the new pointer
  70.   //
  71.   return idx_d;
  72. }
  73. //-----------------------------------------------------------------------------
  74. // overloaded operators
  75. //-----------------------------------------------------------------------------
  76. double Circular_buffer::operator() (int index) {
  77.   // note that the index is actually an offset from idx_d
  78.   //
  79.   int idx = idx_d + index;
  80.   // check the index
  81.   //
  82.   if (idx > size_d)
  83.     {idx -= size_d;}
  84.   else if (idx < (int)0)
  85.     {idx += size_d;}
  86.   // return the corresponding value
  87.   //
  88.   return buf_d[idx];
  89. }