kwave  18.07.70
Kwave::RecordThread Class Reference

#include <RecordThread.h>

Inheritance diagram for Kwave::RecordThread:
Inheritance graph
Collaboration diagram for Kwave::RecordThread:
Collaboration graph

Signals

void bufferFull ()
 
void stopped (int errorcode)
 

Public Member Functions

 RecordThread ()
 
virtual ~RecordThread () Q_DECL_OVERRIDE
 
virtual void run () Q_DECL_OVERRIDE
 
void setRecordDevice (Kwave::RecordDevice *device)
 
int setBuffers (unsigned int count, unsigned int size)
 
unsigned int remainingBuffers ()
 
unsigned int queuedBuffers ()
 
QByteArray dequeue ()
 
- Public Member Functions inherited from Kwave::WorkerThread
 WorkerThread (Kwave::Runnable *runnable, QVariant params)
 
virtual ~WorkerThread () Q_DECL_OVERRIDE
 
virtual void start ()
 
virtual int stop (unsigned int timeout=10000)
 
virtual void cancel ()
 
bool shouldStop ()
 

Private Attributes

Kwave::RecordDevicem_device
 
QQueue< QByteArray > m_empty_queue
 
QQueue< QByteArray > m_full_queue
 
unsigned int m_buffer_count
 
unsigned int m_buffer_size
 

Detailed Description

Definition at line 33 of file RecordThread.h.

Constructor & Destructor Documentation

◆ RecordThread()

Kwave::RecordThread::RecordThread ( )

Constructor

Definition at line 28 of file RecordThread.cpp.

29  :Kwave::WorkerThread(Q_NULLPTR, QVariant()), m_device(Q_NULLPTR),
31 {
32 }
unsigned int m_buffer_size
Definition: RecordThread.h:102
Kwave::RecordDevice * m_device
Definition: RecordThread.h:90
unsigned int m_buffer_count
Definition: RecordThread.h:99
QQueue< QByteArray > m_empty_queue
Definition: RecordThread.h:93

◆ ~RecordThread()

Kwave::RecordThread::~RecordThread ( )
virtual

Destructor

Definition at line 35 of file RecordThread.cpp.

References m_empty_queue, m_full_queue, and Kwave::WorkerThread::stop().

36 {
37  stop();
38  m_full_queue.clear();
39  m_empty_queue.clear();
40 }
QQueue< QByteArray > m_full_queue
Definition: RecordThread.h:96
virtual int stop(unsigned int timeout=10000)
QQueue< QByteArray > m_empty_queue
Definition: RecordThread.h:93
Here is the call graph for this function:

Member Function Documentation

◆ bufferFull

void Kwave::RecordThread::bufferFull ( )
signal

emitted when a buffer was full and has been de-queued with dequeue()

Referenced by run().

Here is the caller graph for this function:

◆ dequeue()

QByteArray Kwave::RecordThread::dequeue ( )

De-queues a buffer from the m_full_queue.

Definition at line 87 of file RecordThread.cpp.

References m_empty_queue, and m_full_queue.

Referenced by Kwave::RecordPlugin::processBuffer().

88 {
89  if (m_full_queue.count()) {
90  // de-queue the buffer from the full list
91  QByteArray buf = m_full_queue.dequeue();
92 
93  // put the buffer back to the empty list
94  m_empty_queue.enqueue(buf);
95 
96  // return the buffer
97  return buf;
98  } else {
99  // return an empty buffer
100  return QByteArray();
101  }
102 }
QQueue< QByteArray > m_full_queue
Definition: RecordThread.h:96
QQueue< QByteArray > m_empty_queue
Definition: RecordThread.h:93
Here is the caller graph for this function:

◆ queuedBuffers()

unsigned int Kwave::RecordThread::queuedBuffers ( )

Returns the number of queued filled buffers

Definition at line 81 of file RecordThread.cpp.

References m_full_queue.

Referenced by Kwave::RecordPlugin::enterInhibit(), Kwave::RecordPlugin::processBuffer(), Kwave::RecordPlugin::setup(), and Kwave::RecordPlugin::updateBufferProgressBar().

82 {
83  return (m_full_queue.count());
84 }
QQueue< QByteArray > m_full_queue
Definition: RecordThread.h:96
Here is the caller graph for this function:

◆ remainingBuffers()

unsigned int Kwave::RecordThread::remainingBuffers ( )

Returns the amount of remaining empty buffers

Definition at line 75 of file RecordThread.cpp.

References m_empty_queue.

Referenced by Kwave::RecordPlugin::updateBufferProgressBar().

76 {
77  return (m_empty_queue.count());
78 }
QQueue< QByteArray > m_empty_queue
Definition: RecordThread.h:93
Here is the caller graph for this function:

◆ run()

void Kwave::RecordThread::run ( )
virtual

does the recording

Reimplemented from Kwave::WorkerThread.

Definition at line 105 of file RecordThread.cpp.

References bufferFull(), m_device, m_empty_queue, m_full_queue, Kwave::RecordDevice::read(), Kwave::WorkerThread::shouldStop(), and stopped().

106 {
107  int result = 0;
108  bool interrupted = false;
109 
110  // read data until we receive a close signal
111  while (!shouldStop() && !interrupted) {
112  // dequeue a buffer from the "empty" queue
113 
114  if (m_empty_queue.isEmpty()) {
115  // we had a "buffer overflow"
116  qWarning("RecordThread::run() -> NO EMPTY BUFFER FOUND !!!");
117  result = -ENOBUFS;
118  break;
119  }
120 
121  QByteArray buffer = m_empty_queue.dequeue();
122  int len = buffer.size();
123  Q_ASSERT(buffer.size());
124  if (!len) {
125  result = -ENOBUFS;
126  break;
127  }
128 
129  // read into the current buffer
130  unsigned int offset = 0;
131  while (len && !interrupted && !shouldStop()) {
132  // read raw data from the record device
133  result = (m_device) ?
134  m_device->read(buffer, offset) : -EBADF;
135 
136  if ((result < 0) && (result != -EAGAIN))
137  qWarning("RecordThread: read result = %d (%s)",
138  result, strerror(-result));
139 
140  if (result == -EAGAIN) {
141  continue;
142  } else if (result == -EBADF) {
143  // file open has failed
144  interrupted = true;
145  break;
146  } else if (result == -EINTR) {
147  // thread was interrupted, received signal?
148  interrupted = true;
149  break;
150  } else if (result < 1) {
151  // something went wrong !?
152  interrupted = true;
153  qWarning("RecordThread::run(): read returned %d", result);
154  break;
155  } else {
156  offset += result;
157  len = buffer.size() - offset;
158  Q_ASSERT(len >= 0);
159  if (len < 0) len = 0;
160  }
161  }
162 
163  // return buffer into the empty queue and abort on errors
164  // do not use it
165  if (interrupted && (result < 0)) {
166  m_empty_queue.enqueue(buffer);
167  break;
168  }
169 
170  // inform the application that there is something to dequeue
171  m_full_queue.enqueue(buffer);
172  emit bufferFull();
173  }
174 
175  // do not evaluate the result of the last operation if there
176  // was the external request to stop
177  if (shouldStop() || (interrupted && (result > 0)))
178  result = 0;
179 
180  if (result) emit stopped(result);
181 }
virtual int read(QByteArray &buffer, unsigned int offset)=0
QQueue< QByteArray > m_full_queue
Definition: RecordThread.h:96
Kwave::RecordDevice * m_device
Definition: RecordThread.h:90
QQueue< QByteArray > m_empty_queue
Definition: RecordThread.h:93
void stopped(int errorcode)
Here is the call graph for this function:

◆ setBuffers()

int Kwave::RecordThread::setBuffers ( unsigned int  count,
unsigned int  size 
)

Set the number of buffers and their size

Parameters
countthe number of buffer, minimum allowed is two
sizethe number of bytes for each buffer
Returns
number of allocated buffers or -ENOMEM if less than two
Note
this must not be called during recording

Definition at line 52 of file RecordThread.cpp.

References m_buffer_count, m_buffer_size, m_empty_queue, and m_full_queue.

Referenced by Kwave::RecordPlugin::setupRecordThread().

53 {
54  Q_ASSERT(!isRunning());
55  if (isRunning()) return -EBUSY;
56 
57  // flush all queues
58  m_full_queue.clear();
59  m_empty_queue.clear();
60 
61  // fill the "empty" queue again
62  QByteArray buf(size, 0x00);
63  for (unsigned int i = 0; i < count; i++)
64  m_empty_queue.enqueue(buf);
65 
66  // take the new settings
67  m_buffer_size = size;
68  m_buffer_count = count;
69 
70  // return number of buffers or -ENOMEM if not even two allocated
71  return (m_empty_queue.count() >= 2) ? m_empty_queue.count() : -ENOMEM;
72 }
unsigned int m_buffer_size
Definition: RecordThread.h:102
QQueue< QByteArray > m_full_queue
Definition: RecordThread.h:96
unsigned int m_buffer_count
Definition: RecordThread.h:99
QQueue< QByteArray > m_empty_queue
Definition: RecordThread.h:93
Here is the caller graph for this function:

◆ setRecordDevice()

void Kwave::RecordThread::setRecordDevice ( Kwave::RecordDevice device)

Select a new record device.

Parameters
devicea RecordDevice that is opened and set up for reading
Note
this must not be called during recording

Definition at line 43 of file RecordThread.cpp.

References m_device.

Referenced by Kwave::RecordPlugin::setupRecordThread().

44 {
45  Q_ASSERT(!isRunning());
46  if (isRunning()) return;
47 
48  m_device = device;
49 }
Kwave::RecordDevice * m_device
Definition: RecordThread.h:90
Here is the caller graph for this function:

◆ stopped

void Kwave::RecordThread::stopped ( int  errorcode)
signal

emitted when the recording stops or aborts

Parameters
errorcodezero if stopped normally or a negative error code if aborted

Referenced by run().

Here is the caller graph for this function:

Member Data Documentation

◆ m_buffer_count

unsigned int Kwave::RecordThread::m_buffer_count
private

number of buffers to allocate

Definition at line 99 of file RecordThread.h.

Referenced by setBuffers().

◆ m_buffer_size

unsigned int Kwave::RecordThread::m_buffer_size
private

size of m_buffer in bytes

Definition at line 102 of file RecordThread.h.

Referenced by setBuffers().

◆ m_device

Kwave::RecordDevice* Kwave::RecordThread::m_device
private

the device used as source

Definition at line 90 of file RecordThread.h.

Referenced by run(), and setRecordDevice().

◆ m_empty_queue

QQueue<QByteArray> Kwave::RecordThread::m_empty_queue
private

queue with empty buffers for raw input data

Definition at line 93 of file RecordThread.h.

Referenced by dequeue(), remainingBuffers(), run(), setBuffers(), and ~RecordThread().

◆ m_full_queue

QQueue<QByteArray> Kwave::RecordThread::m_full_queue
private

queue with filled buffers with raw input data

Definition at line 96 of file RecordThread.h.

Referenced by dequeue(), queuedBuffers(), run(), setBuffers(), and ~RecordThread().


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