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>
This commit is contained in:
Tomi Korpipää 2013-09-03 09:03:37 +03:00
parent de88514dba
commit 12f78f8ed9
69 changed files with 224 additions and 4 deletions

View File

@ -0,0 +1,11 @@
!include( ../examples.pri ) {
error( "Couldn't find the examples.pri file!" )
}
TARGET = audiolevels
QT += multimedia
SOURCES += main.cpp
INSTALLS += target

View File

@ -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();
}

View File

@ -2,11 +2,11 @@ TEMPLATE = subdirs
SUBDIRS += barchart \ SUBDIRS += barchart \
rainfall \ rainfall \
widget \ widget \
mapdata \ #mapdata \
qmlbarchart \ qmlbarchart \
#qmlmaps \ #qmlmaps \
qmlscatter \ qmlscatter \
surfacechart \ surfacechart \
scatterchart scatterchart
qtHaveModule(multimedia):!android: SUBDIRS += spectrum qtHaveModule(multimedia):!android: SUBDIRS += audiolevels

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

View File

@ -1,4 +1,7 @@
qtHaveModule(multimedia) { qtHaveModule(multimedia) {
!include( ../tests.pri ) {
error( "Couldn't find the tests.pri file!" )
}
include(spectrum.pri) include(spectrum.pri)
TEMPLATE = subdirs TEMPLATE = subdirs

View File

@ -81,6 +81,12 @@ Engine::Engine(QObject *parent)
SLOT(spectrumChanged(FrequencySpectrum))); SLOT(spectrumChanged(FrequencySpectrum)));
initialize(); initialize();
qDebug() << "output devices:";
foreach (QAudioDeviceInfo device, m_availableAudioOutputDevices)
qDebug() << device.deviceName();
qDebug() << "input devices:";
foreach (QAudioDeviceInfo device, m_availableAudioInputDevices)
qDebug() << device.deviceName();
} }
Engine::~Engine() Engine::~Engine()

View File

@ -1,5 +1,5 @@
!include( ../../examples.pri ) { !include( ../../tests.pri ) {
error( "Couldn't find the examples.pri file!" ) error( "Couldn't find the tests.pri file!" )
} }
!include( ../spectrum.pri ) { !include( ../spectrum.pri ) {

View File

@ -9,3 +9,5 @@ TEMPLATE = subdirs
SUBDIRS += barstest \ SUBDIRS += barstest \
scattertest scattertest
qtHaveModule(multimedia):!android: SUBDIRS += spectrum