summaryrefslogtreecommitdiffstats
path: root/examples/audiolevels
diff options
context:
space:
mode:
authorTomi Korpipää <tomi.korpipaa@digia.com>2013-09-03 09:03:37 +0300
committerTomi Korpipää <tomi.korpipaa@digia.com>2013-09-03 09:07:54 +0300
commit12f78f8ed991d816411b1ba6718a34e8e26e2eb8 (patch)
treeccd0e9d4ea0853d1a458494bcf0dd1b33a3c9c74 /examples/audiolevels
parentde88514dba523734170652d75a5cefcc7feb7c6c (diff)
Fixed issues from Improve examples task
Task-number: QTRD-2239 + Moved spectrum to tests + Added audiolevels to examples (implementation pending..) Change-Id: If20ce3014211a82dbe0142557beee5776cf51708 Change-Id: If20ce3014211a82dbe0142557beee5776cf51708 Reviewed-by: Mika Salmela <mika.salmela@digia.com>
Diffstat (limited to 'examples/audiolevels')
-rw-r--r--examples/audiolevels/audiolevels.pro11
-rw-r--r--examples/audiolevels/doc/src/audiolevels.qdoc28
-rw-r--r--examples/audiolevels/main.cpp198
3 files changed, 237 insertions, 0 deletions
diff --git a/examples/audiolevels/audiolevels.pro b/examples/audiolevels/audiolevels.pro
new file mode 100644
index 00000000..8a75e6f3
--- /dev/null
+++ b/examples/audiolevels/audiolevels.pro
@@ -0,0 +1,11 @@
+!include( ../examples.pri ) {
+ error( "Couldn't find the examples.pri file!" )
+}
+
+TARGET = audiolevels
+
+QT += multimedia
+
+SOURCES += main.cpp
+
+INSTALLS += target
diff --git a/examples/audiolevels/doc/src/audiolevels.qdoc b/examples/audiolevels/doc/src/audiolevels.qdoc
new file mode 100644
index 00000000..612c31cd
--- /dev/null
+++ b/examples/audiolevels/doc/src/audiolevels.qdoc
@@ -0,0 +1,28 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVis3D module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+/*!
+ \example spectrum
+ \title Spectrum Example
+
+ The spectrum example shows how feed dynamic data to a graph using Q3DBars.
+
+ \image spectrum-example.png
+
+ TODO
+*/
diff --git a/examples/audiolevels/main.cpp b/examples/audiolevels/main.cpp
new file mode 100644
index 00000000..c31b35cc
--- /dev/null
+++ b/examples/audiolevels/main.cpp
@@ -0,0 +1,198 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVis3D module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+#include <QtDataVis3D/q3dbars.h>
+#include <QtDataVis3D/qbardataproxy.h>
+#include <QtDataVis3D/qvalueaxis.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.show();
+
+// AudioLevels *AudioLevels = new AudioLevels(&window);
+// AudioLevels->start(QStringLiteral(":/file2"));
+
+ return app.exec();
+}