summaryrefslogtreecommitdiffstats
path: root/tests/manual/spectrum/spectrumapp/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/manual/spectrum/spectrumapp/main.cpp')
-rw-r--r--tests/manual/spectrum/spectrumapp/main.cpp212
1 files changed, 212 insertions, 0 deletions
diff --git a/tests/manual/spectrum/spectrumapp/main.cpp b/tests/manual/spectrum/spectrumapp/main.cpp
new file mode 100644
index 00000000..e9548b4e
--- /dev/null
+++ b/tests/manual/spectrum/spectrumapp/main.cpp
@@ -0,0 +1,212 @@
+/******************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Data Visualization module.
+**
+** $QT_BEGIN_LICENSE:COMM$
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** $QT_END_LICENSE$
+**
+******************************************************************************/
+
+#include "engine.h"
+#include "utils.h"
+
+#include <QtDataVisualization/q3dbars.h>
+#include <QtDataVisualization/qbardataproxy.h>
+#include <QtDataVisualization/qvalue3daxis.h>
+#include <QtDataVisualization/qcategory3daxis.h>
+#include <QtDataVisualization/q3dscene.h>
+#include <QtDataVisualization/q3dcamera.h>
+#include <QtDataVisualization/qbar3dseries.h>
+#include <QtDataVisualization/q3dtheme.h>
+
+#include <QGuiApplication>
+#include <QAudio>
+#include <QTimer>
+
+//#define USE_CONES
+
+using namespace QtDataVisualization;
+
+class MainApp : public QObject
+{
+public:
+ MainApp(Q3DBars *window);
+ ~MainApp();
+
+ 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;
+};
+
+MainApp::MainApp(Q3DBars *window)
+ : m_chart(window),
+ m_engine(new Engine(this)),
+ m_restartTimer(new QTimer(this)),
+ m_lowFreq(SpectrumLowFreq),
+ m_highFreq(SpectrumHighFreq)
+{
+ m_chart->rowAxis()->setMax(SpectrumNumBands * 2);
+ m_chart->columnAxis()->setMax(SpectrumNumBands - 1);
+ // Disable grid
+ m_chart->activeTheme()->setGridEnabled(false);
+ // Disable auto-scaling of height by defining explicit range
+ m_chart->valueAxis()->setRange(0.0f, 1.0f);
+ // Disable shadows
+ m_chart->setShadowQuality(QAbstract3DGraph::ShadowQualityNone);
+#if USE_CONES
+ // Set bar specifications; make them a bit wider than deep and make them be drawn 75%
+ // inside each other
+ m_chart->setBarThickness(1.25);
+ m_chart->setBarSpacing(QSizeF(0.2, -0.75));
+ // Set bar type, smooth cones
+ m_chart->setBarType(QAbstract3DGraph::MeshCones, true);
+ // Adjust zoom manually; automatic zoom level calculation does not work well with negative
+ // spacings (in setBarSpacing)
+ m_chart->setCameraPosition(10.0f, 5.0f, 70.0f);
+#else
+ // Set bar specifications; make them twice as wide as they're deep
+ m_chart->setBarThickness(2.0f);
+ m_chart->setBarSpacing(QSizeF(0.0, 0.0));
+ // Set bar type, flat bars
+ // Adjust camera position
+ m_chart->scene()->activeCamera()->setCameraPosition(10.0f, 7.5f, 75.0f);
+#endif
+ // Disable selection
+ m_chart->setSelectionMode(QAbstract3DGraph::SelectionNone);
+ QObject::connect(m_engine, &Engine::changedSpectrum, this, &MainApp::spectrumChanged);
+ QObject::connect(m_engine, &Engine::stateChanged, this, &MainApp::stateChanged);
+ m_restartTimer->setSingleShot(true);
+ QObject::connect(m_restartTimer, &QTimer::timeout, this, &MainApp::restart);
+
+ QBar3DSeries *series = new QBar3DSeries();
+ series->setBaseColor(QColor(Qt::red));
+ series->setMesh(QAbstract3DSeries::MeshBar);
+ m_chart->addSeries(series);
+}
+
+MainApp::~MainApp()
+{
+ delete m_engine;
+ delete m_restartTimer;
+}
+
+void MainApp::start(QString fileName)
+{
+ m_engine->loadFile(fileName);
+ m_engine->startPlayback();
+}
+
+//-----------------------------------------------------------------------------
+// Public slots
+//-----------------------------------------------------------------------------
+
+void MainApp::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(), float(e.amplitude)));
+ }
+ }
+ m_chart->seriesList().at(0)->dataProxy()->insertRow(0, data);
+}
+
+void MainApp::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 MainApp::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 MainApp::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;
+}
+
+//-----------------------------------------------------------------------------
+// main
+//-----------------------------------------------------------------------------
+int main(int argc, char *argv[])
+{
+ QGuiApplication app(argc, argv);
+ app.setApplicationName("QtDataVisualization spectrum analyzer");
+
+ Q3DBars window;
+ window.setFlags(window.flags() ^ Qt::FramelessWindowHint);
+ window.resize(1024, 768);
+ window.show();
+
+ MainApp *mainApp = new MainApp(&window);
+ mainApp->start(QStringLiteral(":/file2"));
+
+ return app.exec();
+}