diff options
Diffstat (limited to 'examples/multimedia/audiodevices/audiodevices.cpp')
-rw-r--r-- | examples/multimedia/audiodevices/audiodevices.cpp | 348 |
1 files changed, 124 insertions, 224 deletions
diff --git a/examples/multimedia/audiodevices/audiodevices.cpp b/examples/multimedia/audiodevices/audiodevices.cpp index 52ff2176a..d211189fd 100644 --- a/examples/multimedia/audiodevices/audiodevices.cpp +++ b/examples/multimedia/audiodevices/audiodevices.cpp @@ -1,113 +1,86 @@ -/**************************************************************************** -** -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #include "audiodevices.h" +#include <QCameraDevice> +#include <QMediaDevices> +#include <QMediaFormat> + +#if QT_CONFIG(permissions) + #include <QPermission> +#endif + // Utility functions for converting QAudioFormat fields into text -static QString toString(QAudioFormat::SampleType sampleType) +static QString toString(QAudioFormat::SampleFormat sampleFormat) { - QString result("Unknown"); - switch (sampleType) { - case QAudioFormat::SignedInt: - result = "SignedInt"; - break; - case QAudioFormat::UnSignedInt: - result = "UnSignedInt"; - break; + switch (sampleFormat) { + case QAudioFormat::UInt8: + return "Unsigned 8 bit"; + case QAudioFormat::Int16: + return "Signed 16 bit"; + case QAudioFormat::Int32: + return "Signed 32 bit"; case QAudioFormat::Float: - result = "Float"; - break; - case QAudioFormat::Unknown: - result = "Unknown"; + return "Float"; + default: + return "Unknown"; } - return result; } -static QString toString(QAudioFormat::Endian endian) +AudioDevicesBase::AudioDevicesBase(QWidget *parent) : QMainWindow(parent) { - QString result("Unknown"); - switch (endian) { - case QAudioFormat::LittleEndian: - result = "LittleEndian"; - break; - case QAudioFormat::BigEndian: - result = "BigEndian"; - break; - } - return result; + setupUi(this); } +AudioDevicesBase::~AudioDevicesBase() = default; -AudioDevicesBase::AudioDevicesBase(QWidget *parent) - : QMainWindow(parent) +AudioTest::AudioTest(QWidget *parent) : AudioDevicesBase(parent), m_devices(new QMediaDevices(this)) { - setupUi(this); + init(); } -AudioDevicesBase::~AudioDevicesBase() {} - - -AudioTest::AudioTest(QWidget *parent) - : AudioDevicesBase(parent) +void AudioTest::init() { +#if QT_CONFIG(permissions) + // camera + QCameraPermission cameraPermission; + switch (qApp->checkPermission(cameraPermission)) { + case Qt::PermissionStatus::Undetermined: + qApp->requestPermission(cameraPermission, this, &AudioTest::init); + return; + case Qt::PermissionStatus::Denied: + qWarning("Camera permission is not granted!"); + return; + case Qt::PermissionStatus::Granted: + break; + } + // microphone + QMicrophonePermission microphonePermission; + switch (qApp->checkPermission(microphonePermission)) { + case Qt::PermissionStatus::Undetermined: + qApp->requestPermission(microphonePermission, this, &AudioTest::init); + return; + case Qt::PermissionStatus::Denied: + qWarning("Microphone permission is not granted!"); + return; + case Qt::PermissionStatus::Granted: + break; + } +#endif + m_devices->videoInputs(); + QMediaFormat().supportedFileFormats(QMediaFormat::Encode); connect(testButton, &QPushButton::clicked, this, &AudioTest::test); connect(modeBox, QOverload<int>::of(&QComboBox::activated), this, &AudioTest::modeChanged); connect(deviceBox, QOverload<int>::of(&QComboBox::activated), this, &AudioTest::deviceChanged); - connect(sampleRateBox, QOverload<int>::of(&QComboBox::activated), this, &AudioTest::sampleRateChanged); - connect(channelsBox, QOverload<int>::of(&QComboBox::activated), this, &AudioTest::channelChanged); - connect(codecsBox, QOverload<int>::of(&QComboBox::activated), this, &AudioTest::codecChanged); - connect(sampleSizesBox, QOverload<int>::of(&QComboBox::activated), this, &AudioTest::sampleSizeChanged); - connect(sampleTypesBox, QOverload<int>::of(&QComboBox::activated), this, &AudioTest::sampleTypeChanged); - connect(endianBox, QOverload<int>::of(&QComboBox::activated), this, &AudioTest::endianChanged); + connect(sampleRateSpinBox, &QSpinBox::valueChanged, this, &AudioTest::sampleRateChanged); + connect(channelsSpinBox, &QSpinBox::valueChanged, this, &AudioTest::channelChanged); + connect(sampleFormatBox, QOverload<int>::of(&QComboBox::activated), this, + &AudioTest::sampleFormatChanged); connect(populateTableButton, &QPushButton::clicked, this, &AudioTest::populateTable); + connect(m_devices, &QMediaDevices::audioInputsChanged, this, &AudioTest::updateAudioDevices); + connect(m_devices, &QMediaDevices::audioOutputsChanged, this, &AudioTest::updateAudioDevices); modeBox->setCurrentIndex(0); modeChanged(0); @@ -125,33 +98,32 @@ void AudioTest::test() testResult->setText(tr("Success")); nearestSampleRate->setText(""); nearestChannel->setText(""); - nearestCodec->setText(""); - nearestSampleSize->setText(""); - nearestSampleType->setText(""); - nearestEndian->setText(""); + nearestSampleFormat->setText(""); } else { - QAudioFormat nearest = m_deviceInfo.nearestFormat(m_settings); + QAudioFormat nearest = m_deviceInfo.preferredFormat(); testResult->setText(tr("Failed")); - nearestSampleRate->setText(QString("%1").arg(nearest.sampleRate())); - nearestChannel->setText(QString("%1").arg(nearest.channelCount())); - nearestCodec->setText(nearest.codec()); - nearestSampleSize->setText(QString("%1").arg(nearest.sampleSize())); - nearestSampleType->setText(toString(nearest.sampleType())); - nearestEndian->setText(toString(nearest.byteOrder())); + nearestSampleRate->setText(QStringLiteral("%1").arg(nearest.sampleRate())); + nearestChannel->setText(QStringLiteral("%1").arg(nearest.channelCount())); + nearestSampleFormat->setText(toString(nearest.sampleFormat())); } - } - else + } else testResult->setText(tr("No Device")); } -void AudioTest::modeChanged(int idx) +void AudioTest::updateAudioDevices() { - testResult->clear(); deviceBox->clear(); - const QAudio::Mode mode = idx == 0 ? QAudio::AudioInput : QAudio::AudioOutput; - for (auto &deviceInfo: QAudioDeviceInfo::availableDevices(mode)) - deviceBox->addItem(deviceInfo.deviceName(), QVariant::fromValue(deviceInfo)); + const auto devices = + m_mode == QAudioDevice::Input ? m_devices->audioInputs() : m_devices->audioOutputs(); + for (auto &deviceInfo : devices) + deviceBox->addItem(deviceInfo.description(), QVariant::fromValue(deviceInfo)); +} +void AudioTest::modeChanged(int idx) +{ + testResult->clear(); + m_mode = idx == 0 ? QAudioDevice::Input : QAudioDevice::Output; + updateAudioDevices(); deviceBox->setCurrentIndex(0); deviceChanged(0); } @@ -164,52 +136,29 @@ void AudioTest::deviceChanged(int idx) return; // device has changed - m_deviceInfo = deviceBox->itemData(idx).value<QAudioDeviceInfo>(); - - sampleRateBox->clear(); - QList<int> sampleRatez = m_deviceInfo.supportedSampleRates(); - for (int i = 0; i < sampleRatez.size(); ++i) - sampleRateBox->addItem(QString("%1").arg(sampleRatez.at(i))); - if (sampleRatez.size()) - m_settings.setSampleRate(sampleRatez.at(0)); - - channelsBox->clear(); - QList<int> chz = m_deviceInfo.supportedChannelCounts(); - for (int i = 0; i < chz.size(); ++i) - channelsBox->addItem(QString("%1").arg(chz.at(i))); - if (chz.size()) - m_settings.setChannelCount(chz.at(0)); - - codecsBox->clear(); - QStringList codecs = m_deviceInfo.supportedCodecs(); - for (int i = 0; i < codecs.size(); ++i) - codecsBox->addItem(QString("%1").arg(codecs.at(i))); - if (codecs.size()) - m_settings.setCodec(codecs.at(0)); - // Add false to create failed condition! - codecsBox->addItem("audio/test"); - - sampleSizesBox->clear(); - QList<int> sampleSizez = m_deviceInfo.supportedSampleSizes(); - for (int i = 0; i < sampleSizez.size(); ++i) - sampleSizesBox->addItem(QString("%1").arg(sampleSizez.at(i))); - if (sampleSizez.size()) - m_settings.setSampleSize(sampleSizez.at(0)); - - sampleTypesBox->clear(); - QList<QAudioFormat::SampleType> sampleTypez = m_deviceInfo.supportedSampleTypes(); - - for (int i = 0; i < sampleTypez.size(); ++i) - sampleTypesBox->addItem(toString(sampleTypez.at(i))); - if (sampleTypez.size()) - m_settings.setSampleType(sampleTypez.at(0)); - - endianBox->clear(); - QList<QAudioFormat::Endian> endianz = m_deviceInfo.supportedByteOrders(); - for (int i = 0; i < endianz.size(); ++i) - endianBox->addItem(toString(endianz.at(i))); - if (endianz.size()) - m_settings.setByteOrder(endianz.at(0)); + m_deviceInfo = deviceBox->itemData(idx).value<QAudioDevice>(); + + sampleRateSpinBox->clear(); + sampleRateSpinBox->setMinimum(m_deviceInfo.minimumSampleRate()); + sampleRateSpinBox->setMaximum(m_deviceInfo.maximumSampleRate()); + int sampleValue = + qBound(m_deviceInfo.minimumSampleRate(), 48000, m_deviceInfo.maximumSampleRate()); + sampleRateSpinBox->setValue(sampleValue); + m_settings.setSampleRate(sampleValue); + + channelsSpinBox->clear(); + channelsSpinBox->setMinimum(m_deviceInfo.minimumChannelCount()); + channelsSpinBox->setMaximum(m_deviceInfo.maximumChannelCount()); + int channelValue = + qBound(m_deviceInfo.minimumChannelCount(), 2, m_deviceInfo.maximumChannelCount()); + channelsSpinBox->setValue(channelValue); + + sampleFormatBox->clear(); + const QList<QAudioFormat::SampleFormat> sampleFormats = m_deviceInfo.supportedSampleFormats(); + for (auto sampleFormat : sampleFormats) + sampleFormatBox->addItem(toString(sampleFormat)); + if (sampleFormats.size()) + m_settings.setSampleFormat(sampleFormats.at(0)); allFormatsTable->clearContents(); } @@ -218,92 +167,43 @@ void AudioTest::populateTable() { int row = 0; - QAudioFormat format; - for (auto codec: m_deviceInfo.supportedCodecs()) { - format.setCodec(codec); - for (auto sampleRate: m_deviceInfo.supportedSampleRates()) { - format.setSampleRate(sampleRate); - for (auto channels: m_deviceInfo.supportedChannelCounts()) { - format.setChannelCount(channels); - for (auto sampleType: m_deviceInfo.supportedSampleTypes()) { - format.setSampleType(sampleType); - for (auto sampleSize: m_deviceInfo.supportedSampleSizes()) { - format.setSampleSize(sampleSize); - for (auto endian: m_deviceInfo.supportedByteOrders()) { - format.setByteOrder(endian); - if (m_deviceInfo.isFormatSupported(format)) { - allFormatsTable->setRowCount(row + 1); - - QTableWidgetItem *codecItem = new QTableWidgetItem(format.codec()); - allFormatsTable->setItem(row, 0, codecItem); - - QTableWidgetItem *sampleRateItem = new QTableWidgetItem(QString("%1").arg(format.sampleRate())); - allFormatsTable->setItem(row, 1, sampleRateItem); + for (auto sampleFormat : m_deviceInfo.supportedSampleFormats()) { + allFormatsTable->setRowCount(row + 1); - QTableWidgetItem *channelsItem = new QTableWidgetItem(QString("%1").arg(format.channelCount())); - allFormatsTable->setItem(row, 2, channelsItem); + QTableWidgetItem *sampleTypeItem = new QTableWidgetItem(toString(sampleFormat)); + allFormatsTable->setItem(row, 0, sampleTypeItem); - QTableWidgetItem *sampleTypeItem = new QTableWidgetItem(toString(format.sampleType())); - allFormatsTable->setItem(row, 3, sampleTypeItem); + QTableWidgetItem *sampleRateItem = + new QTableWidgetItem(QStringLiteral("%1 - %2") + .arg(m_deviceInfo.minimumSampleRate()) + .arg(m_deviceInfo.maximumSampleRate())); + allFormatsTable->setItem(row, 1, sampleRateItem); - QTableWidgetItem *sampleSizeItem = new QTableWidgetItem(QString("%1").arg(format.sampleSize())); - allFormatsTable->setItem(row, 4, sampleSizeItem); + QTableWidgetItem *channelsItem = + new QTableWidgetItem(QStringLiteral("%1 - %2") + .arg(m_deviceInfo.minimumChannelCount()) + .arg(m_deviceInfo.maximumChannelCount())); + allFormatsTable->setItem(row, 2, channelsItem); - QTableWidgetItem *byteOrderItem = new QTableWidgetItem(toString(format.byteOrder())); - allFormatsTable->setItem(row, 5, byteOrderItem); - - ++row; - } - } - } - } - } - } + ++row; } } -void AudioTest::sampleRateChanged(int idx) +void AudioTest::sampleRateChanged(int value) { // sample rate has changed - m_settings.setSampleRate(sampleRateBox->itemText(idx).toInt()); -} - -void AudioTest::channelChanged(int idx) -{ - m_settings.setChannelCount(channelsBox->itemText(idx).toInt()); -} - -void AudioTest::codecChanged(int idx) -{ - m_settings.setCodec(codecsBox->itemText(idx)); + m_settings.setSampleRate(value); } -void AudioTest::sampleSizeChanged(int idx) +void AudioTest::channelChanged(int channels) { - m_settings.setSampleSize(sampleSizesBox->itemText(idx).toInt()); + m_settings.setChannelCount(channels); } -void AudioTest::sampleTypeChanged(int idx) +void AudioTest::sampleFormatChanged(int idx) { - switch (sampleTypesBox->itemText(idx).toInt()) { - case QAudioFormat::SignedInt: - m_settings.setSampleType(QAudioFormat::SignedInt); - break; - case QAudioFormat::UnSignedInt: - m_settings.setSampleType(QAudioFormat::UnSignedInt); - break; - case QAudioFormat::Float: - m_settings.setSampleType(QAudioFormat::Float); - } + auto formats = m_deviceInfo.supportedSampleFormats(); + m_settings.setSampleFormat(formats.at(idx)); } -void AudioTest::endianChanged(int idx) -{ - switch (endianBox->itemText(idx).toInt()) { - case QAudioFormat::LittleEndian: - m_settings.setByteOrder(QAudioFormat::LittleEndian); - break; - case QAudioFormat::BigEndian: - m_settings.setByteOrder(QAudioFormat::BigEndian); - } -} +#include "moc_audiodevices.cpp" |