swift
resourcesoundsampleprovider.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 "resourcesoundsampleprovider.h"
5 
6 #include <QDebug>
7 
8 #include "misc/metadatautils.h"
9 
10 using namespace swift::misc;
11 
12 namespace swift::sound::sample_provider
13 {
14  CResourceSoundSampleProvider::CResourceSoundSampleProvider(const CResourceSound &resourceSound, QObject *parent)
15  : ISampleProvider(parent), m_resourceSound(resourceSound)
16  {
17  const QString on = QStringLiteral("%1 %2").arg(classNameShort(this), resourceSound.getFileName());
18  this->setObjectName(on);
19  m_tempBuffer.resize(m_tempBufferSize);
20  }
21 
22  int CResourceSoundSampleProvider::readSamples(QVector<float> &samples, qint64 count)
23  {
24  if (!m_resourceSound.isLoaded()) { return 0; }
25  if (count > m_tempBufferSize)
26  {
27  qDebug() << "Count too large for temp buffer" << count;
28  return 0;
29  }
30  const qint64 availableSamples = m_resourceSound.audioData().size() - m_position;
31  const qint64 samplesToCopy = qMin(availableSamples, count);
32  samples.clear();
33  samples.fill(0, static_cast<int>(samplesToCopy));
34 
35  for (int i = 0; i < samplesToCopy; i++)
36  {
37  m_tempBuffer[i] = m_resourceSound.audioData().at(static_cast<int>(m_position) + i);
38  }
39 
40  if (!qFuzzyCompare(m_gain, 1.0))
41  {
42  for (int i = 0; i < samplesToCopy; i++) { m_tempBuffer[i] = static_cast<float>(m_gain * m_tempBuffer[i]); }
43  }
44 
45  for (int i = 0; i < samplesToCopy; i++) { samples[i] = m_tempBuffer.at(i); }
46 
47  m_position += samplesToCopy;
48 
49  if (m_position > availableSamples - 1)
50  {
51  if (m_looping) { m_position = 0; }
52  else { m_isFinished = true; }
53  }
54 
55  return static_cast<int>(samplesToCopy);
56  }
57 } // namespace swift::sound::sample_provider
bool isLoaded()
Is resource already loaded?
Definition: resourcesound.h:43
const QString & getFileName() const
Corresponding file.
const QVector< float > & audioData() const
Audio data.
Definition: resourcesound.h:46
virtual int readSamples(QVector< float > &samples, qint64 count)
copydoc ISampleProvider::readSamples
Free functions in swift::misc.
QString classNameShort(const QObject *object)
Class name as from QMetaObject::className without namespace.