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 
28  {
29  samples.clear();
30  samples.fill(0, static_cast<int>(count));
31  int outputLen = 0;
32 
33  QVector<ISampleProvider *> finishedProviders;
34  for (auto sampleProvider : m_sources)
35  {
36  QVector<float> sourceBuffer;
37 
38  const int len = sampleProvider->readSamples(sourceBuffer, count);
39  for (int n = 0; n < len; n++) { samples[n] += sourceBuffer[n]; }
40 
41  outputLen = qMax(len, outputLen);
42  if (sampleProvider->isFinished()) { finishedProviders.push_back(sampleProvider); }
43  }
44 
45  for (ISampleProvider *sampleProvider : finishedProviders)
46  {
47  sampleProvider->deleteLater();
48  m_sources.removeAll(sampleProvider);
49  }
50 
51  return outputLen;
52  }
53 } // namespace swift::sound::sample_provider
int readSamples(QVector< float > &samples, qint64 count)
Read samples.
void addMixerInput(ISampleProvider *provider)
Add a provider.
Free functions in swift::misc.
QString classNameShort(const QObject *object)
Class name as from QMetaObject::className without namespace.
void push_back(QList< T >::parameter_type value)
void setObjectName(QAnyStringView name)
QString arg(Args &&... args) const const