diff options
author | Tomi Korpipää <tomi.korpipaa@digia.com> | 2013-09-03 09:03:37 +0300 |
---|---|---|
committer | Tomi Korpipää <tomi.korpipaa@digia.com> | 2013-09-03 09:07:54 +0300 |
commit | 12f78f8ed991d816411b1ba6718a34e8e26e2eb8 (patch) | |
tree | ccd0e9d4ea0853d1a458494bcf0dd1b33a3c9c74 /examples/audiolevels | |
parent | de88514dba523734170652d75a5cefcc7feb7c6c (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.pro | 11 | ||||
-rw-r--r-- | examples/audiolevels/doc/src/audiolevels.qdoc | 28 | ||||
-rw-r--r-- | examples/audiolevels/main.cpp | 198 |
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(); +} |