From efb312b94196826edefa28c9a3bb119c7a9e8a1a 2012-10-15 10:06:28 From: Marek Rosa Date: 2012-10-15 10:06:28 Subject: [PATCH] Added audio input demo --- diff --git a/demos/audio/audio.pro b/demos/audio/audio.pro new file mode 100644 index 0000000..0bd2501 --- /dev/null +++ b/demos/audio/audio.pro @@ -0,0 +1,13 @@ +!include( ../demos.pri ):error( "Couldn't find the demos.pri file!" ) + +QT += multimedia + +TARGET = audio +TEMPLATE = app + +SOURCES += main.cpp\ + widget.cpp \ + xyseriesiodevice.cpp + +HEADERS += widget.h \ + xyseriesiodevice.h diff --git a/demos/audio/lineseriesdevice.cpp b/demos/audio/lineseriesdevice.cpp new file mode 100644 index 0000000..9af3c4d --- /dev/null +++ b/demos/audio/lineseriesdevice.cpp @@ -0,0 +1,6 @@ +#include "lineseriesdevice.h" + +LineSeriesDevice::LineSeriesDevice(QObject *parent) : + QLineSeries(parent) +{ +} diff --git a/demos/audio/lineseriesdevice.h b/demos/audio/lineseriesdevice.h new file mode 100644 index 0000000..3b1b2ad --- /dev/null +++ b/demos/audio/lineseriesdevice.h @@ -0,0 +1,21 @@ +#ifndef LINESERIESDEVICE_H +#define LINESERIESDEVICE_H + +#include +#include + +QTCOMMERCIALCHART_USE_NAMESPACE + +class LineSeriesDevice : public QIODevice, public QLineSeries +{ + Q_OBJECT +public: + explicit LineSeriesDevice(QObject *parent = 0); + +signals: + +public slots: + +; + +#endif // LINESERIESDEVICE_H diff --git a/demos/audio/main.cpp b/demos/audio/main.cpp new file mode 100644 index 0000000..7b1f424 --- /dev/null +++ b/demos/audio/main.cpp @@ -0,0 +1,11 @@ +#include +#include "widget.h" + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + Widget w; + w.show(); + + return a.exec(); +} diff --git a/demos/audio/widget.cpp b/demos/audio/widget.cpp new file mode 100644 index 0000000..1836ddc --- /dev/null +++ b/demos/audio/widget.cpp @@ -0,0 +1,59 @@ +#include "widget.h" +#include +#include +#include +#include +#include +#include +#include +#include "xyseriesiodevice.h" + +QTCOMMERCIALCHART_USE_NAMESPACE + +Widget::Widget(QWidget *parent) + : QWidget(parent), + m_device(0), + m_chart(0), + m_series(0), + m_audioInput(0) +{ + m_chart = new QChart; + QChartView *chartView = new QChartView(m_chart); + chartView->setMinimumSize(800, 600); + m_series = new QLineSeries; + m_chart->addSeries(m_series); + QValueAxis *axisX = new QValueAxis; + axisX->setRange(0, 8000); + QValueAxis *axisY = new QValueAxis; + axisY->setRange(0, 256); + m_chart->setAxisX(axisX, m_series); + m_chart->setAxisY(axisY, m_series); + m_chart->setTitle("Data from microphone"); + + QVBoxLayout *mainLayout = new QVBoxLayout; + mainLayout->addWidget(chartView); + setLayout(mainLayout); + + QAudioFormat formatAudio; + formatAudio.setFrequency(8000); + formatAudio.setChannels(1); + formatAudio.setSampleSize(8); + formatAudio.setCodec("audio/pcm"); + formatAudio.setByteOrder(QAudioFormat::LittleEndian); + formatAudio.setSampleType(QAudioFormat::UnSignedInt); + + QAudioDeviceInfo inputDevices = QAudioDeviceInfo::defaultInputDevice(); + m_audioInput = new QAudioInput(inputDevices,formatAudio, this); + + m_device = new XYSeriesIODevice(m_series, this); + m_device->open(QIODevice::WriteOnly); + + m_audioInput->setBufferSize(10); + m_audioInput->start(m_device); +} + +Widget::~Widget() +{ + m_audioInput->stop(); + m_device->close(); +} diff --git a/demos/audio/widget.h b/demos/audio/widget.h new file mode 100644 index 0000000..c3d9646 --- /dev/null +++ b/demos/audio/widget.h @@ -0,0 +1,32 @@ +#ifndef WIDGET_H +#define WIDGET_H + +#include +#include + +QTCOMMERCIALCHART_BEGIN_NAMESPACE +class QLineSeries; +class QChart; +QTCOMMERCIALCHART_END_NAMESPACE + +QTCOMMERCIALCHART_USE_NAMESPACE + +class XYSeriesIODevice; +class QAudioInput; + +class Widget : public QWidget +{ + Q_OBJECT + +public: + Widget(QWidget *parent = 0); + ~Widget(); + +private: + XYSeriesIODevice *m_device; + QChart *m_chart; + QLineSeries *m_series; + QAudioInput *m_audioInput; +}; + +#endif // WIDGET_H diff --git a/demos/audio/xyseriesiodevice.cpp b/demos/audio/xyseriesiodevice.cpp new file mode 100644 index 0000000..e3bea15 --- /dev/null +++ b/demos/audio/xyseriesiodevice.cpp @@ -0,0 +1,36 @@ +#include "xyseriesiodevice.h" +#include + +XYSeriesIODevice::XYSeriesIODevice(QXYSeries * series, QObject *parent) : + QIODevice(parent), + m_series(series) +{ +} + +qint64 XYSeriesIODevice::readData(char * data, qint64 maxSize) +{ + Q_UNUSED(data) + Q_UNUSED(maxSize) + return -1; +} + +qint64 XYSeriesIODevice::writeData(const char * data, qint64 maxSize) +{ + qint64 range = 8000; + QList oldPoints = m_series->points(); + QList points; + + if (oldPoints.count() < range) { + points = m_series->points(); + } else { + for (int i = maxSize; i < oldPoints.count(); i++) + points.append(QPointF(i - maxSize, oldPoints.at(i).y())); + } + + qint64 size = points.count(); + for (int k = 0; k < maxSize; k++) + points.append(QPointF(k + size, (quint8)data[k])); + + m_series->replace(points); + return maxSize; +} diff --git a/demos/audio/xyseriesiodevice.h b/demos/audio/xyseriesiodevice.h new file mode 100644 index 0000000..a4610fd --- /dev/null +++ b/demos/audio/xyseriesiodevice.h @@ -0,0 +1,27 @@ +#ifndef XYSERIESIODEVICE_H +#define XYSERIESIODEVICE_H + +#include +#include + +QTCOMMERCIALCHART_BEGIN_NAMESPACE +class QXYSeries; +QTCOMMERCIALCHART_END_NAMESPACE + +QTCOMMERCIALCHART_USE_NAMESPACE + +class XYSeriesIODevice : public QIODevice +{ + Q_OBJECT +public: + explicit XYSeriesIODevice(QXYSeries * series, QObject *parent = 0); + +protected: + qint64 readData(char * data, qint64 maxSize); + qint64 writeData(const char * data, qint64 maxSize); + +private: + QXYSeries *m_series; +}; + +#endif // XYSERIESIODEVICE_H diff --git a/demos/demos.pro b/demos/demos.pro index 03355bb..608ae33 100644 --- a/demos/demos.pro +++ b/demos/demos.pro @@ -14,7 +14,8 @@ SUBDIRS += piechartcustomization \ qmlcustommodel \ chartinteractions \ qmlaxes \ - qmlcustomlegend + qmlcustomlegend \ + audio contains(QT_CONFIG, opengl) { SUBDIRS += chartthemes \