2 #ifdef OIS_LIRC_SUPPORT 57 #ifndef OIS_LIRCRingBuffer_H 58 #define OIS_LIRCRingBuffer_H 87 volatile int writeIndex;
90 volatile int readIndex;
93 LIRCRingBuffer(
unsigned int numEntries)
95 numEntries = RoundUpToNextPowerOf2(numEntries);
98 bufferSize = (int)numEntries;
99 buffer =
new LIRCEvent[numEntries];
103 bigMask = (int)(numEntries * 2) - 1;
104 smallMask = (int)(numEntries)-1;
112 unsigned int RoundUpToNextPowerOf2(
unsigned int n)
115 if(((n - 1) & n) == 0)
123 return (
unsigned int)(1 << numBits);
126 int GetReadAvailable()
128 return ((writeIndex - readIndex) & bigMask);
131 int GetWriteAvailable()
133 return (bufferSize - GetReadAvailable());
136 int Write(LIRCEvent* data,
int numEntries)
138 int size1 = 0, size2 = 0, numWritten;
139 int data1Ptr = 0, data2Ptr = 0;
141 numWritten = GetWriteRegions(numEntries, data1Ptr, size1, data2Ptr, size2);
146 memcpy(&buffer[data1Ptr], data,
sizeof(LIRCEvent) * size1);
148 memcpy(&buffer[data2Ptr], &data[size1],
sizeof(LIRCEvent) * size2);
153 memcpy(&buffer[data1Ptr], data,
sizeof(LIRCEvent) * size1);
156 AdvanceWriteIndex(numWritten);
164 int Read(LIRCEvent* data,
int numEntries)
166 int size1 = 0, size2 = 0, numRead, data1Ptr = 0, data2Ptr = 0;
168 numRead = GetReadRegions(numEntries, data1Ptr, size1, data2Ptr, size2);
172 memcpy(data, &buffer[data1Ptr],
sizeof(LIRCEvent) * size1);
174 memcpy(&data[size1], &buffer[data2Ptr],
sizeof(LIRCEvent) * size2);
178 memcpy(data, &buffer[data1Ptr],
sizeof(LIRCEvent) * size1);
181 AdvanceReadIndex(numRead);
186 int GetWriteRegions(
int numEntries,
int& dataPtr1,
int& sizePtr1,
int& dataPtr2,
int& sizePtr2)
189 int available = GetWriteAvailable();
190 if(numEntries > available)
191 numEntries = available;
194 index = writeIndex & smallMask;
195 if((index + numEntries) > bufferSize)
198 int firstHalf = bufferSize - index;
200 sizePtr1 = firstHalf;
202 sizePtr2 = numEntries - firstHalf;
207 sizePtr1 = numEntries;
214 int GetReadRegions(
int numEntries,
int& dataPtr1,
int& sizePtr1,
int& dataPtr2,
int& sizePtr2)
217 int available = GetReadAvailable();
218 if(numEntries > available)
219 numEntries = available;
222 index = readIndex & smallMask;
223 if((index + numEntries) > bufferSize)
226 int firstHalf = bufferSize - index;
228 sizePtr1 = firstHalf;
230 sizePtr2 = numEntries - firstHalf;
235 sizePtr1 = numEntries;
242 int AdvanceWriteIndex(
int numEntries)
244 return writeIndex = (writeIndex + numEntries) & bigMask;
247 int AdvanceReadIndex(
int numEntries)
249 return readIndex = (readIndex + numEntries) & bigMask;
254 writeIndex = readIndex = 0;
258 #endif //#define OIS_LIRCRingBuffer_H
Definition: OISEffect.h:28