summaryrefslogtreecommitdiff
path: root/muse_qt4_evolution/muse/fifo.h
blob: b4c49288f2bc38ecd754282353d78054ba1927aa (plain)
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