00001 00002 00011 #include "RingBuffer.h" 00012 00013 00014 using namespace jbxl; 00015 00016 00017 00018 00019 void CRingBuffer::init_data(void) 00020 { 00021 buf = NULL; 00022 bufsz = 0; 00023 datasz = 0; 00024 spoint = 0; 00025 epoint = 0; 00026 datano = 0; 00027 state = 0; 00028 enable = FALSE; 00029 } 00030 00031 00032 00033 BOOL CRingBuffer::init(int ring_size, int data_size) 00034 { 00035 init_data(); 00036 00037 buf = (void**)malloc(ring_size*sizeof(void*)); 00038 if (buf==NULL) return FALSE; 00039 memset(buf, 0, ring_size*sizeof(void*)); 00040 bufsz = ring_size; 00041 datasz = data_size; 00042 00043 BOOL ret = TRUE; 00044 for (int i=0; i<bufsz; i++) { 00045 buf[i] = (void*)malloc(datasz); 00046 if (buf[i]==NULL) { 00047 this->free(); 00048 ret = FALSE; 00049 state = -1; 00050 break; 00051 } 00052 memset(buf[i], 0, datasz); 00053 } 00054 00055 if (ret) enable = TRUE; 00056 00057 return ret; 00058 } 00059 00060 00061 00062 void CRingBuffer::free(void) 00063 { 00064 if (!isNull(buf)) { 00065 for (int i=0; i<bufsz; i++) { 00066 if (!isNull(buf[i])) { 00067 ::free(buf[i]); 00068 } 00069 } 00070 ::free(buf); 00071 } 00072 init_data(); 00073 00074 return; 00075 } 00076 00077 00078 00079 void CRingBuffer::clear(void) 00080 { 00081 for (int i=0; i<bufsz; i++) { 00082 memset(buf[i], 0, datasz); 00083 } 00084 spoint = 0; 00085 epoint = 0; 00086 datano = 0; 00087 state = 0; 00088 00089 return; 00090 } 00091 00092 00093 00094 void* CRingBuffer::get(void) 00095 { 00096 void* ptr = NULL; 00097 00098 if (datano>0) { 00099 ptr = buf[spoint]; 00100 spoint++; 00101 if (spoint==bufsz) spoint = 0; 00102 datano--; 00103 } 00104 00105 return ptr; 00106 } 00107 00108 00109 00110 void* CRingBuffer::get(int pos) 00111 { 00112 pos = epoint + pos; 00113 if (pos<0) pos = bufsz + pos % bufsz; 00114 else pos = pos % bufsz; 00115 00116 return buf[pos]; 00117 } 00118 00119 00120 00121 void CRingBuffer::put(void* ptr) 00122 { 00123 memcpy(buf[epoint], ptr, datasz); 00124 epoint++; 00125 if (epoint==bufsz) epoint = 0; 00126 if (datano<bufsz) datano++; 00127 00128 return; 00129 } 00130 00131 00132 00133 void CRingBuffer::put(void* ptr, int pos) 00134 { 00135 pos = epoint + pos; 00136 if (pos<0) pos = bufsz + pos % bufsz; 00137 else pos = pos % bufsz; 00138 00139 memcpy(buf[pos], ptr, datasz); 00140 00141 return; 00142 } 00143 00144 00145 00146