kwave  18.07.70
Kwave::Mul Class Reference

#include <Mul.h>

Inheritance diagram for Kwave::Mul:
Inheritance graph
Collaboration diagram for Kwave::Mul:
Collaboration graph

Public Slots

void input_a (Kwave::SampleArray data)
 
void input_b (Kwave::SampleArray data)
 
void set_a (const QVariant &a)
 
void set_b (const QVariant &b)
 

Signals

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

Public Member Functions

 Mul ()
 
virtual ~Mul () Q_DECL_OVERRIDE
 
virtual void goOn () Q_DECL_OVERRIDE
 
- Public Member Functions inherited from Kwave::SampleSource
 SampleSource (QObject *parent=Q_NULLPTR)
 
virtual ~SampleSource ()
 
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)
 

Private Member Functions

virtual void multiply ()
 

Private Attributes

QQueue< Kwave::SampleArraym_queue_a
 
QQueue< Kwave::SampleArraym_queue_b
 
QSemaphore m_sem_a
 
QSemaphore m_sem_b
 
Kwave::SampleArray m_a
 
Kwave::SampleArray m_b
 
Kwave::SampleArray m_buffer_x
 
bool m_a_is_const
 
bool m_b_is_const
 
float m_value_a
 
float m_value_b
 
QMutex m_lock
 

Additional Inherited Members

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

Detailed Description

Definition at line 37 of file Mul.h.

Constructor & Destructor Documentation

◆ Mul()

Kwave::Mul::Mul ( )

Constructor

Definition at line 28 of file Mul.cpp.

30  m_queue_a(), m_queue_b(),
31  m_sem_a(0), m_sem_b(0),
32  m_a(), m_b(),
34  m_a_is_const(false), m_b_is_const(false),
35  m_value_a(0), m_value_b(0),
36  m_lock()
37 {
38 }
QSemaphore m_sem_a
Definition: Mul.h:82
Kwave::SampleArray m_b
Definition: Mul.h:91
Kwave::SampleArray m_a
Definition: Mul.h:88
bool m_b_is_const
Definition: Mul.h:100
float m_value_a
Definition: Mul.h:103
Kwave::SampleArray m_buffer_x
Definition: Mul.h:94
QSemaphore m_sem_b
Definition: Mul.h:85
float m_value_b
Definition: Mul.h:106
virtual unsigned int blockSize() const
QMutex m_lock
Definition: Mul.h:109
QQueue< Kwave::SampleArray > m_queue_a
Definition: Mul.h:76
QQueue< Kwave::SampleArray > m_queue_b
Definition: Mul.h:79
bool m_a_is_const
Definition: Mul.h:97

◆ ~Mul()

Kwave::Mul::~Mul ( )
virtual

Destructor

Definition at line 41 of file Mul.cpp.

42 {
43 }

Member Function Documentation

◆ goOn()

void Kwave::Mul::goOn ( )
virtual

does nothing, work is done automatically in multiply()

Implements Kwave::SampleSource.

Definition at line 46 of file Mul.cpp.

47 {
48 }

◆ input_a

void Kwave::Mul::input_a ( Kwave::SampleArray  data)
slot

receives input data for input A

Definition at line 134 of file Mul.cpp.

References m_a_is_const, m_b_is_const, m_lock, m_queue_a, m_queue_b, m_sem_a, and multiply().

135 {
136  {
137  QMutexLocker lock(&m_lock);
138 
139  m_queue_a.enqueue(data);
140  m_sem_a.release();
141  m_a_is_const = false;
142  }
143  if (m_b_is_const || !m_queue_b.isEmpty()) multiply();
144 }
QSemaphore m_sem_a
Definition: Mul.h:82
bool m_b_is_const
Definition: Mul.h:100
virtual void multiply()
Definition: Mul.cpp:51
QMutex m_lock
Definition: Mul.h:109
QQueue< Kwave::SampleArray > m_queue_a
Definition: Mul.h:76
QQueue< Kwave::SampleArray > m_queue_b
Definition: Mul.h:79
bool m_a_is_const
Definition: Mul.h:97
Here is the call graph for this function:

◆ input_b

void Kwave::Mul::input_b ( Kwave::SampleArray  data)
slot

receives input data for input B

Definition at line 147 of file Mul.cpp.

References m_a_is_const, m_b_is_const, m_lock, m_queue_a, m_queue_b, m_sem_b, and multiply().

148 {
149  {
150  QMutexLocker lock(&m_lock);
151 
152  m_queue_b.enqueue(data);
153  m_sem_b.release();
154  m_b_is_const = false;
155  }
156  if (m_a_is_const || !m_queue_a.isEmpty()) multiply();
157 }
bool m_b_is_const
Definition: Mul.h:100
QSemaphore m_sem_b
Definition: Mul.h:85
virtual void multiply()
Definition: Mul.cpp:51
QMutex m_lock
Definition: Mul.h:109
QQueue< Kwave::SampleArray > m_queue_a
Definition: Mul.h:76
QQueue< Kwave::SampleArray > m_queue_b
Definition: Mul.h:79
bool m_a_is_const
Definition: Mul.h:97
Here is the call graph for this function:

◆ multiply()

void Kwave::Mul::multiply ( )
privatevirtual

does the calculation

Definition at line 51 of file Mul.cpp.

References Kwave::StreamObject::blockSize(), Kwave::SampleArray::constData(), Kwave::SampleArray::data(), float2sample(), m_a, m_a_is_const, m_b, m_b_is_const, m_buffer_x, m_lock, m_queue_a, m_queue_b, m_sem_a, m_sem_b, m_value_a, m_value_b, output(), Kwave::SampleArray::resize(), sample2float(), and Kwave::SampleArray::size().

Referenced by input_a(), and input_b().

52 {
53  unsigned int count = blockSize();
54  float a = 0;
55  float b = 0;
56  const sample_t *p_a = Q_NULLPTR;
57  const sample_t *p_b = Q_NULLPTR;
58  sample_t *p_x = Q_NULLPTR;
59 
60  // get input A
61  if (!m_a_is_const) {
62  m_sem_a.acquire();
63  {
64  QMutexLocker lock(&m_lock);
65  m_a = m_queue_a.dequeue();
66  }
67  if (m_a.size() < count) count = m_a.size();
68  }
69  else
70  {
71  QMutexLocker lock(&m_lock);
72  a = m_value_a;
73  }
74 
75  // get input B
76  if (!m_b_is_const) {
77  m_sem_b.acquire();
78  {
79  QMutexLocker lock(&m_lock);
80  m_b = m_queue_b.dequeue();
81  }
82  if (m_b.size() < count) count = m_b.size();
83  }
84  else
85  {
86  QMutexLocker lock(&m_lock);
87  b = m_value_b;
88  }
89 
90  // check sizes of the buffers
91  if (!m_a_is_const && (count > m_a.size()))
92  count = m_a.size();
93  if (!m_b_is_const && (count > m_b.size()))
94  count = m_b.size();
95 
96  // special handling for zero length input
97  if (!count) {
98  emit output(Kwave::SampleArray()); // emit zero length output
99  return; // and bail out
100  }
101 
102 // if (!m_a_is_const && !m_b_is_const && (m_a.size() != m_b.size()))
103 // qWarning("Kwave::Mul: block sizes differ: %u x %u -> shrinked to %u",
104 // m_a.size(), m_b.size(), count);
105 
106  bool ok = m_buffer_x.resize(count);
107  Q_ASSERT(ok);
108  Q_UNUSED(ok);
109 
110  // get pointers to the buffer's raw data
111  p_a = m_a.constData();
112  p_b = m_b.constData();
113  p_x = m_buffer_x.data();
114  Q_ASSERT((m_a_is_const || p_a) && (m_b_is_const || p_b) && p_x);
115  if ((!m_a_is_const && !p_a) || (!m_b_is_const && !p_b) || !p_x)
116  return;
117 
118  // do the multiplication of the whole buffer
119  for (; count; count--)
120  {
121  if (!m_a_is_const) { a = sample2float(*p_a); ++p_a; }
122  if (!m_b_is_const) { b = sample2float(*p_b); ++p_b; }
123  float y = a * b;
124  if (y > float( 1.0)) y = float( 1.0);
125  if (y < float(-1.0)) y = float(-1.0);
126  *(p_x++) = float2sample(y);
127  }
128 
129  // emit the result
130  emit output(m_buffer_x);
131 }
QSemaphore m_sem_a
Definition: Mul.h:82
Kwave::SampleArray m_b
Definition: Mul.h:91
Kwave::SampleArray m_a
Definition: Mul.h:88
bool m_b_is_const
Definition: Mul.h:100
float m_value_a
Definition: Mul.h:103
void output(Kwave::SampleArray data)
Kwave::SampleArray m_buffer_x
Definition: Mul.h:94
static float sample2float(const sample_t s)
Definition: Sample.h:65
QSemaphore m_sem_b
Definition: Mul.h:85
const sample_t * constData() const
Definition: SampleArray.h:54
float m_value_b
Definition: Mul.h:106
virtual unsigned int blockSize() const
unsigned int size() const
QMutex m_lock
Definition: Mul.h:109
sample_t * data()
Definition: SampleArray.h:62
QQueue< Kwave::SampleArray > m_queue_a
Definition: Mul.h:76
static sample_t float2sample(const float f)
Definition: Sample.h:57
QQueue< Kwave::SampleArray > m_queue_b
Definition: Mul.h:79
bool resize(unsigned int size) Q_REQUIRED_RESULT
bool m_a_is_const
Definition: Mul.h:97
qint32 sample_t
Definition: Sample.h:37
Here is the call graph for this function:
Here is the caller graph for this function:

◆ output

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

emits a block with the interpolated curve

Referenced by multiply().

Here is the caller graph for this function:

◆ set_a

void Kwave::Mul::set_a ( const QVariant &  a)
slot

sets input A to a constant value (as float)

Definition at line 160 of file Mul.cpp.

References m_a_is_const, m_lock, and m_value_a.

161 {
162  QMutexLocker lock(&m_lock);
163 
164  m_value_a = QVariant(a).toFloat();
165  m_a_is_const = true;
166 }
float m_value_a
Definition: Mul.h:103
QMutex m_lock
Definition: Mul.h:109
bool m_a_is_const
Definition: Mul.h:97

◆ set_b

void Kwave::Mul::set_b ( const QVariant &  b)
slot

sets input B to a constant value (as float)

Definition at line 169 of file Mul.cpp.

References m_b_is_const, m_lock, and m_value_b.

170 {
171  QMutexLocker lock(&m_lock);
172 
173  m_value_b = QVariant(b).toFloat();
174  m_b_is_const = true;
175 }
bool m_b_is_const
Definition: Mul.h:100
float m_value_b
Definition: Mul.h:106
QMutex m_lock
Definition: Mul.h:109

Member Data Documentation

◆ m_a

Kwave::SampleArray Kwave::Mul::m_a
private

buffer for input A (currently in work)

Definition at line 88 of file Mul.h.

Referenced by multiply().

◆ m_a_is_const

bool Kwave::Mul::m_a_is_const
private

if true, input A is a constant

Definition at line 97 of file Mul.h.

Referenced by input_a(), input_b(), multiply(), and set_a().

◆ m_b

Kwave::SampleArray Kwave::Mul::m_b
private

buffer for input B (currently in work)

Definition at line 91 of file Mul.h.

Referenced by multiply().

◆ m_b_is_const

bool Kwave::Mul::m_b_is_const
private

if true, input B is a constant

Definition at line 100 of file Mul.h.

Referenced by input_a(), input_b(), multiply(), and set_b().

◆ m_buffer_x

Kwave::SampleArray Kwave::Mul::m_buffer_x
private

buffer for output data

Definition at line 94 of file Mul.h.

Referenced by multiply().

◆ m_lock

QMutex Kwave::Mul::m_lock
private

mutex for locking access to the queues

Definition at line 109 of file Mul.h.

Referenced by input_a(), input_b(), multiply(), set_a(), and set_b().

◆ m_queue_a

QQueue<Kwave::SampleArray> Kwave::Mul::m_queue_a
private

queue for input A

Definition at line 76 of file Mul.h.

Referenced by input_a(), input_b(), and multiply().

◆ m_queue_b

QQueue<Kwave::SampleArray> Kwave::Mul::m_queue_b
private

queue for input B

Definition at line 79 of file Mul.h.

Referenced by input_a(), input_b(), and multiply().

◆ m_sem_a

QSemaphore Kwave::Mul::m_sem_a
private

semaphore to wait for input on input A

Definition at line 82 of file Mul.h.

Referenced by input_a(), and multiply().

◆ m_sem_b

QSemaphore Kwave::Mul::m_sem_b
private

semaphore to wait for input on input B

Definition at line 85 of file Mul.h.

Referenced by input_b(), and multiply().

◆ m_value_a

float Kwave::Mul::m_value_a
private

if m_a_is_const is set, the value of A

Definition at line 103 of file Mul.h.

Referenced by multiply(), and set_a().

◆ m_value_b

float Kwave::Mul::m_value_b
private

if m_b_is_const is set, the value of B

Definition at line 106 of file Mul.h.

Referenced by multiply(), and set_b().


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