QAudioSink Class
La classe QAudioSink fournit une interface pour l'envoi de données audio à un périphérique de sortie audio. Plus d'informations...
| En-tête : | #include <QAudioSink> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Multimedia)target_link_libraries(mytarget PRIVATE Qt6::Multimedia) |
| qmake : | QT += multimedia |
| Hérite : | QObject |
Fonctions publiques
| QAudioSink(const QAudioFormat &format = QAudioFormat(), QObject *parent = nullptr) | |
| QAudioSink(const QAudioDevice &audioDevice, const QAudioFormat &format = QAudioFormat(), QObject *parent = nullptr) | |
| virtual | ~QAudioSink() override |
(since 6.10) qsizetype | bufferFrameCount() const |
| qsizetype | bufferSize() const |
| qsizetype | bytesFree() const |
| qint64 | elapsedUSecs() const |
| QtAudio::Error | error() const |
| QAudioFormat | format() const |
(since 6.10) qsizetype | framesFree() const |
| bool | isNull() const |
| qint64 | processedUSecs() const |
| void | reset() |
| void | resume() |
(since 6.10) void | setBufferFrameCount(qsizetype value) |
| void | setBufferSize(qsizetype value) |
| void | setVolume(qreal volume) |
| QIODevice * | start() |
(since 6.11) void | start(Callback &&cb) |
| void | start(QIODevice *device) |
| QtAudio::State | state() const |
| void | stop() |
| void | suspend() |
| qreal | volume() const |
Signaux
| void | stateChanged(QtAudio::State state) |
Description détaillée
Vous pouvez construire une sortie audio avec le périphérique de sortie audio par défaut du système. Il est également possible de créer un QAudioSink avec un QAudioDevice spécifique. Lorsque vous créez la sortie audio, vous devez également envoyer le QAudioFormat à utiliser pour la lecture (voir la description de la classe QAudioFormat pour plus de détails).
QAudioSink peut être utilisé dans deux modes différents :
- Utilisation de QIODevice à partir d'un thread d'application
- Utilisation d'une interface basée sur des rappels à partir du fil d'exécution audio
Interface QIODevice
Pour lancer la lecture d'un flux audio, il suffit d'appeler start() avec un QIODevice. QAudioSink récupère alors les données dont il a besoin sur le périphérique io. La lecture d'un fichier audio est donc aussi simple que :
QFile sourceFile ; // membre de la classe.QAudioSink* audio ; // membre de la classe.{ sourceFile.setFileName("/tmp/test.raw") ; sourceFile.open(QIODevice::ReadOnly) ; QAudioFormat format ; // Configure le format, par exempleformat.setSampleRate(44100) ; format.setChannelCount(1) ; format.setSampleFormat(QAudioFormat::Int16) ; QAudioDevice info(QMediaDevices::defaultAudioOutput()) ; if (!info.isFormatSupported(format)) { qWarning() << "Raw audio format not supported by backend, cannot play audio."; return; } audio = new QAudioSink(format, this) ; connect(audio, QAudioSink::stateChanged, this, &AudioInputExample::handleStateChanged) ; audio->start(&sourceFile) ; }
La lecture du fichier commencera en supposant que le système audio et le périphérique de sortie le prennent en charge. Si vous n'avez pas de chance, vérifiez ce qui se passe avec la fonction error().
Une fois la lecture du fichier terminée, nous devons arrêter le périphérique :
void AudioOutputExample::stopAudioOutput() { audio->stop(); sourceFile.close(); delete audio; }
À tout moment, le QAudioSink se trouve dans l'un des quatre états suivants : actif, suspendu, arrêté ou inactif. Ces états sont décrits par l'énumération QtAudio::State.
Modèle de threading et mise en mémoire tampon
L'interface QIODevice est conçue pour être utilisée à partir du fil d'exécution de l'application. Un tampon circulaire sans attente est utilisé pour communiquer avec le thread audio. La taille de cette mémoire tampon peut être configurée avec setBufferSize() et est par défaut de 250 ms. L'état de ce tampon peut être interrogé avec bytesFree(). Si la mémoire tampon est à court de données, le thread audio enverra un silence au périphérique audio et l'état passera à QtAudio::IdleState et reprendra à QtAudio::ActiveState lorsque de nouvelles données seront disponibles à partir de QIODevice.
Interface de rappel
La meilleure façon d'obtenir une faible latence audio est d'utiliser l'interface basée sur les rappels. Elle vous permet d'écrire des données audio directement sur le périphérique audio sans passer par QIODevice. Pour ce faire, vous appelez start() avec une fonction de rappel qui sera appelée depuis le thread audio. Cette fonction de rappel sera appelée avec QSpan<SampleType> chaque fois que le backend audio aura besoin de données.
QAudioSink* audio ; // membre de la classe.float phase ; // membre de la classe.{ QAudioFormat format ; // Configure le format, par exempleformat.setSampleRate(44100) ; format.setChannelCount(2) ; format.setSampleFormat(QAudioFormat::Float) ; QAudioDevice info(QMediaDevices::defaultAudioOutput()) ; if (!info.isFormatSupported(format)) { qWarning() << "Raw audio format not supported by backend, cannot play audio."; return; } audio = new QAudioSink(format, this) ; float phaseIncrement = 2 * M_PI * 220.0 / format.sampleRate() ; // onde sinusoïdale de 220 Hz audio->start([&phase, phaseIncrement] (QSpan<float> interleavedAudioBuffer) { // Le callback audio ne doit pas appeler de fonctions potentiellement bloquantes // Remplir le buffer audio avec une onde sinusoïdale const int sampleCount = interleavedAudioBuffer.size() / 2; // Stéréo, donc diviser par 2 for(int i = 0; i < sampleCount ; ++i) { float sample = std::sin(phase) ; interleavedAudioBuffer[i * 2] = sample ; // Canal gaucheinterleavedAudioBuffer[i * 2 + 1] = sample ; // Canal droitphase += phaseIncrement ; // Incrémenter la phase pour l'échantillon suivant} }) ; if (!audio->error() == QtAudio::Error::NoError) { // en plus des autres signatures de start(), le démarrage du callback audio échouera si // * le backend n'implémente pas l'IO basé sur le callback (l'API est disponible sur toutes les // plateformes majeures ) // * la signature du callback audio ne correspond pas à format.sampleFormat() qWarning() << "Error starting audio output:" << audio->errorString(); } }
Contrairement à l'interface basée sur QIODevice, le QAudioSink ne peut être que dans les états actif, suspendu et arrêté. L'API setBufferSize() n'est pas disponible lors de l'utilisation du callback, la taille de l'argument du callback est déterminée par le backend audio.
Remarque : cette API n'est disponible que sur les plateformes qui prennent en charge l'API de rappel : CoreAudio d'Apple (macOS, iOS, etc.), Windows, Linux (en utilisant le backend PulseAudio ou PipeWire) et Android.
Note : Le callback sera appelé sur un thread audio en temps réel. Il est important de s'assurer que le callback ne se bloque pas, car cela peut entraîner des problèmes audio ou des interruptions. Cela inclut l'exécution d'entrées-sorties bloquantes, le verrouillage de mutex, l'allocation de mémoires ou toute autre opération susceptible de bloquer. Pour les meilleures pratiques, consultez l'article de Ross Bencina Real-time audio programming 101 : time waits for nothing (Programmation audio en temps réel 101 : le temps n'attend rien). Pensez également à utiliser l'assainisseur temps réel de clang pour valider le callback audio.
Gestion de l'état et des erreurs
Les changements d'état sont signalés par le signal stateChanged(). Vous pouvez utiliser ce signal pour, par exemple, mettre à jour l'interface graphique de l'application ; l'exemple le plus banal étant le changement d'état d'un bouton play/pause. Vous pouvez demander un changement d'état directement avec suspend(), stop(), reset(), resume() et start().
Le QAudioSink entre dans StoppedState lorsqu'une erreur est rencontrée. L'adresse error type peut être récupérée avec la fonction error(). Veuillez consulter l'énumération QtAudio::Error pour une description des erreurs possibles qui sont signalées. L'appel à stop() ou reset() réinitialise l'état d'erreur à NoError.
Vous pouvez vérifier les erreurs en vous connectant au signal stateChanged() :
void AudioOutputExample::handleStateChanged(QtAudio::State newState) { switch (newState) { case QtAudio::IdleState: // Finished playing (no more data) AudioOutputExample::stopAudioOutput(); break; case QtAudio::StoppedState: // Stopped for other reasons if (audio->error() != QtAudio::NoError) { // Error handling } break; default: // ... other cases as appropriate break; } }
Voir également QAudioSource et QAudioDevice.
Documentation sur les fonctions membres
[explicit] QAudioSink::QAudioSink(const QAudioFormat &format = QAudioFormat(), QObject *parent = nullptr)
Construire une nouvelle sortie audio et l'attacher à parent. Le périphérique de sortie audio par défaut est utilisé avec les paramètres de sortie format. Si format est initialisé par défaut, le format sera défini sur le format préféré du périphérique audio.
[explicit] QAudioSink::QAudioSink(const QAudioDevice &audioDevice, const QAudioFormat &format = QAudioFormat(), QObject *parent = nullptr)
Construire une nouvelle sortie audio et l'attacher à parent. Le périphérique référencé par audioDevice est utilisé avec les paramètres de la sortie format. Si format est initialisé par défaut, le format sera défini sur le format préféré de audioDevice.
[override virtual noexcept] QAudioSink::~QAudioSink()
Détruit cette sortie audio.
Cette opération libère les ressources système utilisées et les mémoires tampons.
[since 6.10] qsizetype QAudioSink::bufferFrameCount() const
Renvoie la taille du tampon audio en images.
Si elle est appelée avant start(), elle renvoie la valeur par défaut de la plate-forme. Si elle est appelée avant start() mais que setBufferSize() ou setBufferFrameCount() a été appelé avant, elle renvoie la valeur définie par setBufferSize() ou setBufferFrameCount(). Si elle est appelée après start(), elle renvoie la taille réelle de la mémoire tampon utilisée. Cette valeur peut être différente de celle définie précédemment par setBufferSize() ou setBufferFrameCount().
Cette fonction a été introduite dans Qt 6.10.
Voir aussi setBufferFrameCount() et bufferSize.
qsizetype QAudioSink::bufferSize() const
Renvoie la taille du tampon audio en octets.
Si elle est appelée avant start(), elle renvoie la valeur par défaut de la plate-forme. Si elle est appelée avant start() mais que setBufferSize() ou setBufferFrameCount() a été appelé avant, elle renvoie la valeur définie par setBufferSize() ou setBufferFrameCount(). Si elle est appelée après start(), elle renvoie la taille réelle de la mémoire tampon utilisée. Cette valeur peut être différente de celle définie précédemment par setBufferSize() ou setBufferFrameCount().
Voir également setBufferSize() et bufferFrameCount.
qsizetype QAudioSink::bytesFree() const
Renvoie le nombre d'octets libres dans la mémoire tampon audio.
Remarque : la valeur renvoyée n'est valable que dans l'état QtAudio::ActiveState ou QtAudio::IdleState, sinon elle renvoie zéro.
Voir aussi framesFree.
qint64 QAudioSink::elapsedUSecs() const
Renvoie les microsecondes écoulées depuis l'appel de start(), y compris le temps passé en état de veille et de suspension.
QtAudio::Error QAudioSink::error() const
Renvoie l'état d'erreur.
QAudioFormat QAudioSink::format() const
Renvoie l'adresse QAudioFormat utilisée.
[since 6.10] qsizetype QAudioSink::framesFree() const
Renvoie le nombre de trames libres dans la mémoire tampon audio.
Remarque : la valeur renvoyée n'est valable que dans l'état QtAudio::ActiveState ou QtAudio::IdleState, sinon elle renvoie zéro.
Cette fonction a été introduite dans Qt 6.10.
Voir aussi bytesFree.
bool QAudioSink::isNull() const
Renvoie true si l'instance QAudioSink est null, sinon renvoie false.
qint64 QAudioSink::processedUSecs() const
Renvoie la quantité de données audio traitées depuis que start() a été appelé (en microsecondes).
void QAudioSink::reset()
Arrête immédiatement la sortie audio et rejette toutes les données audio présentes dans les tampons. Toutes les données audio en attente envoyées à QIODevice sont ignorées.
Voir aussi stop().
void QAudioSink::resume()
Reprend le traitement des données audio après un appel à suspend().
Fixe state() à l'état que le récepteur avait lorsque suspend() a été appelé. Cette fonction ne fait rien si l'état du récepteur audio n'est pas QtAudio::SuspendedState.
[since 6.10] void QAudioSink::setBufferFrameCount(qsizetype value)
Définit la taille de la mémoire tampon audio à value en nombre d'images.
Remarque : cette fonction peut être appelée à tout moment avant start(). Les appels à cette fonction sont ignorés après start(). Il ne faut pas supposer que la taille de la mémoire tampon définie est la taille réelle de la mémoire tampon utilisée - appelez bufferFrameCount() n'importe quand après start() pour renvoyer la taille réelle de la mémoire tampon utilisée.
Cette fonction a été introduite dans Qt 6.10.
Voir aussi bufferFrameCount() et setBufferSize.
void QAudioSink::setBufferSize(qsizetype value)
Définit la taille de la mémoire tampon audio à value en octets.
Remarque : cette fonction peut être appelée à tout moment avant start(). Les appels à cette fonction sont ignorés après start(). Il ne faut pas supposer que la taille de la mémoire tampon définie est la taille réelle de la mémoire tampon utilisée - appelez bufferSize() n'importe quand après start() pour renvoyer la taille réelle de la mémoire tampon utilisée.
Voir aussi bufferSize() et setBufferFrameCount.
void QAudioSink::setVolume(qreal volume)
Règle le volume de sortie sur volume.
Le volume est échelonné linéairement de 0.0 (silence) à 1.0 (plein volume). Les valeurs situées en dehors de cette plage seront bridées.
Le volume par défaut est 1.0.
Remarque : les ajustements du volume modifieront le volume de ce flux audio, et non le volume global.
Les commandes de volume de l'interface utilisateur doivent généralement être mises à l'échelle de manière non linéaire. Par exemple, l'utilisation d'une échelle logarithmique produira des changements linéaires dans l'intensité sonore perçue, ce qui correspond à ce qu'un utilisateur attend normalement d'une commande de volume. Voir QtAudio::convertVolume() pour plus de détails.
Voir également volume().
QIODevice *QAudioSink::start()
Renvoie un pointeur vers l'adresse interne QIODevice utilisée pour transférer des données vers la sortie audio du système. Le périphérique sera déjà ouvert et write() pourra y écrire des données directement.
Remarque : le pointeur deviendra invalide après l'arrêt du flux ou si vous démarrez un autre flux.
Si QAudioSink est en mesure d'accéder au périphérique audio du système, state() renvoie QtAudio::IdleState, error() renvoie QtAudio::NoError et le signal stateChanged() est émis.
Si un problème survient au cours de ce processus, error() renvoie QtAudio::OpenError, state() renvoie QtAudio::StoppedState et le signal stateChanged() est émis.
Voir également QIODevice et QIODevice interface.
[since 6.11] template <typename Callback, QtAudio::if_audio_sink_callback<Callback> = true> void QAudioSink::start(Callback &&cb)
Démarre le QAudioSink avec une fonction de rappel qui sera appelée sur un thread audio en temps réel. La fonction de rappel est un appelable qui prend un QSpan<SampleType> comme argument, SampleType doit correspondre au QAudioFormat::SampleFormat du format de QAudioSink. L'intervalle doit être rempli avec des données audio entrelacées.
Si le démarrage de QAudioSink est réussi, error() renvoie QtAudio::NoError.
Si un problème survient au cours de ce processus, error() renvoie QtAudio::OpenError, state() renvoie QtAudio::StoppedState et le signal stateChanged() est émis.
Remarque : cette API n'est disponible que sur les plateformes qui prennent en charge l'API de rappel : CoreAudio d'Apple (macOS, iOS, etc.), Windows, Linux (en utilisant le backend PulseAudio ou PipeWire) et Android.
Remarque : le callback sera appelé sur un thread audio en temps réel. Il est important de s'assurer que le callback ne se bloque pas, car cela peut entraîner des problèmes audio ou des interruptions. Cela inclut l'exécution d'entrées-sorties bloquantes, le verrouillage de mutex, l'allocation de mémoires ou toute autre opération susceptible de bloquer. Pour les meilleures pratiques, consultez l'article de Ross Bencina Real-time audio programming 101 : time waits for nothing (Programmation audio en temps réel 101 : le temps n'attend rien). Pensez aussi à utiliser le Realtime sanitizer de clang pour valider le callback audio.
Cette fonction a été introduite dans Qt 6.11.
Voir aussi Callback interface.
void QAudioSink::start(QIODevice *device)
Lance le transfert des données audio du site device vers la sortie audio du système. Le site device doit avoir été ouvert en mode ReadOnly ou ReadWrite.
Si le site QAudioSink réussit à transmettre les données audio, state() renvoie QtAudio::ActiveState, error() renvoie QtAudio::NoError et le signal stateChanged() est émis.
Si un problème survient au cours de ce processus, error() renvoie QtAudio::OpenError, state() renvoie QtAudio::StoppedState et le signal stateChanged() est émis.
Voir également QIODevice et QIODevice interface.
QtAudio::State QAudioSink::state() const
Renvoie l'état du traitement audio.
[signal] void QAudioSink::stateChanged(QtAudio::State state)
Ce signal est émis lorsque l'appareil state a changé. Il s'agit de l'état actuel de la sortie audio.
Note : L'espace de noms QtAudio était nommé QAudio jusqu'à la version 6.6 de Qt incluse. Les connexions à ce signal basées sur des chaînes de caractères doivent utiliser QAudio::State comme type de paramètre : connect(source, SIGNAL(stateChanged(QAudio::State)), ...);
void QAudioSink::stop()
Arrête la sortie audio, en se détachant de la ressource système.
Définit error() en QtAudio::NoError, state() en QtAudio::StoppedState et émet le signal stateChanged().
Remarque : sous Linux et Darwin, cette opération vide de manière synchrone la mémoire tampon audio sous-jacente, ce qui peut entraîner des retards au niveau de la charge utile de la mémoire tampon. Pour réinitialiser tous les tampons immédiatement, utilisez plutôt la méthode reset.
Voir aussi reset().
void QAudioSink::suspend()
Arrête le traitement des données audio, en préservant les données audio mises en mémoire tampon.
Définit state() sur QtAudio::SuspendedState et émet le signal stateChanged().
qreal QAudioSink::volume() const
Renvoie le volume compris entre 0,0 et 1,0 inclus.
Voir aussi setVolume().
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.