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

多媒体编程

开发平台:

Visual C++

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