1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
//=============================================================================
// MusE
// Linux Music Editor
// $Id:$
//
// Copyright (C) 2002-2006 by Werner Schweer and others
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//=============================================================================
#ifndef __FIFO_H__
#define __FIFO_H__
const int FIFO_BUFFER = 256;
//---------------------------------------------------------
// Fifo
//---------------------------------------------------------
struct FifoBuffer {
float* buffer;
int size;
int maxSize;
unsigned pos;
int segs;
FifoBuffer() {
buffer = 0;
size = 0;
maxSize = 0;
}
};
//---------------------------------------------------------
// FifoBase
// - works only for one reader/writer
// - reader writes ridx
// - writer writes widx
// - reader decrements counter
// - writer increments counter
// - counter increment/decrement must be atomic
//---------------------------------------------------------
class FifoBase {
protected:
int ridx; // read index
int widx; // write index
volatile int counter; // objects in fifo
public:
FifoBase() { clear(); }
virtual ~FifoBase() {}
void clear();
virtual void push(); // put object on fifo
virtual void pop(); // remove object from fifo
int count() const { return counter; }
int readIndex() const { return ridx; }
};
//---------------------------------------------------------
// Fifo
//---------------------------------------------------------
class Fifo : public FifoBase {
int nbuffer; // max buffer size (fifo-size)
FifoBuffer** buffer;
public:
Fifo();
~Fifo();
bool put(int, unsigned long, float** buffer, unsigned pos);
bool getWriteBuffer(int, unsigned long, float** buffer, unsigned pos);
bool get(int, unsigned long, float** buffer, unsigned pos);
bool get(int, unsigned long, float** buffer);
};
//---------------------------------------------------------
// Fifo1
//---------------------------------------------------------
class Fifo1 : public FifoBase {
public:
unsigned positions[FIFO_BUFFER];
Fifo1() : FifoBase() {}
int setWritePos(unsigned pos) {
positions[widx] = pos;
return widx;
}
unsigned readPos() const { return positions[ridx]; }
};
#endif
|