JackTrip
RingBuffer.h
Go to the documentation of this file.
1 //*****************************************************************
2 /*
3  JackTrip: A System for High-Quality Audio Network Performance
4  over the Internet
5 
6  Copyright (c) 2008 Juan-Pablo Caceres, Chris Chafe.
7  SoundWIRE group at CCRMA, Stanford University.
8 
9  Permission is hereby granted, free of charge, to any person
10  obtaining a copy of this software and associated documentation
11  files (the "Software"), to deal in the Software without
12  restriction, including without limitation the rights to use,
13  copy, modify, merge, publish, distribute, sublicense, and/or sell
14  copies of the Software, and to permit persons to whom the
15  Software is furnished to do so, subject to the following
16  conditions:
17 
18  The above copyright notice and this permission notice shall be
19  included in all copies or substantial portions of the Software.
20 
21  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
23  OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
25  HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
26  WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
27  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
28  OTHER DEALINGS IN THE SOFTWARE.
29 */
30 //*****************************************************************
31 
38 #ifndef __RINGBUFFER_H__
39 #define __RINGBUFFER_H__
40 
41 #include <QWaitCondition>
42 #include <QMutex>
43 #include <QMutexLocker>
44 
45 #include "jacktrip_types.h"
46 
47 
56 {
57 public:
58 
63  RingBuffer(int SlotSize, int NumSlots);
64 
67  virtual ~RingBuffer();
68 
78  void insertSlotBlocking(const int8_t* ptrToSlot);
79 
89  void readSlotBlocking(int8_t* ptrToReadSlot);
90 
94  void insertSlotNonBlocking(const int8_t* ptrToSlot);
95 
99  void readSlotNonBlocking(int8_t* ptrToReadSlot);
100 
101 
102 protected:
103 
108  virtual void setUnderrunReadSlot(int8_t* ptrToReadSlot);
109 
116  virtual void setMemoryInReadSlotWithLastReadSlot(int8_t* ptrToReadSlot);
117 
118 private:
119 
121  void underrunReset();
123  void overflowReset();
125  void debugDump() const;
126 
127  const int mSlotSize;
128  const int mNumSlots;
129  const int mTotalSize;
135 
136  // Thread Synchronization Private Members
137  QMutex mMutex;
138  QWaitCondition mBufferIsNotFull;
139  QWaitCondition mBufferIsNotEmpty;
140 };
141 
142 #endif
int mReadPosition
Read Positions in the RingBuffer (Tail)
Definition: RingBuffer.h:130
QMutex mMutex
Mutex to protect read and write operations.
Definition: RingBuffer.h:137
const int mNumSlots
Number of Slots.
Definition: RingBuffer.h:128
int mWritePosition
Write Position in the RingBuffer (Head)
Definition: RingBuffer.h:131
void overflowReset()
Resets the ring buffer for writes over-flows non-blocking.
Definition: RingBuffer.cpp:234
int8_t * mRingBuffer
8-bit array of data (1-byte)
Definition: RingBuffer.h:133
void debugDump() const
Helper method to debug, prints member variables to terminal.
Definition: RingBuffer.cpp:244
virtual void setMemoryInReadSlotWithLastReadSlot(int8_t *ptrToReadSlot)
Uses the last read slot to set the memory in the Read Slot.
Definition: RingBuffer.cpp:211
virtual ~RingBuffer()
The class destructor.
Definition: RingBuffer.cpp:93
int8_t * mLastReadSlot
Last slot read.
Definition: RingBuffer.h:134
qint8 int8_t
Typedef for unsigned long long int. This type is guaranteed to be 64-bit.
Definition: jacktrip_types.h:74
void insertSlotBlocking(const int8_t *ptrToSlot)
Insert a slot into the RingBuffer from ptrToSlot. This method will block until there's space in the b...
Definition: RingBuffer.cpp:103
const int mTotalSize
Total size of the mRingBuffer = mSlotSize*mNumSlotss.
Definition: RingBuffer.h:129
void underrunReset()
Resets the ring buffer for reads under-runs non-blocking.
Definition: RingBuffer.cpp:221
Provides a ring-buffer (or circular-buffer) that can be written to and read from asynchronously (bloc...
Definition: RingBuffer.h:55
QWaitCondition mBufferIsNotEmpty
Buffer not empty condition to monitor threads.
Definition: RingBuffer.h:139
int mFullSlots
Number of used (full) slots, in slot-size.
Definition: RingBuffer.h:132
void readSlotNonBlocking(int8_t *ptrToReadSlot)
Same as readSlotBlocking but non-blocking (asynchronous)
Definition: RingBuffer.cpp:175
QWaitCondition mBufferIsNotFull
Buffer not full condition to monitor threads.
Definition: RingBuffer.h:138
RingBuffer(int SlotSize, int NumSlots)
The class constructor.
Definition: RingBuffer.cpp:50
void insertSlotNonBlocking(const int8_t *ptrToSlot)
Same as insertSlotBlocking but non-blocking (asynchronous)
Definition: RingBuffer.cpp:149
virtual void setUnderrunReadSlot(int8_t *ptrToReadSlot)
Sets the memory in the Read Slot when uderrun occurs. By default, this sets it to 0...
Definition: RingBuffer.cpp:204
const int mSlotSize
The size of one slot in byes.
Definition: RingBuffer.h:127
void readSlotBlocking(int8_t *ptrToReadSlot)
Read a slot from the RingBuffer into ptrToReadSlot. This method will block until there's space in the...
Definition: RingBuffer.cpp:125