diff options
Diffstat (limited to 'src/multimedia/audio/qaudiosink.cpp')
-rw-r--r-- | src/multimedia/audio/qaudiosink.cpp | 106 |
1 files changed, 43 insertions, 63 deletions
diff --git a/src/multimedia/audio/qaudiosink.cpp b/src/multimedia/audio/qaudiosink.cpp index 15d865996..12263d32a 100644 --- a/src/multimedia/audio/qaudiosink.cpp +++ b/src/multimedia/audio/qaudiosink.cpp @@ -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 #include "qaudio.h" @@ -81,21 +45,22 @@ QT_BEGIN_NAMESPACE After the file has finished playing, we need to stop the device: - \snippet multimedia-snippets/audio.cpp Audio output state changed + \snippet multimedia-snippets/audio.cpp Audio output stop At any given time, the QAudioSink will be in one of four states: active, suspended, stopped, or idle. These states are described - by the QAudio::State enum. + by the QtAudio::State enum. State changes are reported through the stateChanged() signal. You can use this signal to, for instance, update the GUI of the application; the mundane example here being changing the state of a \c { play/pause } button. You request a state change directly with suspend(), stop(), reset(), resume(), and start(). - If an error occurs, you can fetch the \l{QAudio::Error}{error - type} with the error() function. Please see the QAudio::Error enum - for a description of the possible errors that are reported. When - an error is encountered, the state changes to QAudio::StoppedState. + If an error occurs, you can fetch the \l{QtAudio::Error}{error + type} with the error() function. Please see the QtAudio::Error enum + for a description of the possible errors that are reported. When + QtAudio::UnderrunError is encountered, the state changes to QtAudio::IdleState, + when another error is encountered, the state changes to QtAudio::StoppedState. You can check for errors by connecting to the stateChanged() signal: @@ -122,14 +87,26 @@ QAudioSink::QAudioSink(const QAudioFormat &format, QObject *parent) QAudioSink::QAudioSink(const QAudioDevice &audioDevice, const QAudioFormat &format, QObject *parent): QObject(parent) { - d = QPlatformMediaDevices::instance()->audioOutputDevice(format, audioDevice); + d = QPlatformMediaIntegration::instance()->mediaDevices()->audioOutputDevice(format, audioDevice, parent); if (d) - connect(d, SIGNAL(stateChanged(QAudio::State)), SIGNAL(stateChanged(QAudio::State))); + connect(d, &QPlatformAudioSink::stateChanged, this, [this](QAudio::State state) { + // if the signal has been emitted from another thread, + // the state may be already changed by main one + if (state == d->state()) + emit stateChanged(state); + }); else qWarning() << ("No audio device detected"); } /*! + \fn bool QAudioSink::isNull() const + + Returns \c true is the QAudioSink instance is \c null, otherwise returns + \c false. +*/ + +/*! Destroys this audio output. This will release any system resources used and free any buffers. @@ -154,11 +131,11 @@ QAudioFormat QAudioSink::format() const \l{QIODevice::ReadWrite}{ReadWrite} modes. If the QAudioSink is able to successfully output audio data, state() returns - QAudio::ActiveState, error() returns QAudio::NoError + QtAudio::ActiveState, error() returns QtAudio::NoError and the stateChanged() signal is emitted. - If a problem occurs during this process, error() returns QAudio::OpenError, - state() returns QAudio::StoppedState and the stateChanged() signal is emitted. + If a problem occurs during this process, error() returns QtAudio::OpenError, + state() returns QtAudio::StoppedState and the stateChanged() signal is emitted. \sa QIODevice */ @@ -179,11 +156,11 @@ void QAudioSink::start(QIODevice* device) if you start another stream. If the QAudioSink is able to access the system's audio device, state() returns - QAudio::IdleState, error() returns QAudio::NoError + QtAudio::IdleState, error() returns QtAudio::NoError and the stateChanged() signal is emitted. - If a problem occurs during this process, error() returns QAudio::OpenError, - state() returns QAudio::StoppedState and the stateChanged() signal is emitted. + If a problem occurs during this process, error() returns QtAudio::OpenError, + state() returns QtAudio::StoppedState and the stateChanged() signal is emitted. \sa QIODevice */ @@ -198,7 +175,7 @@ QIODevice* QAudioSink::start() /*! Stops the audio output, detaching from the system resource. - Sets error() to QAudio::NoError, state() to QAudio::StoppedState and + Sets error() to QtAudio::NoError, state() to QtAudio::StoppedState and emit stateChanged() signal. */ void QAudioSink::stop() @@ -220,7 +197,7 @@ void QAudioSink::reset() /*! Stops processing audio data, preserving buffered audio data. - Sets error() to QAudio::NoError, state() to QAudio::SuspendedState and + Sets error() to QtAudio::NoError, state() to QtAudio::SuspendedState and emits stateChanged() signal. */ void QAudioSink::suspend() @@ -232,10 +209,9 @@ void QAudioSink::suspend() /*! Resumes processing audio data after a suspend(). - Sets error() to QAudio::NoError. - Sets state() to QAudio::ActiveState if you previously called start(QIODevice*). - Sets state() to QAudio::IdleState if you previously called start(). - emits stateChanged() signal. + Sets state() to the state the sink had when suspend() was called, and sets + error() to QAudioError::NoError. This function does nothing if the audio sink's + state is not QtAudio::SuspendedState. */ void QAudioSink::resume() { @@ -246,7 +222,7 @@ void QAudioSink::resume() /*! Returns the number of free bytes available in the audio buffer. - \note The returned value is only valid while in QAudio::ActiveState or QAudio::IdleState + \note The returned value is only valid while in QtAudio::ActiveState or QtAudio::IdleState state, otherwise returns zero. */ qsizetype QAudioSink::bytesFree() const @@ -303,7 +279,7 @@ qint64 QAudioSink::elapsedUSecs() const /*! Returns the error state. */ -QAudio::Error QAudioSink::error() const +QtAudio::Error QAudioSink::error() const { return d ? d->error() : QAudio::OpenError; } @@ -311,7 +287,7 @@ QAudio::Error QAudioSink::error() const /*! Returns the state of audio processing. */ -QAudio::State QAudioSink::state() const +QtAudio::State QAudioSink::state() const { return d ? d->state() : QAudio::StoppedState; } @@ -330,7 +306,7 @@ QAudio::State QAudioSink::state() const UI volume controls should usually be scaled non-linearly. For example, using a logarithmic scale will produce linear changes in perceived loudness, which is what a user would normally expect from a volume control. See - QAudio::convertVolume() for more details. + QtAudio::convertVolume() for more details. */ void QAudioSink::setVolume(qreal volume) { @@ -349,9 +325,13 @@ qreal QAudioSink::volume() const } /*! - \fn QAudioSink::stateChanged(QAudio::State state) + \fn QAudioSink::stateChanged(QtAudio::State state) This signal is emitted when the device \a state has changed. This is the current state of the audio output. + + \note The QtAudio namespace was named QAudio up to and including Qt 6.6. + String-based connections to this signal have to use \c{QAudio::State} as + the parameter type: \c{connect(source, SIGNAL(stateChanged(QAudio::State)), ...);} */ QT_END_NAMESPACE |