RingBuffer.cpp
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:2k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. #include "RingBuffer.h"
  2. MediaRingBuffer::MediaRingBuffer()
  3. {
  4. this->ring = (char *) new char[RING_SIZE];
  5. this->read_pos  = 0;
  6. this->write_pos = 0;
  7. }
  8. MediaRingBuffer::~MediaRingBuffer()
  9. {
  10. free(this->ring);
  11. }
  12. void MediaRingBuffer::Init()
  13. {
  14. this->read_pos  = 0;
  15. this->write_pos = 0;
  16. }
  17. void MediaRingBuffer::Read(char *outData, unsigned int size)
  18. {
  19. if(write_pos <= read_pos) {
  20.     
  21.     if(read_pos + size < RING_SIZE) {
  22. memcpy(outData, ring + read_pos, size);
  23. read_pos += size;
  24. }
  25. else {
  26. if(read_pos + size < RING_SIZE + write_pos) {
  27. unsigned int before, after;
  28. before = (RING_SIZE - 1) - read_pos;
  29. after = size - before;
  30. memcpy(outData, ring + read_pos, before);
  31. memcpy(outData + before, ring, after);
  32. read_pos = after;
  33. }
  34. else {
  35. }
  36. }
  37. }
  38. else {
  39. if(read_pos + size <= write_pos) {
  40. memcpy(outData, ring + read_pos, size);
  41. read_pos += size;
  42. }
  43. else {
  44. }
  45. }
  46. void MediaRingBuffer::Write(char *inData, unsigned int size)
  47. {
  48. if(write_pos >= read_pos) {
  49.     
  50. if(write_pos + size < RING_SIZE) {
  51. memcpy(ring + write_pos, inData, size);
  52. write_pos += size;
  53. }
  54. else {
  55. if(write_pos + size < RING_SIZE + read_pos) {
  56. unsigned int before, after;
  57. before = (RING_SIZE - 1) - write_pos;
  58. after = size - before;
  59. memcpy(ring + write_pos, inData, before);
  60. memcpy(ring, inData + before, after);
  61. write_pos = after;
  62. }
  63. }
  64. }
  65. else {
  66.     
  67. if(write_pos + size <= read_pos) {
  68. memcpy(ring + write_pos, inData, size);
  69. write_pos += size;
  70. }
  71. }
  72. }
  73. int  MediaRingBuffer::IsFullFor(unsigned int size)
  74. {
  75. if(write_pos == read_pos)
  76. return 0;
  77. if(write_pos > read_pos) {
  78. if(write_pos + size < read_pos + RING_SIZE)
  79. return 0;
  80. return 1;
  81. }
  82. else {
  83. if(write_pos + size < read_pos)
  84. return 0;
  85. return 1;
  86. }
  87. }