BDS Public
Beamlib 3.3.4
This is the Beam C++ class library.
Loading...
Searching...
No Matches
BFifo.inc
Go to the documentation of this file.
1/*******************************************************************************
2 * BFifo.inc BFifo class
3 * T.Barnaby, Beam Ltd, 2013-05-03
4 * Copyright (c) 2012 All Right Reserved, Beam Ltd, http://www.beam.ltd.uk
5 *******************************************************************************
6 *
7 * Implementation
8 */
9#include <BFifo.h>
10#include <stdlib.h>
11#include <string.h>
12
13// The BFifo functions
14template <class Type> BFifo<Type>::BFifo(BUInt size){
15 osize = size;
16 odata = new Type [osize];
17 owritePos = 0;
18 oreadPos = 0;
19}
20
21template <class Type> BFifo<Type>::~BFifo(){
22 delete [] odata;
23 odata = 0;
24 osize = 0;
25 owritePos = 0;
26 oreadPos = 0;
27}
28
29template <class Type> void BFifo<Type>::clear(){
30 owritePos = 0;
31 oreadPos = 0;
32}
33
34template <class Type> BUInt BFifo<Type>::size(){
35 return osize;
36}
37
38template <class Type> BError BFifo<Type>::resize(BUInt size){
39 BError err;
40
41 delete [] odata;
42 osize = size;
43 odata = new Type [osize];
44 owritePos = 0;
45 oreadPos = 0;
46
47 return err;
48}
49
50template <class Type> BError BFifo<Type>::rebase(){
51 BError err;
52
53 if(oreadPos > owritePos){
54 err.set(1, "BFifo is wrapped");
55 }
56 else if(oreadPos){
57 //printf("Reabase: move: %d %d\n", oreadPos, owritePos - oreadPos);
58 if(owritePos - oreadPos)
59 memmove(odata, &odata[oreadPos], sizeof(Type) * (owritePos - oreadPos));
60 owritePos -= oreadPos;
61 oreadPos = 0;
62 }
63 return err;
64}
65
66
67
68template <class Type> BUInt BFifo<Type>::writeAvailable(){
69 BUInt readPos = oreadPos;
70
71 if(readPos <= owritePos)
72 return osize - owritePos + readPos - 1;
73 else
74 return (readPos - owritePos - 1);
75}
76
77template <class Type> BUInt BFifo<Type>::writeAvailableChunk(){
78 BUInt readPos = oreadPos;
79
80 if(readPos == 0)
81 return osize - owritePos - 1;
82 else if(readPos <= owritePos)
83 return osize - owritePos;
84 else
85 return (readPos - owritePos - 1);
86}
87
88template <class Type> BError BFifo<Type>::write(const Type v){
89 BError err;
90
91 odata[owritePos] = v;
92 if(owritePos < (osize-1))
93 owritePos++;
94 else
95 owritePos = 0;
96
97 return err;
98}
99
100template <class Type> BError BFifo<Type>::write(const Type* data, BUInt num){
101 BError err;
102 BUInt nt;
103
104 while(num){
105 nt = num;
106 if(nt > (osize - owritePos))
107 nt = (osize - owritePos);
108
109 memcpy(&odata[owritePos], data, nt * sizeof(Type));
110
111 if((owritePos + nt) == osize)
112 owritePos = 0;
113 else
114 owritePos += nt;
115
116 data += nt;
117 num -= nt;
118 }
119
120 return err;
121}
122
123template <class Type> Type* BFifo<Type>::writeData(){
124 return &odata[owritePos];
125}
126
127template <class Type> Type* BFifo<Type>::writeData(BUInt& num){
128 num = writeAvailableChunk();
129 return writeData();
130}
131
132template <class Type> void BFifo<Type>::writeDone(BUInt num){
133 if((owritePos + num) >= osize)
134 owritePos = owritePos + num - osize;
135 else
136 owritePos += num;
137}
138
139template <class Type> void BFifo<Type>::writeBackup(BUInt num){
140 BUInt n = num;
141 BUInt ra = readAvailable();
142
143 if(ra < n)
144 n = ra;
145
146 if(owritePos < n)
147 owritePos = owritePos + osize - n;
148 else
149 owritePos -= n;
150}
151
152
153template <class Type> BUInt BFifo<Type>::readAvailable(){
154 BUInt writePos = owritePos;
155
156 if(oreadPos <= writePos)
157 return writePos - oreadPos;
158 else
159 return osize - oreadPos + writePos;
160}
161
162template <class Type> BUInt BFifo<Type>::readAvailableChunk(){
163 BUInt writePos = owritePos;
164
165 if(oreadPos <= writePos)
166 return writePos - oreadPos;
167 else
168 return osize - oreadPos;
169}
170
171template <class Type> Type BFifo<Type>::read(){
172 BFloat v;
173
174 v = odata[oreadPos];
175 if(oreadPos < (osize-1))
176 oreadPos++;
177 else
178 oreadPos = 0;
179
180 return v;
181}
182
183template <class Type> BError BFifo<Type>::read(Type* data, BUInt num){
184 BError err;
185 BUInt nt;
186
187 while(num){
188 nt = num;
189 if(nt > (osize - oreadPos))
190 nt = (osize - oreadPos);
191
192 memcpy(data, &odata[oreadPos], nt * sizeof(Type));
193
194 if((oreadPos + nt) == osize)
195 oreadPos = 0;
196 else
197 oreadPos += nt;
198
199 data += nt;
200 num -= nt;
201 }
202
203 return err;
204}
205
206template <class Type> Type* BFifo<Type>::readData(){
207 return &odata[oreadPos];
208}
209
210template <class Type> Type* BFifo<Type>::readData(BUInt& num){
211 num = readAvailableChunk();
212 return readData();
213}
214
215template <class Type> void BFifo<Type>::readDone(BUInt num){
216 if((oreadPos + num) >= osize)
217 oreadPos = oreadPos + num - osize;
218 else
219 oreadPos += num;
220}
221
222template <class Type> Type BFifo<Type>::readPos(BUInt pos){
223 BUInt p = oreadPos + pos;
224
225 if(p >= osize)
226 return odata[p - osize];
227 else
228 return odata[p];
229}
230
231template <class Type> void BFifo<Type>::writePos(BUInt pos, const Type& v){
232 BUInt p = oreadPos + pos;
233
234 if(p >= osize)
235 odata[p - osize] = v;
236 else
237 odata[p] = v;
238}
239
240template <class Type> Type& BFifo<Type>::operator[](int pos){
241 BUInt p = oreadPos + pos;
242
243 if(p >= osize)
244 return odata[p - osize];
245 else
246 return odata[p];
247}
BUInt32 BUInt
Definition BTypes.h:33
BFloat32 BFloat
Definition BTypes.h:34
char data[8]
Definition BoapMc1.h:2
Error return class. This class is used to return the error status from a function....
Definition BError.h:31
BError & set(int errNo, BString errStr="")
Set error number and message.
Definition BError.cpp:24
Type read()
Read one item.
BFifo(BUInt size)
BError resize(BUInt size)
Resize FIFO, clears it as well.
BUInt writeAvailableChunk()
How many items that can be written in a chunk.
BUInt size()
Returns fifo size.
void writeDone(BUInt num)
Indicates when write is complete.
BError rebase()
Rebases fifo so read pointer is at zero moving memory as needed.
Type readPos(BUInt pos)
Read item at given offset from current read position.
void clear()
void writeBackup(BUInt num)
Backup, remove num items at end of fifo. Careful, make sure read is not already happening.
void writePos(BUInt pos, const Type &v)
Write item at given offset from current read position.
Type & operator[](int pos)
Direct access to read samples in buffer.
BUInt readAvailableChunk()
How many items are available to read in a chunk.
BUInt writeAvailable()
How many items that can be written.
void readDone(BUInt num)
Type * writeData()
Returns a pointer to the data.
BUInt readAvailable()
How many items are available to read.
BError write(const Type v)
Write a single item.
Type * readData()
Returns a pointer to the data.