Audacity 3.2.0
Public Member Functions | Private Attributes | List of all members
MeterUpdateQueue Class Reference

Queue of MeterUpdateMsg used to feed the MeterPanel. More...

#include <MeterPanel.h>

Collaboration diagram for MeterUpdateQueue:
[legend]

Public Member Functions

 MeterUpdateQueue (size_t maxLen)
 
 ~MeterUpdateQueue ()
 
bool Put (MeterUpdateMsg &msg)
 
bool Get (MeterUpdateMsg &msg)
 
void Clear ()
 

Private Attributes

NonInterfering< std::atomic< size_t > > mStart { 0 }
 
NonInterfering< std::atomic< size_t > > mEnd { 0 }
 
const size_t mBufferSize
 
ArrayOf< MeterUpdateMsgmBuffer {mBufferSize}
 

Detailed Description

Queue of MeterUpdateMsg used to feed the MeterPanel.

Definition at line 75 of file MeterPanel.h.

Constructor & Destructor Documentation

◆ MeterUpdateQueue()

MeterUpdateQueue::MeterUpdateQueue ( size_t  maxLen)
explicit

Definition at line 192 of file MeterPanel.cpp.

192 :
193 mBufferSize(maxLen)
194{
195 Clear();
196}
const size_t mBufferSize
Definition: MeterPanel.h:91

References Clear().

Here is the call graph for this function:

◆ ~MeterUpdateQueue()

MeterUpdateQueue::~MeterUpdateQueue ( )

Definition at line 199 of file MeterPanel.cpp.

200{
201}

Member Function Documentation

◆ Clear()

void MeterUpdateQueue::Clear ( )

Definition at line 203 of file MeterPanel.cpp.

204{
205 mStart.store(0);
206 mEnd.store(0);
207}
NonInterfering< std::atomic< size_t > > mEnd
Definition: MeterPanel.h:89
NonInterfering< std::atomic< size_t > > mStart
Definition: MeterPanel.h:89

References mEnd, and mStart.

Referenced by MeterPanel::Clear(), MeterUpdateQueue(), MeterPanel::OnMeterUpdate(), and MeterPanel::Reset().

Here is the caller graph for this function:

◆ Get()

bool MeterUpdateQueue::Get ( MeterUpdateMsg msg)

Definition at line 234 of file MeterPanel.cpp.

235{
236 auto start = mStart.load(std::memory_order_relaxed);
237 auto end = mEnd.load(std::memory_order_acquire);
238 int len = (end + mBufferSize - start) % mBufferSize;
239
240 if (len == 0)
241 return false;
242
243 msg = mBuffer[start];
244 mStart.store((start + 1) % mBufferSize, std::memory_order_release);
245
246 return true;
247}
ArrayOf< MeterUpdateMsg > mBuffer
Definition: MeterPanel.h:92
const char * end(const char *str) noexcept
Definition: StringUtils.h:106

References details::end(), mBuffer, mBufferSize, mEnd, and mStart.

Referenced by MeterPanel::OnMeterUpdate().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Put()

bool MeterUpdateQueue::Put ( MeterUpdateMsg msg)

Definition at line 211 of file MeterPanel.cpp.

212{
213 auto start = mStart.load(std::memory_order_acquire);
214 auto end = mEnd.load(std::memory_order_relaxed);
215 // mStart can be greater than mEnd because it is all mod mBufferSize
216 assert( (end + mBufferSize - start) >= 0 );
217 int len = (end + mBufferSize - start) % mBufferSize;
218
219 // Never completely fill the queue, because then the
220 // state is ambiguous (mStart==mEnd)
221 if (len + 1 >= (int)(mBufferSize))
222 return false;
223
224 //wxLogDebug(wxT("Put: %s"), msg.toString());
225
226 mBuffer[end] = msg;
227 mEnd.store((end + 1) % mBufferSize, std::memory_order_release);
228
229 return true;
230}

References details::end(), mBuffer, mBufferSize, mEnd, and mStart.

Referenced by MeterPanel::UpdateDisplay().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ mBuffer

ArrayOf<MeterUpdateMsg> MeterUpdateQueue::mBuffer {mBufferSize}
private

Definition at line 92 of file MeterPanel.h.

Referenced by Get(), and Put().

◆ mBufferSize

const size_t MeterUpdateQueue::mBufferSize
private

Definition at line 91 of file MeterPanel.h.

Referenced by Get(), and Put().

◆ mEnd

NonInterfering< std::atomic<size_t> > MeterUpdateQueue::mEnd { 0 }
private

Definition at line 89 of file MeterPanel.h.

Referenced by Clear(), Get(), and Put().

◆ mStart

NonInterfering< std::atomic<size_t> > MeterUpdateQueue::mStart { 0 }
private

Definition at line 89 of file MeterPanel.h.

Referenced by Clear(), Get(), and Put().


The documentation for this class was generated from the following files: