En esta página

QAudioSink Class

La clase QAudioSink proporciona una interfaz para enviar datos de audio a un dispositivo de salida de audio. Más...

Cabecera: #include <QAudioSink>
CMake: find_package(Qt6 REQUIRED COMPONENTS Multimedia)
target_link_libraries(mytarget PRIVATE Qt6::Multimedia)
qmake: QT += multimedia
Hereda: QObject

Funciones públicas

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

Señales

void stateChanged(QtAudio::State state)

Descripción detallada

Se puede construir una salida de audio con el dispositivo de salida de audio por defecto del sistema. También es posible crear QAudioSink con un QAudioDevice específico. Cuando crees la salida de audio, también debes enviar el QAudioFormat que se utilizará para la reproducción (consulta la descripción de la clase QAudioFormat para más detalles).

QAudioSink se puede utilizar en dos modos diferentes:

  • Utilizando un QIODevice desde un hilo de la aplicación
  • Usando una interfaz basada en callback desde el hilo de audio

Interfaz QIODevice

Comenzar a reproducir un flujo de audio es simplemente cuestión de llamar a start() con un QIODevice. QAudioSink obtendrá entonces los datos que necesita del dispositivo io. Así que reproducir un archivo de audio es tan simple como:

QFile sourceFile; // miembro de la clase.QAudioSink* sourceFile.setFileName("/tmp/test.raw"); sourceFile.open(QIODevice::ReadOnly);    QAudioFormat format; // Configura el formato, por ejemploformat.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); }

El archivo comenzará a reproducirse suponiendo que el sistema de audio y el dispositivo de salida lo soporten. Si no tiene suerte, compruebe qué pasa con la función error().

Después de que el archivo haya terminado de reproducirse, necesitamos detener el dispositivo:

void AudioOutputExample::stopAudioOutput()
{
    audio->stop();
    sourceFile.close();
    delete audio;
}

En un momento dado, el QAudioSink estará en uno de estos cuatro estados: activo, suspendido, parado o inactivo. Estos estados se describen en el enum QtAudio::State.

Modelo de subprocesos y almacenamiento en búfer

La interfaz QIODevice está diseñada para ser utilizada desde el hilo de la aplicación. Se utiliza un búfer de anillo libre de esperas para comunicarse con el hilo de audio. El tamaño de este ringbuffer puede configurarse con setBufferSize() y por defecto es de 250ms. El estado de este buffer puede ser consultado con bytesFree(). Si el ringbuffer se queda sin datos, el hilo de audio enviará silencio al dispositivo de audio y el estado cambiará a QtAudio::IdleState y volverá a QtAudio::ActiveState cuando haya más datos disponibles en QIODevice.

Interfaz de devolución de llamada

La forma preferida de conseguir una baja latencia de audio es utilizar la interfaz basada en callback. Te permite escribir datos de audio directamente en el dispositivo de audio sin tener que pasar por QIODevice. Esto se hace llamando a start() con una función callback que será llamada desde el hilo de audio. Esta función callback será llamada con un QSpan<SampleType> cada vez que el backend de audio requiera datos.

QAudioSink* audio; // Miembro de la clase.float phase; // Miembro de la clase.{ QAudioFormat format; // Configura el formato, ej.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(); // onda sinusoidal de 220 Hz audio->start([&phase, phaseIncrement] (QSpan<float> interleavedAudioBuffer) { // La llamada de retorno de audio no debe llamar a ninguna función que pueda estar potencialmente bloqueando // Llenar el buffer de audio con una onda sinusoidal const int sampleCount = interleavedAudioBuffer.¡size() / 2; // Estéreo, así que divide por 2 for(int i = 0; i < sampleCount; ++i) { float sample = std::sin(phase); interleavedAudioBuffer[i * 2] = sample; // Canal izquierdointerleavedAudioBuffer[i * 2 + 1] = sample; // Canal derechophase += phaseIncrement; // Incrementa la fase para la siguiente muestra} }); if (!audio->error() == QtAudio::Error::NoError) { // además de las otras firmas de start(), iniciar la  callback  de audio fallará si // * el backend no implementa IO basado en callback (la API está disponible en todas las //  principales  plataformas) // * la firma de la callback de audio no coincide con format.sampleFormat()
        qWarning() << "Error starting audio output:" << audio->errorString();
    } }

A diferencia de la interfaz basada en QIODevice, el QAudioSink solo puede estar en los estados active, suspend y stopped. La API setBufferSize() no está disponible cuando se usa el callback, el tamaño del argumento del callback es determinado por el backend de audio.

Nota: Esta API sólo está disponible en plataformas que admitan la API de devolución de llamada: CoreAudio de Apple (macOS, iOS, etc), Windows, Linux (utilizando el backend PulseAudio o PipeWire) y Android.

Nota: La llamada de retorno se realizará en un hilo de audio en tiempo real. Es importante asegurarse de que la llamada de retorno no se bloquea, ya que esto puede causar fallos de audio o caídas. Esto incluye realizar IO bloqueantes, bloquear mutexes, asignar memorias o cualquier otra operación que pueda bloquear. Para las mejores prácticas consulta el artículo de Ross Bencina Real-time audio programming 101: time waits for nothing. También considera el uso de clang's Realtime sanitizer para validar el callback de audio.

Estado y manejo de errores

Los cambios de estado se comunican a través de la señal stateChanged(). Puedes usar esta señal para, por ejemplo, actualizar el GUI de la aplicación; el ejemplo mundano aquí es cambiar el estado de un botón play/pause. Puedes solicitar un cambio de estado directamente con suspend(), stop(), reset(), resume(), y start().

El QAudioSink entrará en StoppedState cuando se encuentre un error. El error type puede ser recuperado con la función error(). Por favor vea el enum QtAudio::Error para una descripción de los posibles errores que son reportados. Llamando a stop() o reset() se restablecerá el estado de error a NoError.

Puede comprobar si hay errores conectándose a la señal 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;
    }
}

Véase también QAudioSource y QAudioDevice.

Documentación de las funciones miembro

[explicit] QAudioSink::QAudioSink(const QAudioFormat &format = QAudioFormat(), QObject *parent = nullptr)

Construye una nueva salida de audio y adjúntala a parent. El dispositivo de salida de audio por defecto se utiliza con los parámetros de salida format. Si format se inicializa por defecto, el formato se ajustará al formato preferido del dispositivo de audio.

[explicit] QAudioSink::QAudioSink(const QAudioDevice &audioDevice, const QAudioFormat &format = QAudioFormat(), QObject *parent = nullptr)

Construye una nueva salida de audio y adjúntala a parent. El dispositivo referenciado por audioDevice se utiliza con los parámetros de salida format. Si format se inicializa por defecto, el formato se ajustará al formato preferido de audioDevice.

[override virtual noexcept] QAudioSink::~QAudioSink()

Destruye esta salida de audio.

Esto liberará cualquier recurso del sistema utilizado y liberará cualquier búfer.

[since 6.10] qsizetype QAudioSink::bufferFrameCount() const

Devuelve el tamaño del búfer de audio en fotogramas.

Si se llama antes de start(), devuelve el valor predeterminado de la plataforma. Si se llama antes de start() pero antes se ha llamado a setBufferSize() o setBufferFrameCount() , devuelve el valor establecido por setBufferSize() o setBufferFrameCount(). Si se llama después de start(), devuelve el tamaño real del búfer que se está utilizando. Este puede no ser el que fue establecido previamente por setBufferSize() o setBufferFrameCount().

Esta función se introdujo en Qt 6.10.

Véase también setBufferFrameCount() y bufferSize.

qsizetype QAudioSink::bufferSize() const

Devuelve el tamaño del búfer de audio en bytes.

Si se llama antes de start(), devuelve el valor predeterminado de la plataforma. Si se llama antes de start() pero antes se ha llamado a setBufferSize() o setBufferFrameCount() , devuelve el valor establecido por setBufferSize() o setBufferFrameCount(). Si se llama después de start(), devuelve el tamaño real del búfer que se está utilizando. Este puede no ser el que se estableció previamente en setBufferSize() o setBufferFrameCount().

Véase también setBufferSize() y bufferFrameCount.

qsizetype QAudioSink::bytesFree() const

Devuelve el número de bytes libres disponibles en el buffer de audio.

Nota: El valor devuelto sólo es válido mientras se está en estado QtAudio::ActiveState o QtAudio::IdleState, de lo contrario devuelve cero.

Véase también framesFree.

qint64 QAudioSink::elapsedUSecs() const

Devuelve los microsegundos transcurridos desde que se llamó a start(), incluido el tiempo en los estados inactivo y suspendido.

QtAudio::Error QAudioSink::error() const

Devuelve el estado de error.

QAudioFormat QAudioSink::format() const

Devuelve la dirección QAudioFormat que se está utilizando.

[since 6.10] qsizetype QAudioSink::framesFree() const

Devuelve el número de fotogramas libres disponibles en el búfer de audio.

Nota: El valor devuelto sólo es válido mientras está en estado QtAudio::ActiveState o QtAudio::IdleState, de lo contrario devuelve cero.

Esta función se introdujo en Qt 6.10.

Véase también bytesFree.

bool QAudioSink::isNull() const

Devuelve true si la instancia QAudioSink es null, en caso contrario devuelve false.

qint64 QAudioSink::processedUSecs() const

Devuelve la cantidad de datos de audio procesados desde que se llamó a start() (en microsegundos).

void QAudioSink::reset()

Detiene inmediatamente la salida de audio y descarta cualquier dato de audio actualmente en los búferes. Todos los datos de audio pendientes enviados a QIODevice son ignorados.

Véase también stop().

void QAudioSink::resume()

Reanuda el procesamiento de datos de audio tras una llamada a suspend().

Establece state() al estado que tenía el sumidero cuando se llamó a suspend(). Esta función no hace nada si el estado del sumidero de audio no es QtAudio::SuspendedState().

[since 6.10] void QAudioSink::setBufferFrameCount(qsizetype value)

Establece el tamaño del búfer de audio en value en número de fotogramas.

Nota: Esta función puede ser llamada en cualquier momento antes de start(). Las llamadas a esta función se ignoran después de start(). No se debe asumir que el tamaño de búfer establecido es el tamaño de búfer real utilizado - llame a bufferFrameCount() en cualquier momento después de start() para devolver el tamaño de búfer real que se está utilizando.

Esta función se introdujo en Qt 6.10.

Véase también bufferFrameCount() y setBufferSize.

void QAudioSink::setBufferSize(qsizetype value)

Establece el tamaño del búfer de audio en value en bytes.

Nota: Esta función puede ser llamada en cualquier momento antes de start(). Las llamadas a esta función se ignoran después de start(). No se debe asumir que el tamaño de búfer establecido es el tamaño de búfer real utilizado - llame a bufferSize() en cualquier momento después de start() para devolver el tamaño de búfer real que se está utilizando.

Véase también bufferSize() y setBufferFrameCount.

void QAudioSink::setVolume(qreal volume)

Establece el volumen de salida en volume.

El volumen se escala linealmente de 0.0 (silencio) a 1.0 (volumen máximo). Los valores que queden fuera de este rango se bloquearán.

El volumen por defecto es 1.0.

Nota: Los ajustes del volumen cambiarán el volumen de este flujo de audio, no el volumen global.

Por lo general, los controles de volumen de la interfaz de usuario deben escalarse de forma no lineal. Por ejemplo, usar una escala logarítmica producirá cambios lineales en el volumen percibido, que es lo que un usuario esperaría normalmente de un control de volumen. Para más información, consulte QtAudio::convertVolume().

Véase también volume().

QIODevice *QAudioSink::start()

Devuelve un puntero al QIODevice interno que se está utilizando para transferir datos a la salida de audio del sistema. El dispositivo ya estará abierto y write() puede escribir datos directamente en él.

Nota: El puntero dejará de ser válido después de detener el flujo o si inicia otro flujo.

Si QAudioSink puede acceder al dispositivo de audio del sistema, state() devuelve QtAudio::IdleState, error() devuelve QtAudio::NoError y se emite la señal stateChanged().

Si se produce un problema durante este proceso, error() devuelve QtAudio::OpenError, state() devuelve QtAudio::StoppedState y se emite la señal stateChanged().

Véase también QIODevice y QIODevice interface.

[since 6.11] template <typename Callback, QtAudio::if_audio_sink_callback<Callback> = true> void QAudioSink::start(Callback &&cb)

Inicia el QAudioSink con una función callback que será llamada en un hilo de audio soft-realtime. El callback es un callable que toma un QSpan<SampleType> como argumento, SampleType tiene que coincidir con el QAudioFormat::SampleFormat del QAudioSink's formato. El intervalo debe llenarse con datos de audio intercalados.

Si QAudioSink se inicia correctamente, error() devuelve QtAudio::NoError.

Si se produce un problema durante este proceso, error() devuelve QtAudio::OpenError, state() devuelve QtAudio::StoppedState y se emite la señal stateChanged().

Nota: Esta API sólo está disponible en plataformas compatibles con la API de devolución de llamada: CoreAudio de Apple (macOS, iOS, etc), Windows, Linux (utilizando el backend PulseAudio o PipeWire) y Android.

Nota: La llamada de retorno se realizará en un hilo de audio en tiempo real. Es importante asegurarse de que la llamada de retorno no se bloquea, ya que esto puede causar fallos de audio o caídas. Esto incluye realizar IO bloqueantes, bloquear mutexes, asignar memorias o cualquier otra operación que pueda bloquear. Para las mejores prácticas consulta el artículo de Ross Bencina Real-time audio programming 101: time waits for nothing. Considera también el uso de clang's Realtime sanitizer para validar el callback de audio.

Esta función se introdujo en Qt 6.11.

Véase también Callback interface.

void QAudioSink::start(QIODevice *device)

Inicia la transferencia de datos de audio desde device a la salida de audio del sistema. El device debe haber sido abierto en los modos ReadOnly o ReadWrite.

Si el QAudioSink es capaz de emitir datos de audio con éxito, state() devuelve QtAudio::ActiveState, error() devuelve QtAudio::NoError y se emite la señal stateChanged().

Si se produce un problema durante este proceso, error() devuelve QtAudio::OpenError, state() devuelve QtAudio::StoppedState y se emite la señal stateChanged().

Véase también QIODevice y QIODevice interface.

QtAudio::State QAudioSink::state() const

Devuelve el estado del procesamiento de audio.

[signal] void QAudioSink::stateChanged(QtAudio::State state)

Esta señal se emite cuando el dispositivo state ha cambiado. Este es el estado actual de la salida de audio.

Nota: El espacio de nombres QtAudio se denominaba QAudio hasta Qt 6.6 inclusive. Las conexiones basadas en cadenas a esta señal tienen que usar QAudio::State como tipo de parámetro: connect(source, SIGNAL(stateChanged(QAudio::State)), ...);

void QAudioSink::stop()

Detiene la salida de audio, separándose del recurso del sistema.

Establece error() en QtAudio::NoError, state() en QtAudio::StoppedState y emite la señal stateChanged().

Nota: En Linux, y Darwin, esta operación vacía sincrónicamente el búfer de audio subyacente, lo que puede causar retrasos en consecuencia a la carga útil del búfer. Para restablecer todos los búferes inmediatamente, utilice en su lugar el método reset.

Véase también reset().

void QAudioSink::suspend()

Detiene el procesamiento de datos de audio, conservando los datos de audio almacenados en la memoria intermedia.

Establece state() en QtAudio::SuspendedState y emite la señal stateChanged().

qreal QAudioSink::volume() const

Devuelve el volumen entre 0.0 y 1.0 inclusive.

Véase también 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.