diff options
Diffstat (limited to 'examples/audiolevels/main.cpp')
-rw-r--r-- | examples/audiolevels/main.cpp | 166 |
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(); } |