22 #include <QMetaObject> 23 #include <QMutexLocker> 25 #include <QVarLengthArray> 58 for (
unsigned int index = 0; index <
m_outputs; ++index) {
62 if (!out_buffer)
return false;
67 for (
unsigned int index = 0; index <
m_inputs; ++index) {
70 if (!indexer)
return false;
77 if (!ok)
return false;
94 QMutexLocker _lock(&
m_lock);
98 if (indexer)
delete indexer;
106 if (buffer)
delete buffer;
112 static inline QByteArray
_sig(
const char *sig)
114 return QMetaObject::normalizedSignature(sig);
120 unsigned int retval = 0;
121 QMutexLocker _lock(const_cast<QMutex *>(&
m_lock));
129 }
else if (
_sig(port) ==
133 qFatal(
"unknown port");
144 QMutexLocker _lock(&
m_lock);
156 }
else if (
_sig(port) ==
160 qFatal(
"unknown port");
169 QMutexLocker _lock(&
m_lock);
179 foreach (
const QQueue<Kwave::SampleArray> &queue,
m_input_queue) {
180 if (queue.isEmpty()) {
197 QVector<Kwave::SampleArray> v_input(
m_inputs);
199 unsigned int min_len = UINT_MAX;
200 for (
unsigned int track = 0; track <
m_inputs; track++) {
203 Q_ASSERT(!queue.isEmpty());
205 v_input[track] = buffer;
209 input[track] = raw_data;
212 min_len = qMin(min_len, buffer.size());
215 if (!min_len)
return;
220 for (
unsigned int track = 0; track <
m_outputs; track++) {
228 qWarning(
"ChannelMixer: failed to increase buffer size to %u",
232 output[track] = buffer->
data().
data();
236 for (
unsigned int y = 0; y <
m_outputs; y++) {
238 for (
unsigned int pos = 0; pos < min_len; pos++) {
240 for (
unsigned int x = 0; x <
m_inputs; x++) {
241 const double f = (*m_matrix)[x][y];
242 const double i =
static_cast<double>(input[x][pos]);
245 out[pos] =
static_cast<sample_t>(sum);
virtual Kwave::SampleArray & data()
virtual ~ChannelMixer() Q_DECL_OVERRIDE
virtual Kwave::StreamObject * port(const char *port, unsigned int track) Q_DECL_OVERRIDE
Kwave::MixerMatrix * m_matrix
virtual const Kwave::SampleArray & constData() const
bool connect(Kwave::StreamObject &source, const char *output, Kwave::StreamObject &sink, const char *input)
void output(Kwave::SampleArray data)
QVector< QPointer< Kwave::StreamObject > > m_indexer
virtual unsigned int tracksOfPort(const char *port) const Q_DECL_OVERRIDE
ChannelMixer(unsigned int inputs, unsigned int outputs)
const sample_t * constData() const
void idxInput(unsigned int index, Kwave::SampleArray data)
static QByteArray _sig(const char *sig)
unsigned int size() const
void input(Kwave::SampleArray data)
QVector< QPointer< Kwave::SampleBuffer > > m_output_buffer
bool resize(unsigned int size) Q_REQUIRED_RESULT
QVector< QQueue< Kwave::SampleArray > > m_input_queue