From a71362d9ef7098c1d7869b3768a0990a61474980 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 17 Dec 2021 18:10:12 +0100 Subject: Polish the audiosource example - Use a QWidget instead of a QMainWindow since no QMainWindow functionality is used and the controls are wrongly parented - Change the update signal of AudioInfo to levelChanged(level), removing the need for a lamba - Streamline the code Pick-to: 6.3 Pick-to: 6.2 Change-Id: Ic03a5414ee5da4841532ad23db112d0594f458e5 Reviewed-by: Doris Verria --- examples/multimedia/audiosource/audiosource.cpp | 61 +++++++++++-------------- examples/multimedia/audiosource/audiosource.h | 22 ++++----- examples/multimedia/audiosource/main.cpp | 10 ++-- 3 files changed, 42 insertions(+), 51 deletions(-) (limited to 'examples/multimedia') diff --git a/examples/multimedia/audiosource/audiosource.cpp b/examples/multimedia/audiosource/audiosource.cpp index c2dbb6786..c2b9547b4 100644 --- a/examples/multimedia/audiosource/audiosource.cpp +++ b/examples/multimedia/audiosource/audiosource.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2017 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Toolkit. @@ -76,11 +76,8 @@ void AudioInfo::stop() close(); } -qint64 AudioInfo::readData(char *data, qint64 maxlen) +qint64 AudioInfo::readData(char * /* data */, qint64 /* maxlen */) { - Q_UNUSED(data); - Q_UNUSED(maxlen); - return 0; } @@ -91,7 +88,7 @@ qint64 AudioInfo::writeData(const char *data, qint64 len) const int numSamples = len / sampleBytes; float maxValue = 0; - const unsigned char *ptr = reinterpret_cast(data); + auto *ptr = reinterpret_cast(data); for (int i = 0; i < numSamples; ++i) { for (int j = 0; j < m_format.channelCount(); ++j) { @@ -104,7 +101,8 @@ qint64 AudioInfo::writeData(const char *data, qint64 len) m_level = maxValue; - emit update(); + emit levelChanged(m_level); + return len; } @@ -123,19 +121,15 @@ void RenderArea::paintEvent(QPaintEvent * /* event */) QPainter painter(this); painter.setPen(Qt::black); - painter.drawRect(QRect(painter.viewport().left()+10, - painter.viewport().top()+10, - painter.viewport().right()-20, - painter.viewport().bottom()-20)); + + const QRect frame = painter.viewport() - QMargins(10, 10, 10, 10); + painter.drawRect(frame); if (m_level == 0.0) return; - int pos = ((painter.viewport().right()-20)-(painter.viewport().left()+11))*m_level; - painter.fillRect(painter.viewport().left()+11, - painter.viewport().top()+10, - pos, - painter.viewport().height()-21, - Qt::red); + const int pos = qRound(qreal(frame.width() - 1) * m_level); + painter.fillRect(frame.left() + 1, frame.top() + 1, + pos, frame.height() - 1, Qt::red); } void RenderArea::setLevel(qreal value) @@ -149,27 +143,25 @@ InputTest::InputTest() : m_devices(new QMediaDevices(this)) { initializeWindow(); - initializeAudio(m_devices->defaultAudioInput()); + initializeAudio(QMediaDevices::defaultAudioInput()); } - void InputTest::initializeWindow() { - QWidget *window = new QWidget; - QVBoxLayout *layout = new QVBoxLayout; + QVBoxLayout *layout = new QVBoxLayout(this); m_canvas = new RenderArea(this); layout->addWidget(m_canvas); m_deviceBox = new QComboBox(this); - const QAudioDevice &defaultDeviceInfo = m_devices->defaultAudioInput(); + const QAudioDevice &defaultDeviceInfo = QMediaDevices::defaultAudioInput(); m_deviceBox->addItem(defaultDeviceInfo.description(), QVariant::fromValue(defaultDeviceInfo)); for (auto &deviceInfo: m_devices->audioInputs()) { if (deviceInfo != defaultDeviceInfo) m_deviceBox->addItem(deviceInfo.description(), QVariant::fromValue(deviceInfo)); } - connect(m_deviceBox, QOverload::of(&QComboBox::activated), this, &InputTest::deviceChanged); + connect(m_deviceBox, &QComboBox::activated, this, &InputTest::deviceChanged); layout->addWidget(m_deviceBox); m_volumeSlider = new QSlider(Qt::Horizontal, this); @@ -185,11 +177,6 @@ void InputTest::initializeWindow() m_suspendResumeButton = new QPushButton(this); connect(m_suspendResumeButton, &QPushButton::clicked, this, &InputTest::toggleSuspend); layout->addWidget(m_suspendResumeButton); - - window->setLayout(layout); - - setCentralWidget(window); - window->show(); } void InputTest::initializeAudio(const QAudioDevice &deviceInfo) @@ -200,9 +187,8 @@ void InputTest::initializeAudio(const QAudioDevice &deviceInfo) format.setSampleFormat(QAudioFormat::Int16); m_audioInfo.reset(new AudioInfo(format)); - connect(m_audioInfo.data(), &AudioInfo::update, [this]() { - m_canvas->setLevel(m_audioInfo->level()); - }); + connect(m_audioInfo.data(), &AudioInfo::levelChanged, + m_canvas, &RenderArea::setLevel); m_audioInput.reset(new QAudioSource(deviceInfo, format)); qreal initialVolume = QAudio::convertVolume(m_audioInput->volume(), @@ -218,7 +204,7 @@ void InputTest::toggleMode() m_audioInput->stop(); toggleSuspend(); - // Change bewteen pull and push modes + // Change between pull and push modes if (m_pullMode) { m_modeButton->setText(tr("Enable push mode")); m_audioInput->start(m_audioInfo.data()); @@ -245,14 +231,19 @@ void InputTest::toggleMode() void InputTest::toggleSuspend() { // toggle suspend/resume - if (m_audioInput->state() == QAudio::SuspendedState || m_audioInput->state() == QAudio::StoppedState) { + switch (m_audioInput->state()) { + case QAudio::SuspendedState: + case QAudio::StoppedState: m_audioInput->resume(); m_suspendResumeButton->setText(tr("Suspend recording")); - } else if (m_audioInput->state() == QAudio::ActiveState) { + break; + case QAudio::ActiveState: m_audioInput->suspend(); m_suspendResumeButton->setText(tr("Resume recording")); - } else if (m_audioInput->state() == QAudio::IdleState) { + break; + case QAudio::IdleState: // no-op + break; } } diff --git a/examples/multimedia/audiosource/audiosource.h b/examples/multimedia/audiosource/audiosource.h index c5662a397..7fde1b2cb 100644 --- a/examples/multimedia/audiosource/audiosource.h +++ b/examples/multimedia/audiosource/audiosource.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2017 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Toolkit. @@ -52,16 +52,17 @@ #define AUDIOINPUT_H #include -#include +#include + #include -#include -#include -#include #include #include #include + +#include + +#include #include -#include class AudioInfo : public QIODevice { @@ -78,12 +79,12 @@ public: qint64 readData(char *data, qint64 maxlen) override; qint64 writeData(const char *data, qint64 len) override; +signals: + void levelChanged(qreal level); + private: const QAudioFormat m_format; qreal m_level = 0.0; // 0.0 <= m_level <= 1.0 - -signals: - void update(); }; @@ -101,11 +102,10 @@ protected: private: qreal m_level = 0; - QPixmap m_pixmap; }; -class InputTest : public QMainWindow +class InputTest : public QWidget { Q_OBJECT diff --git a/examples/multimedia/audiosource/main.cpp b/examples/multimedia/audiosource/main.cpp index 1f6ae63a6..e45c2bd67 100644 --- a/examples/multimedia/audiosource/main.cpp +++ b/examples/multimedia/audiosource/main.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2017 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Toolkit. @@ -48,17 +48,17 @@ ** ****************************************************************************/ -#include - #include "audiosource.h" +#include + int main(int argv, char **args) { QApplication app(argv, args); - app.setApplicationName("Audio Source Test"); + QCoreApplication::setApplicationName("Audio Source Test"); InputTest input; input.show(); - return app.exec(); + return QCoreApplication::exec(); } -- cgit v1.2.3