diff options
Diffstat (limited to 'src/multimedia/audio/qaudioformat.h')
-rw-r--r-- | src/multimedia/audio/qaudioformat.h | 214 |
1 files changed, 129 insertions, 85 deletions
diff --git a/src/multimedia/audio/qaudioformat.h b/src/multimedia/audio/qaudioformat.h index 97779ea2c..a04ab6e1a 100644 --- a/src/multimedia/audio/qaudioformat.h +++ b/src/multimedia/audio/qaudioformat.h @@ -1,41 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** 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. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #ifndef QAUDIOFORMAT_H @@ -45,72 +9,152 @@ #include <QtCore/qshareddata.h> #include <QtMultimedia/qtmultimediaglobal.h> -#include <QtMultimedia/qmultimedia.h> QT_BEGIN_NAMESPACE class QAudioFormatPrivate; -class Q_MULTIMEDIA_EXPORT QAudioFormat +namespace QtPrivate { +template <typename... Args> +constexpr int channelConfig(Args... values) { + return (0 | ... | (1u << values)); +} +} + +class QAudioFormat { public: - enum SampleType { Unknown, SignedInt, UnSignedInt, Float }; - enum Endian { BigEndian = QSysInfo::BigEndian, LittleEndian = QSysInfo::LittleEndian }; - - QAudioFormat(); - QAudioFormat(const QAudioFormat &other); - ~QAudioFormat(); - - QAudioFormat& operator=(const QAudioFormat &other); - bool operator==(const QAudioFormat &other) const; - bool operator!=(const QAudioFormat &other) const; - - bool isValid() const; - - void setSampleRate(int sampleRate); - int sampleRate() const; - - void setChannelCount(int channelCount); - int channelCount() const; - - void setSampleSize(int sampleSize); - int sampleSize() const; - - void setCodec(const QString &codec); - QString codec() const; - - void setByteOrder(QAudioFormat::Endian byteOrder); - QAudioFormat::Endian byteOrder() const; - - void setSampleType(QAudioFormat::SampleType sampleType); - QAudioFormat::SampleType sampleType() const; + enum SampleFormat : quint16 { + Unknown, + UInt8, + Int16, + Int32, + Float, + NSampleFormats + }; + + // This matches the speaker positions of a 22.2 audio layout. Stereo, Surround 5.1 and Surround 7.1 are subsets of these + enum AudioChannelPosition { + UnknownPosition, + FrontLeft, + FrontRight, + FrontCenter, + LFE, + BackLeft, + BackRight, + FrontLeftOfCenter, + FrontRightOfCenter, + BackCenter, + SideLeft, + SideRight, + TopCenter, + TopFrontLeft, + TopFrontCenter, + TopFrontRight, + TopBackLeft, + TopBackCenter, + TopBackRight, + LFE2, + TopSideLeft, + TopSideRight, + BottomFrontCenter, + BottomFrontLeft, + BottomFrontRight + }; + static constexpr int NChannelPositions = BottomFrontRight + 1; + + enum ChannelConfig : quint32 { + ChannelConfigUnknown = 0, + ChannelConfigMono = QtPrivate::channelConfig(FrontCenter), + ChannelConfigStereo = QtPrivate::channelConfig(FrontLeft, FrontRight), + ChannelConfig2Dot1 = QtPrivate::channelConfig(FrontLeft, FrontRight, LFE), + ChannelConfig3Dot0 = QtPrivate::channelConfig(FrontLeft, FrontRight, FrontCenter), + ChannelConfig3Dot1 = QtPrivate::channelConfig(FrontLeft, FrontRight, FrontCenter, LFE), + ChannelConfigSurround5Dot0 = QtPrivate::channelConfig(FrontLeft, FrontRight, FrontCenter, BackLeft, BackRight), + ChannelConfigSurround5Dot1 = QtPrivate::channelConfig(FrontLeft, FrontRight, FrontCenter, LFE, BackLeft, BackRight), + ChannelConfigSurround7Dot0 = QtPrivate::channelConfig(FrontLeft, FrontRight, FrontCenter, BackLeft, BackRight, SideLeft, SideRight), + ChannelConfigSurround7Dot1 = QtPrivate::channelConfig(FrontLeft, FrontRight, FrontCenter, LFE, BackLeft, BackRight, SideLeft, SideRight), + }; + + template <typename... Args> + static constexpr ChannelConfig channelConfig(Args... channels) + { + return ChannelConfig(QtPrivate::channelConfig(channels...)); + } + + constexpr bool isValid() const noexcept + { + return m_sampleRate > 0 && m_channelCount > 0 && m_sampleFormat != Unknown; + } + + constexpr void setSampleRate(int sampleRate) noexcept { m_sampleRate = sampleRate; } + constexpr int sampleRate() const noexcept { return m_sampleRate; } + + Q_MULTIMEDIA_EXPORT void setChannelConfig(ChannelConfig config) noexcept; + constexpr ChannelConfig channelConfig() const noexcept { return m_channelConfig; } + + constexpr void setChannelCount(int channelCount) noexcept { m_channelConfig = ChannelConfigUnknown; m_channelCount = channelCount; } + constexpr int channelCount() const noexcept { return m_channelCount; } + + Q_MULTIMEDIA_EXPORT int channelOffset(AudioChannelPosition channel) const noexcept; + + constexpr void setSampleFormat(SampleFormat f) noexcept { m_sampleFormat = f; } + constexpr SampleFormat sampleFormat() const noexcept { return m_sampleFormat; } // Helper functions - qint32 bytesForDuration(qint64 duration) const; - qint64 durationForBytes(qint32 byteCount) const; - - qint32 bytesForFrames(qint32 frameCount) const; - qint32 framesForBytes(qint32 byteCount) const; - - qint32 framesForDuration(qint64 duration) const; - qint64 durationForFrames(qint32 frameCount) const; - - int bytesPerFrame() const; + Q_MULTIMEDIA_EXPORT qint32 bytesForDuration(qint64 microseconds) const; + Q_MULTIMEDIA_EXPORT qint64 durationForBytes(qint32 byteCount) const; + + Q_MULTIMEDIA_EXPORT qint32 bytesForFrames(qint32 frameCount) const; + Q_MULTIMEDIA_EXPORT qint32 framesForBytes(qint32 byteCount) const; + + Q_MULTIMEDIA_EXPORT qint32 framesForDuration(qint64 microseconds) const; + Q_MULTIMEDIA_EXPORT qint64 durationForFrames(qint32 frameCount) const; + + constexpr int bytesPerFrame() const { return bytesPerSample()*channelCount(); } + constexpr int bytesPerSample() const noexcept + { + switch (m_sampleFormat) { + case Unknown: + case NSampleFormats: return 0; + case UInt8: return 1; + case Int16: return 2; + case Int32: + case Float: return 4; + } + return 0; + } + + Q_MULTIMEDIA_EXPORT float normalizedSampleValue(const void *sample) const; + + friend bool operator==(const QAudioFormat &a, const QAudioFormat &b) + { + return a.m_sampleRate == b.m_sampleRate && + a.m_channelCount == b.m_channelCount && + a.m_sampleFormat == b.m_sampleFormat; + } + friend bool operator!=(const QAudioFormat &a, const QAudioFormat &b) + { + return !(a == b); + } + + static Q_MULTIMEDIA_EXPORT ChannelConfig defaultChannelConfigForChannelCount(int channelCount); private: - QSharedDataPointer<QAudioFormatPrivate> d; + SampleFormat m_sampleFormat = SampleFormat::Unknown; + short m_channelCount = 0; + ChannelConfig m_channelConfig = ChannelConfigUnknown; + int m_sampleRate = 0; + quint64 reserved = 0; }; #ifndef QT_NO_DEBUG_STREAM Q_MULTIMEDIA_EXPORT QDebug operator<<(QDebug, const QAudioFormat &); -Q_MULTIMEDIA_EXPORT QDebug operator<<(QDebug, QAudioFormat::SampleType); -Q_MULTIMEDIA_EXPORT QDebug operator<<(QDebug, QAudioFormat::Endian); +Q_MULTIMEDIA_EXPORT QDebug operator<<(QDebug, QAudioFormat::SampleFormat); #endif QT_END_NAMESPACE Q_DECLARE_METATYPE(QAudioFormat) -Q_DECLARE_METATYPE(QAudioFormat::SampleType) -Q_DECLARE_METATYPE(QAudioFormat::Endian) #endif // QAUDIOFORMAT_H |