kwave  18.07.70
Kwave::SampleBuffer Class Reference

#include <SampleBuffer.h>

Inheritance diagram for Kwave::SampleBuffer:
Inheritance graph
Collaboration diagram for Kwave::SampleBuffer:
Collaboration graph

Public Slots

virtual void input (Kwave::SampleArray data)
 

Signals

void output (Kwave::SampleArray data)
 
- Signals inherited from Kwave::StreamObject
void attributeChanged (const QVariant value)
 

Public Member Functions

 SampleBuffer (QObject *parent=Q_NULLPTR)
 
virtual ~SampleBuffer ()
 
virtual bool isEmpty () const
 
virtual Kwave::SampleArraydata ()
 
virtual const Kwave::SampleArrayconstData () const
 
virtual unsigned int available () const
 
virtual const sample_tget (unsigned int len)
 
void put (sample_t sample)
 
virtual void finished ()
 
- Public Member Functions inherited from Kwave::SampleSink
 SampleSink (QObject *parent=Q_NULLPTR)
 
virtual ~SampleSink ()
 
virtual bool done () const
 
- Public Member Functions inherited from Kwave::StreamObject
 StreamObject (QObject *parent=Q_NULLPTR)
 
virtual ~StreamObject ()
 
virtual unsigned int tracks () const
 
virtual Kwave::StreamObjectoperator[] (unsigned int track)
 
virtual unsigned int tracksOfPort (const char *port) const
 
virtual Kwave::StreamObjectport (const char *port, unsigned int track)
 
virtual unsigned int blockSize () const
 
void setAttribute (const char *attribute, const QVariant &value)
 

Protected Member Functions

void emitData (Kwave::SampleArray data)
 

Private Member Functions

void enqueue (Kwave::SampleArray data)
 

Private Attributes

Kwave::SampleArray m_data
 
unsigned int m_offset
 
unsigned int m_buffered
 
QSemaphore m_sema
 

Friends

class BufferJob
 

Additional Inherited Members

- Static Public Member Functions inherited from Kwave::StreamObject
static void setInteractive (bool interactive)
 

Detailed Description

Definition at line 33 of file SampleBuffer.h.

Constructor & Destructor Documentation

◆ SampleBuffer()

Kwave::SampleBuffer::SampleBuffer ( QObject *  parent = Q_NULLPTR)

Constructor

Parameters
parenta parent object, passed to QObject (optional)

Definition at line 28 of file SampleBuffer.cpp.

29  :Kwave::SampleSink(parent),
30  m_data(), m_offset(0), m_buffered(0), m_sema(1)
31 {
32 }
unsigned int m_buffered
Definition: SampleBuffer.h:112
Kwave::SampleArray m_data
Definition: SampleBuffer.h:106
unsigned int m_offset
Definition: SampleBuffer.h:109

◆ ~SampleBuffer()

Kwave::SampleBuffer::~SampleBuffer ( )
virtual

Destructor

Definition at line 35 of file SampleBuffer.cpp.

References m_sema.

36 {
37  m_sema.acquire();
38 }

Member Function Documentation

◆ available()

unsigned int Kwave::SampleBuffer::available ( ) const
virtual

returns the number of samples that can be fetched with get()

Definition at line 59 of file SampleBuffer.cpp.

References m_data, m_offset, and Kwave::SampleArray::size().

Referenced by Kwave::OpusEncoder::fillInBuffer().

60 {
61  unsigned int size = m_data.size();
62  return (size > m_offset) ? (size - m_offset) : 0;
63 }
Kwave::SampleArray m_data
Definition: SampleBuffer.h:106
unsigned int size() const
unsigned int m_offset
Definition: SampleBuffer.h:109
Here is the call graph for this function:
Here is the caller graph for this function:

◆ constData()

const Kwave::SampleArray & Kwave::SampleBuffer::constData ( ) const
virtual

returns a const reference to the sample data

Definition at line 53 of file SampleBuffer.cpp.

References m_data.

Referenced by Kwave::ChannelMixer::mix().

54 {
55  return m_data;
56 }
Kwave::SampleArray m_data
Definition: SampleBuffer.h:106
Here is the caller graph for this function:

◆ data()

Kwave::SampleArray & Kwave::SampleBuffer::data ( )
virtual

returns a reference to the sample data

Definition at line 47 of file SampleBuffer.cpp.

References m_data.

Referenced by input(), and Kwave::ChannelMixer::mix().

48 {
49  return m_data;
50 }
Kwave::SampleArray m_data
Definition: SampleBuffer.h:106
Here is the caller graph for this function:

◆ emitData()

void Kwave::SampleBuffer::emitData ( Kwave::SampleArray  data)
protected

Emit data from this object, used from a buffer thread

Parameters
dataa sample array to emit

Definition at line 140 of file SampleBuffer.cpp.

References m_sema, and output().

Referenced by enqueue().

141 {
142  // NOTE: this signal could be connected to a slot that blocks for a while
143  emit output(data);
144  m_sema.release();
145 }
void output(Kwave::SampleArray data)
Here is the caller graph for this function:

◆ enqueue()

void Kwave::SampleBuffer::enqueue ( Kwave::SampleArray  data)
private

enqueue some data

Definition at line 133 of file SampleBuffer.cpp.

References emitData(), and m_sema.

Referenced by finished(), and input().

134 {
135  m_sema.acquire();
136  QtConcurrent::run(this, &Kwave::SampleBuffer::emitData, data);
137 }
void emitData(Kwave::SampleArray data)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ finished()

void Kwave::SampleBuffer::finished ( )
virtual

emit the sample data stored in m_data

Definition at line 101 of file SampleBuffer.cpp.

References Kwave::StreamObject::blockSize(), enqueue(), m_buffered, m_data, Kwave::SampleArray::resize(), and Kwave::SampleArray::size().

Referenced by Kwave::OpusDecoder::close(), Kwave::ChannelMixer::mix(), and put().

102 {
103  bool ok = true;
104 
105  if (m_buffered && (m_data.size() != m_buffered))
106  ok &= m_data.resize(m_buffered);
107 
108  enqueue(m_data);
109  m_buffered = 0;
111  Q_ASSERT(ok);
112 }
void enqueue(Kwave::SampleArray data)
unsigned int m_buffered
Definition: SampleBuffer.h:112
Kwave::SampleArray m_data
Definition: SampleBuffer.h:106
virtual unsigned int blockSize() const
unsigned int size() const
bool resize(unsigned int size) Q_REQUIRED_RESULT
Here is the call graph for this function:
Here is the caller graph for this function:

◆ get()

const sample_t * Kwave::SampleBuffer::get ( unsigned int  len)
virtual

returns a pointer to the raw data and advances the internal offset afterwards

Parameters
lenmaximum number of samples to get
Returns
pointer to the raw data in the buffer

Definition at line 66 of file SampleBuffer.cpp.

References Kwave::SampleArray::constData(), m_data, m_offset, and Kwave::SampleArray::size().

Referenced by Kwave::OpusEncoder::fillInBuffer().

67 {
68  const unsigned int size = m_data.size();
69  if (m_offset > size) return Q_NULLPTR; // already reached EOF
70 
71  // limit read length to the size of the buffer
72  if (len > size) len = size;
73 
74  // get a pointer to the raw data
75  const sample_t *raw = m_data.constData() + m_offset;
76 
77  // advance the offset
78  m_offset += len;
79 
80  return raw;
81 }
Kwave::SampleArray m_data
Definition: SampleBuffer.h:106
const sample_t * constData() const
Definition: SampleArray.h:54
unsigned int size() const
qint32 sample_t
Definition: Sample.h:37
unsigned int m_offset
Definition: SampleBuffer.h:109
Here is the call graph for this function:
Here is the caller graph for this function:

◆ input

void Kwave::SampleBuffer::input ( Kwave::SampleArray  data)
virtualslot

slot for taking input data, stores it into m_data

Definition at line 115 of file SampleBuffer.cpp.

References data(), enqueue(), m_buffered, m_data, m_offset, Kwave::SampleArray::resize(), and Kwave::SampleArray::size().

116 {
117  // if we have buffered data, flush that first
118  if (m_buffered) {
119  bool ok = m_data.resize(m_buffered);
120  Q_ASSERT(ok);
121  Q_UNUSED(ok);
122  m_buffered = 0;
123  enqueue(m_data);
124  }
125 
126  // take over the input array directly
127  m_data = data;
128  m_offset = 0;
129  m_buffered = data.size();
130 }
virtual Kwave::SampleArray & data()
void enqueue(Kwave::SampleArray data)
unsigned int m_buffered
Definition: SampleBuffer.h:112
Kwave::SampleArray m_data
Definition: SampleBuffer.h:106
unsigned int size() const
bool resize(unsigned int size) Q_REQUIRED_RESULT
unsigned int m_offset
Definition: SampleBuffer.h:109
Here is the call graph for this function:

◆ isEmpty()

bool Kwave::SampleBuffer::isEmpty ( ) const
virtual

returns true if no sample data is present

Definition at line 41 of file SampleBuffer.cpp.

References Kwave::SampleArray::isEmpty(), and m_data.

42 {
43  return m_data.isEmpty();
44 }
bool isEmpty() const
Definition: SampleArray.h:118
Kwave::SampleArray m_data
Definition: SampleBuffer.h:106
Here is the call graph for this function:

◆ output

void Kwave::SampleBuffer::output ( Kwave::SampleArray  data)
signal

emits the data received via input()

Referenced by emitData().

Here is the caller graph for this function:

◆ put()

void Kwave::SampleBuffer::put ( sample_t  sample)

Appends one samples to the buffer. If the buffer is full afterwards, the buffer will be emitted.

Parameters
samplea single sample

Definition at line 84 of file SampleBuffer.cpp.

References Kwave::StreamObject::blockSize(), finished(), m_buffered, m_data, and Kwave::SampleArray::resize().

Referenced by Kwave::OpusDecoder::decode().

85 {
86  const unsigned int block_size = Kwave::StreamObject::blockSize();
87 
88  if (m_buffered >= block_size) finished();
89 
90  // initial fill of the buffer?
91  bool ok = m_data.resize(block_size);
92  Q_ASSERT(ok);
93  Q_UNUSED(ok);
94 
95  m_data[m_buffered++] = sample;
96  if (m_buffered >= block_size) finished();
97 }
virtual void finished()
unsigned int m_buffered
Definition: SampleBuffer.h:112
Kwave::SampleArray m_data
Definition: SampleBuffer.h:106
virtual unsigned int blockSize() const
bool resize(unsigned int size) Q_REQUIRED_RESULT
Here is the call graph for this function:
Here is the caller graph for this function:

Friends And Related Function Documentation

◆ BufferJob

friend class BufferJob
friend

Definition at line 85 of file SampleBuffer.h.

Member Data Documentation

◆ m_buffered

unsigned int Kwave::SampleBuffer::m_buffered
private

number of samples buffered, e.g. through put()

Definition at line 112 of file SampleBuffer.h.

Referenced by finished(), input(), and put().

◆ m_data

Kwave::SampleArray Kwave::SampleBuffer::m_data
private

array with sample data

Definition at line 106 of file SampleBuffer.h.

Referenced by available(), constData(), data(), finished(), get(), input(), isEmpty(), and put().

◆ m_offset

unsigned int Kwave::SampleBuffer::m_offset
private

offset within the data, for reading

Definition at line 109 of file SampleBuffer.h.

Referenced by available(), get(), and input().

◆ m_sema

QSemaphore Kwave::SampleBuffer::m_sema
private

semaphore for limiting queue depth to 1

Definition at line 115 of file SampleBuffer.h.

Referenced by emitData(), enqueue(), and ~SampleBuffer().


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