swift
mixingsampleprovider.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2019 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
4 #include "mixingsampleprovider.h"
5 
6 #include "misc/metadatautils.h"
7 
8 using namespace swift::misc;
9 
10 namespace swift::sound::sample_provider
11 {
12  CMixingSampleProvider::CMixingSampleProvider(QObject *parent) : ISampleProvider(parent)
13  {
14  const QString on = QStringLiteral("%1").arg(classNameShort(this));
15  this->setObjectName(on);
16  }
17 
19  {
20  Q_ASSERT(provider);
21  m_sources.append(provider);
22 
23  const QString on = QStringLiteral("%1 sources: %2").arg(classNameShort(this)).arg(m_sources.size());
24  this->setObjectName(on);
25  }
26 
27  int CMixingSampleProvider::readSamples(QVector<float> &samples, qint64 count)
28  {
29  samples.clear();
30  samples.fill(0, static_cast<int>(count));
31  int outputLen = 0;
32 
33  QVector<ISampleProvider *> finishedProviders;
34  for (int i = 0; i < m_sources.size(); i++)
35  {
36  ISampleProvider *sampleProvider = m_sources.at(i);
37  QVector<float> sourceBuffer;
38 
39  const int len = sampleProvider->readSamples(sourceBuffer, count);
40  for (int n = 0; n < len; n++) { samples[n] += sourceBuffer[n]; }
41 
42  outputLen = qMax(len, outputLen);
43  if (sampleProvider->isFinished()) { finishedProviders.push_back(sampleProvider); }
44  }
45 
46  for (ISampleProvider *sampleProvider : finishedProviders)
47  {
48  sampleProvider->deleteLater();
49  m_sources.removeAll(sampleProvider);
50  }
51 
52  return outputLen;
53  }
54 } // namespace swift::sound::sample_provider
virtual int readSamples(QVector< float > &samples, qint64 count)
Read samples.
void addMixerInput(ISampleProvider *provider)
Add a provider.
virtual bool isFinished() const
Finished?
virtual int readSamples(QVector< float > &samples, qint64 count)=0
Read samples.
Free functions in swift::misc.
QString classNameShort(const QObject *object)
Class name as from QMetaObject::className without namespace.