QAudioSink Class
La classe QAudioSink fournit une interface permettant d'envoyer des données audio vers un périphérique de sortie audio. En savoir plus...
| En-tête : | #include <QAudioSink> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Multimedia) target_link_libraries(mytarget PRIVATE Qt6::Multimedia) |
| qmake : | QT += multimedia |
| Hérite de : | 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 |
(since 6.12) qsizetype | nativePeriodFrameCount() const |
| qint64 | processedUSecs() const |
| void | reset() |
| void | resume() |
(since 6.10) void | setBufferFrameCount(qsizetype value) |
| void | setBufferSize(qsizetype value) |
(since 6.12) void | setNativePeriodFrameCount(qsizetype frameCount) |
| 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 créer une sortie audio à l’aide du périphérique de sortie audio par défaut du système. Il est également possible de créer un objet `QAudioSink` avec une ` QAudioDevice` spécifique. Lorsque vous créez la sortie audio, vous devez également fournir la ` QAudioFormat ` à utiliser pour la lecture (voir la description de la classe ` QAudioFormat ` pour plus de détails).
QAudioSink peut être utilisé selon deux modes différents :
- Utilisation d’un QIODevice depuis un thread d’application
- Utilisation d'une interface basée sur des callbacks depuis le thread audio
Interface QIODevice
Pour lancer la lecture d’un flux audio, il suffit d’appeler ` start()` avec un ` QIODevice`. `QAudioSink` récupérera alors les données dont il a besoin à partir du périphérique d’E/S. La lecture d’un fichier audio se résume donc simplement à :
QFile sourceFile ; // membre de la classe.
QAudioSink* audio ; // membre de la classe.
{
sourceFile.setFileName("/tmp/test.raw");
sourceFile.open(QIODevice::ReadOnly);
QAudioFormat format ;
// Configurer le format, par exemple :
format.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 démarrera à condition que le système audio et le périphérique de sortie le prennent en charge. Si cela ne fonctionne pas, vérifiez le comportement de la fonction error().
Une fois la lecture du fichier terminée, il faut 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 depuis le thread de l’application. Un tampon circulaire sans attente est utilisé pour communiquer avec le thread audio. La taille de ce tampon circulaire peut être configurée à l’aide de la fonction ` setBufferSize()` et est fixée par défaut à 250 ms. L’état de ce tampon peut être interrogé à l’aide de la fonction ` bytesFree()`. Si le tampon circulaire est à court de données, le thread audio enverra du silence au périphérique audio et l’état passera à « QtAudio::IdleState » (en attente de données), puis reviendra à « QtAudio::ActiveState » (en attente de données) dès que de nouvelles données seront disponibles à partir de ` QIODevice`.
Interface de rappel
La meilleure façon d’obtenir une faible latence audio consiste à utiliser l’interface basée sur les callbacks. Elle vous permet d’écrire des données audio directement sur le périphérique audio sans passer par un QIODevice. Pour ce faire, il suffit d’appeler start() avec une fonction de callback qui sera appelée depuis le thread audio. Cette fonction de rappel sera appelée avec un 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;
// Configuration du format, par exemple :
format.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 à 220 Hz
audio->start([&phase, phaseIncrement] (QSpan<float> interleavedAudioBuffer) {
// La fonction de rappel audio ne doit appeler aucune fonction susceptible de bloquer l'exécution
// Remplir le tampon 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 gauche
interleavedAudioBuffer[i * 2 + 1] = sample; // Canal droit
phase+= phaseIncrement; // Incrémenter la phase pour l'échantillon suivant
}
});
if (!audio->error()== QtAudio::Error::NoError) {
// Outre les autres signatures de start(), le lancement du callback audio échouera si
// * le backend n'implémente pas d'E/S basées sur des callbacks (l'API est disponible sur toutes les principales
// plateformes)
// * la signature du callback audio ne correspond pas à celle renvoyée par format.sampleFormat()
qWarning() << "Error starting audio output:" << audio->errorString();
}
}Contrairement à l’interface basée sur QIODevice, QAudioSink ne peut se trouver que dans les états « active », « suspended » et « stopped ». 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 prenant en charge l’API de rappel : CoreAudio d’Apple (macOS, iOS, etc.), Windows, Linux (utilisant le backend PulseAudio ou PipeWire) et Android.
Remarque : la fonction de rappel sera appelée sur un thread audio en temps réel « souple ». Il est important de s’assurer que la fonction de rappel ne bloque pas, car cela peut entraîner des perturbations audio ou des coupures. Cela inclut l’exécution d’opérations d’E/S bloquantes, le verrouillage de mutex, l’allocation de mémoire ou toute autre opération susceptible de bloquer le système. Pour connaître les bonnes pratiques, consultez l’article de Ross Bencina intitulé « Real-time audio programming 101: time waits for nothing ». Envisagez également d’utiliser le « Realtime sanitizer » de Clang pour valider la fonction de rappel audio.
Gestion de l'état et des erreurs
Les changements d’état sont signalés via le signal ` stateChanged()`. Vous pouvez utiliser ce signal pour, par exemple, mettre à jour l’interface graphique de l’application ; l’exemple le plus courant ici étant la modification de l’état d’un bouton « play/pause ». Vous demandez un changement d’état directement avec les fonctions ` suspend()`, ` stop()`, ` reset()`, ` resume()` et ` start()`.
Le QAudioSink passe à l’état « StoppedState » lorsqu’une erreur survient. L’ error type e peut être récupérée à l’aide de la fonction error(). Veuillez consulter l’énumération QtAudio::Error pour obtenir une description des erreurs possibles qui sont signalées. L’appel de stop() ou reset() réinitialise l’état d’erreur à NoError.
Vous pouvez vérifier la présence d’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)
Créez une nouvelle sortie audio et associez-la à ` 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)
Créez une nouvelle sortie audio et associez-la à parent. Le périphérique référencé par audioDevice 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é de audioDevice.
[override virtual noexcept] QAudioSink::~QAudioSink()
Supprime cette sortie audio.
Cela libérera toutes les ressources système utilisées et tous les tampons.
[since 6.10] qsizetype QAudioSink::bufferFrameCount() const
Renvoie la taille du tampon audio en trames.
Si elle est appelée avant ` start()`, elle renvoie la valeur par défaut de la plateforme. Si elle est appelée avant ` start() `, mais que ` setBufferSize()` ou ` setBufferFrameCount()` a été appelée auparavant, elle renvoie la valeur définie par ` setBufferSize() ` ou ` setBufferFrameCount()`. Si elle est appelée après ` start()`, elle renvoie la taille réelle du tampon actuellement utilisé. Celle-ci peut ne pas correspondre à la valeur précédemment définie par ` setBufferSize() ` ou ` setBufferFrameCount()`.
Cette fonction a été introduite dans Qt 6.10.
Voir également setBufferFrameCount() et bufferSize.
qsizetype QAudioSink::bufferSize() const
Renvoie la taille du tampon audio en octets.
Si la fonction 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ée auparavant, elle renvoie la valeur définie par setBufferSize() ou setBufferFrameCount(). Si elle est appelée après start(), elle renvoie la taille réelle du tampon actuellement utilisé. Celle-ci peut ne pas correspondre à la valeur précédemment définie par setBufferSize() ou setBufferFrameCount().
Voir également setBufferSize() et bufferFrameCount.
qsizetype QAudioSink::bytesFree() const
Renvoie le nombre d'octets libres disponibles dans le tampon audio.
Remarque : la valeur renvoyée n'est valide que lorsque le tampon est en état « QtAudio::ActiveState » ou « QtAudio::IdleState » ; dans le cas contraire, la valeur renvoyée est zéro.
Voir également framesFree.
qint64 QAudioSink::elapsedUSecs() const
Renvoie le nombre de microsecondes écoulées depuis l'appel de la fonction start(), y compris le temps passé dans les états « Idle » et « Suspend ».
QtAudio::Error QAudioSink::error() const
Renvoie l'état d'erreur.
QAudioFormat QAudioSink::format() const
Renvoie l'QAudioFormat e en cours d'utilisation.
[since 6.10] qsizetype QAudioSink::framesFree() const
Renvoie le nombre de trames libres disponibles dans le tampon audio.
Remarque : la valeur renvoyée n'est valide que lorsque la fonction est dans l'état « QtAudio::ActiveState » ou « QtAudio::IdleState » ; dans le cas contraire, 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`.
[since 6.12] qsizetype QAudioSink::nativePeriodFrameCount() const
Renvoie le nombre de trames de période natif.
Renvoie -1 si la valeur n'est pas définie, sinon renvoie la valeur précédemment définie avec setNativePeriodFrameCount().
Cette fonction a été introduite dans Qt 6.12.
Voir également setNativePeriodFrameCount.
qint64 QAudioSink::processedUSecs() const
Renvoie la quantité de données audio traitées depuis l'appel de la fonction start() (en microsecondes).
void QAudioSink::reset()
Interrompt immédiatement la sortie audio et supprime toutes les données audio actuellement présentes dans les tampons. Toutes les données audio en attente envoyées à ` QIODevice ` sont ignorées.
Voir également stop().
void QAudioSink::resume()
Reprend le traitement des données audio après l'appel de la fonction ` suspend()`.
Rétablit l'état de la fonction ` state()` à celui que le récepteur avait au moment de l'appel de ` suspend()`. 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 du tampon audio à value en nombre d'images.
Remarque : cette fonction peut être appelée à tout moment avant l'appel de ` start()`. Les appels à cette fonction sont ignorés après l'appel de ` start()`. Il ne faut pas supposer que la taille de tampon définie correspond à la taille réelle du tampon utilisé : appelez ` bufferFrameCount()` à tout moment après l'appel de ` start()` pour obtenir la taille réelle du tampon utilisé.
Les propriétés ` bufferFrameCount()` et ` bufferSize()` indiquent la taille du tampon circulaire lors de l’utilisation des API ` QIODevice `. La taille native de la période est contrôlée via ` setNativePeriodFrameCount()`.
Cette fonction a été introduite dans Qt 6.10.
Voir également bufferFrameCount() et setBufferSize.
void QAudioSink::setBufferSize(qsizetype value)
Définit la taille du tampon audio à value en octets.
Remarque : cette fonction peut être appelée à tout moment avant l'appel à ` start()`. Les appels à cette fonction sont ignorés après l'appel à ` start()`. Il ne faut pas supposer que la taille de tampon définie correspond à la taille de tampon réellement utilisée : appelez ` bufferSize()` à tout moment après l'appel à ` start()` pour obtenir la taille de tampon réellement utilisée.
Les propriétés bufferFrameCount() et bufferSize() indiquent la taille du tampon circulaire lors de l'utilisation des API QIODevice. La taille native de la période est contrôlée via setNativePeriodFrameCount().
Voir également bufferSize() et setBufferFrameCount.
[since 6.12] void QAudioSink::setNativePeriodFrameCount(qsizetype frameCount)
Définit le nombre de trames par période native sur frameCount.
Règle la taille du tampon audio utilisé par le système d'exploitation et le matériel. Par défaut (lorsque cette valeur n'est pas définie), le système utilise une valeur dépendante de la plate-forme, généralement 1 024 trames (~23 ms à 44 100 Hz).
Utilisez des valeurs plus petites (64-256) pour réduire la latence, ou des valeurs plus grandes (2048-4096) pour réduire le risque de sous-remplissage du tampon (pertes de données).
Les valeurs valides sont des puissances de 2 comprises entre 32 et 4096 (inclus), ou -1 pour désactiver le paramètre. Ne peut être appelé que lorsque le périphérique de sortie audio est arrêté.
Correspond aux paramètres spécifiques à chaque plateforme : kAudioDevicePropertyBufferFrameSize (macOS), IAudioClient::bufferDuration (Windows), PW_KEY_NODE_FORCE_QUANTUM (PipeWire/Linux) et AAudioStreamBuilder_setBufferCapacityInFrames (Android).
Remarque : ceci est distinct du tampon circulaire configuré avec setBufferSize() ou setBufferFrameCount().
Cette fonction a été introduite dans Qt 6.12.
Voir également nativePeriodFrameCount.
void QAudioSink::setVolume(qreal volume)
Règle le volume de sortie sur volume.
Le volume est modulé de manière linéaire entre 0.0 (silence) et 1.0 (volume maximal). Les valeurs situées en dehors de cette plage seront limitées.
Le volume par défaut est 1.0.
Remarque : les réglages du volume modifient 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 le niveau sonore perçu, ce à quoi un utilisateur s’attend normalement de la part d’une commande de volume. Voir QtAudio::convertVolume() pour plus de détails.
Voir également volume().
QIODevice *QAudioSink::start()
Renvoie un pointeur vers l'QIODevice interne utilisé pour transférer les données vers la sortie audio du système. Le périphérique sera déjà ouvert et la fonction write() pourra y écrire directement des données.
Remarque : le pointeur deviendra invalide une fois le flux arrêté ou si vous lancez un autre flux.
Si l'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, la fonction error() renvoie QtAudio::OpenError, la fonction state() renvoie QtAudio::StoppedState et le signal stateChanged() est émis.
Voir également QIODevice et QIODevice interface.
[since 6.11] template <typename Callback> requires QtAudio::if_audio_sink_callback<Callback> void QAudioSink::start(Callback &&cb)
Lance l'QAudioSink avec une fonction de rappel qui sera appelée sur un thread audio en temps réel souple. La fonction de rappel est un objet « callable » qui prend en argument un objet « QSpan » de type <SampleType> ; ce type doit correspondre à l'QAudioFormat::SampleFormat du format de l'QAudioSink. La plage doit être remplie de données audio entrelacées.
Si l’ QAudioSink ion parvient à démarrer correctement, la fonction error() renvoie QtAudio::NoError.
Si un problème survient au cours de ce processus, la fonction ` error()` renvoie ` QtAudio::OpenError`, la fonction ` state()` renvoie ` QtAudio::StoppedState ` et le signal ` stateChanged()` est émis.
Remarque : cette API n’est disponible que sur les plateformes prenant en charge l’API de rappel : CoreAudio d’Apple (macOS, iOS, etc.), Windows, Linux (utilisant le backend PulseAudio ou PipeWire) et Android.
Remarque : la fonction de rappel sera appelée sur un thread audio en temps réel « souple ». Il est important de s’assurer que la fonction de rappel ne bloque pas, car cela peut provoquer des perturbations audio ou des coupures. Cela inclut l’exécution d’opérations d’E/S bloquantes, le verrouillage de mutex, l’allocation de mémoire ou toute autre opération susceptible de bloquer le système. Pour connaître les bonnes pratiques, consultez l’article de Ross Bencina intitulé « Real-time audio programming 101: time waits for nothing ». Envisagez également d’utiliser le « Realtime sanitizer » de Clang pour valider la fonction de rappel audio.
Cette fonction a été introduite dans Qt 6.11.
Voir également Callback interface.
void QAudioSink::start(QIODevice *device)
Lance le transfert des données audio depuis l'device vers la sortie audio du système. L'device doit avoir été ouvert en mode « ReadOnly » ou « ReadWrite ».
Si l'QAudioSink parvient à émettre correctement des données audio, la fonction state() renvoie QtAudio::ActiveState, la fonction error() renvoie QtAudio::NoError et le signal stateChanged() est émis.
Si un problème survient au cours de ce processus, la fonction error() renvoie QtAudio::OpenError, la fonction 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 la propriété state de l'appareil a changé. Il s'agit de l'état actuel de la sortie audio.
Remarque : l'espace de noms « QtAudio » s'appelait « QAudio » jusqu’à la version Qt 6.6 incluse. Les connexions basées sur des chaînes de caractères à ce signal doivent utiliser « QAudio::State » comme type de paramètre : connect(source, SIGNAL(stateChanged(QAudio::State)), ...);
void QAudioSink::stop()
Arrête la sortie audio et se déconnecte de la ressource système.
Définit error() sur QtAudio::NoError, state() sur QtAudio::StoppedState et émet le signal stateChanged().
Remarque : sous Linux et Darwin, cette opération vide de manière synchrone le tampon audio sous-jacent, ce qui peut entraîner des retards proportionnels à la taille de la charge utile du tampon. Pour réinitialiser immédiatement tous les tampons, utilisez plutôt la méthode reset.
Voir également reset().
void QAudioSink::suspend()
Arrête le traitement des données audio tout en conservant les données audio mises en mémoire tampon.
Définit la fonction ` 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.