summaryrefslogtreecommitdiffstats
path: root/examples/audiolevels/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/audiolevels/main.cpp')
-rw-r--r--examples/audiolevels/main.cpp166
1 files changed, 3 insertions, 163 deletions
diff --git a/examples/audiolevels/main.cpp b/examples/audiolevels/main.cpp
index c31b35cc..2b8556e1 100644
--- a/examples/audiolevels/main.cpp
+++ b/examples/audiolevels/main.cpp
@@ -16,183 +16,23 @@
**
****************************************************************************/
-#include <QtDataVis3D/q3dbars.h>
-#include <QtDataVis3D/qbardataproxy.h>
-#include <QtDataVis3D/qvalueaxis.h>
+#include "audiolevels.h"
#include <QGuiApplication>
#include <QAudio>
-#include <QTimer>
-
-//#define USE_CONES
using namespace QtDataVis3D;
-#if 0
-class AudioLevels : public QObject
-{
-public:
- AudioLevels(Q3DBars *window);
- ~AudioLevels();
-
- void start(QString fileName);
-
-public slots:
- void spectrumChanged(qint64 position, qint64 length, const FrequencySpectrum &spectrum);
- void stateChanged(QAudio::Mode mode, QAudio::State state);
-
-private slots:
- void restart();
-
-private:
- int barIndex(qreal frequency) const;
-
-private:
- Q3DBars *m_chart;
- Engine *m_engine;
- QTimer *m_restartTimer;
- // Lower bound of first band in the spectrum in Hz
- qreal m_lowFreq;
- // Upper band of last band in the spectrum in Hz
- qreal m_highFreq;
-};
-
-AudioLevels::AudioLevels(Q3DBars *window)
- : m_chart(window),
- m_engine(new Engine(this)),
- m_restartTimer(new QTimer(this)),
- m_lowFreq(SpectrumLowFreq),
- m_highFreq(SpectrumHighFreq)
-{
- m_chart->setDataWindow(SpectrumNumBands * 2, SpectrumNumBands);
- // Disable grid
- m_chart->setGridVisible(false);
- // Disable auto-scaling of height by defining explicit range
- m_chart->valueAxis()->setRange(0.0, 1.0);
- // Disable shadows
- m_chart->setShadowQuality(QDataVis::ShadowNone);
-#if USE_CONES
- // Set bar specifications; make them a bit wider than deep and make them be drawn 75%
- // inside each other
- m_chart->setBarSpecs(1.25), QSizeF(0.2, -0.75));
- // Set bar type, smooth cones
- m_chart->setBarType(QDataVis::Cones, true);
- // Adjust zoom manually; automatic zoom level calculation does not work well with negative
- // spacings (in setBarSpecs)
- m_chart->setCameraPosition(10.0f, 5.0f, 70);
-#else
- // Set bar specifications; make them twice as wide as they're deep
- m_chart->setBarSpecs(2.0, QSizeF(0.0, 0.0));
- // Set bar type, flat bars
- m_chart->setBarType(QDataVis::Bars, false);
- // Adjust camera position
- m_chart->setCameraPosition(10.0f, 7.5f, 75);
-#endif
- // Set color scheme
- m_chart->setBarColor(QColor(Qt::black), QColor(Qt::red), QColor(Qt::darkYellow));
- // Disable selection
- m_chart->setSelectionMode(QDataVis::ModeNone);
- QObject::connect(m_engine, &Engine::changedSpectrum, this, &AudioLevels::spectrumChanged);
- QObject::connect(m_engine, &Engine::stateChanged, this, &AudioLevels::stateChanged);
- m_restartTimer->setSingleShot(true);
- QObject::connect(m_restartTimer, &QTimer::timeout, this, &AudioLevels::restart);
-
- QBarDataProxy *proxy = new QBarDataProxy;
- m_chart->setActiveDataProxy(proxy);
-}
-
-AudioLevels::~AudioLevels()
-{
- delete m_engine;
- delete m_restartTimer;
-}
-void AudioLevels::start(QString fileName)
-{
- m_engine->loadFile(fileName);
- m_engine->startPlayback();
-}
-
-//-----------------------------------------------------------------------------
-// Public slots
-//-----------------------------------------------------------------------------
-
-void AudioLevels::spectrumChanged(qint64 position, qint64 length, const FrequencySpectrum &spectrum)
-{
- Q_UNUSED(position);
- Q_UNUSED(length);
- //qDebug() << "updating bar values" << position << length;
- QBarDataRow *data = new QBarDataRow(SpectrumNumBands);
- for (int bar = 0; bar < SpectrumNumBands; bar++) {
- // init data set
- (*data)[bar].setValue(qreal(0.0));
- }
- FrequencySpectrum::const_iterator i = spectrum.begin();
- const FrequencySpectrum::const_iterator end = spectrum.end();
- for ( ; i != end; ++i) {
- const FrequencySpectrum::Element e = *i;
- if (e.frequency >= m_lowFreq && e.frequency < m_highFreq) {
- (*data)[barIndex(e.frequency)].setValue(qMax(data->at(barIndex(e.frequency)).value(), qreal(e.amplitude)));
- }
- }
- static_cast<QBarDataProxy *>(m_chart->activeDataProxy())->insertRow(0, data);
-}
-
-void AudioLevels::stateChanged(QAudio::Mode mode, QAudio::State state)
-{
- //qDebug() << "mode:" << mode << " state: " << state;
- // Restart once playback is finished
- if (QAudio::AudioOutput == mode && QAudio::StoppedState == state)
- m_restartTimer->start(500);
-}
-
-//-----------------------------------------------------------------------------
-// Private slots
-//-----------------------------------------------------------------------------
-
-void AudioLevels::restart()
-{
- // Change file each time
- QString fileToLoad = QStringLiteral(":/file");
- static int fileNo = 3;
- QString nrStr;
- nrStr.setNum(fileNo);
- fileToLoad.append(nrStr);
- //qDebug() << fileToLoad;
- start(fileToLoad);
- fileNo++;
- if (fileNo > 3)
- fileNo = 1;
-}
-
-//-----------------------------------------------------------------------------
-// Private functions
-//-----------------------------------------------------------------------------
-
-int AudioLevels::barIndex(qreal frequency) const
-{
- Q_ASSERT(frequency >= m_lowFreq && frequency < m_highFreq);
- const qreal bandWidth = (m_highFreq - m_lowFreq) / SpectrumNumBands;
- const int index = (frequency - m_lowFreq) / bandWidth;
- if (index < 0 || index >= SpectrumNumBands)
- Q_ASSERT(false);
- //qDebug() << "insert to" << index;
- return index;
-}
-#endif
-//-----------------------------------------------------------------------------
-// main
-//-----------------------------------------------------------------------------
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
- app.setApplicationName("QtDataVis3D spectrum analyzer");
Q3DBars window;
window.resize(1024, 768);
+ window.setTitle("QtDataVis3D microphone audio levels visualizer");
window.show();
-// AudioLevels *AudioLevels = new AudioLevels(&window);
-// AudioLevels->start(QStringLiteral(":/file2"));
+ AudioLevels audioLevels(&window);
return app.exec();
}