Método IAudioClient::Initialize (audioclient.h)

El método Initialize inicializa la secuencia de audio.

Sintaxis

HRESULT Initialize(
  [in] AUDCLNT_SHAREMODE  ShareMode,
  [in] DWORD              StreamFlags,
  [in] REFERENCE_TIME     hnsBufferDuration,
  [in] REFERENCE_TIME     hnsPeriodicity,
  [in] const WAVEFORMATEX *pFormat,
  [in] LPCGUID            AudioSessionGuid
);

Parámetros

[in] ShareMode

Modo de uso compartido de la conexión. A través de este parámetro, el cliente indica al motor de audio si desea compartir el dispositivo de punto de conexión de audio con otros clientes. El cliente debe establecer este parámetro en uno de los siguientes AUDCLNT_SHAREMODE valores de enumeración:

AUDCLNT_SHAREMODE_EXCLUSIVE

AUDCLNT_SHAREMODE_SHARED

[in] StreamFlags

Marcas para controlar la creación de la secuencia. El cliente debe establecer este parámetro en 0 o en el OR bit a bit de una o varias de las constantes de AUDCLNT_STREAMFLAGS_XXX o constantes de AUDCLNT_SESSIONFLAGS_XXX.

[in] hnsBufferDuration

Capacidad del búfer como valor de hora. Este parámetro es de tipo REFERENCE_TIME y se expresa en unidades de 100 nanosegundos. Este parámetro contiene el tamaño del búfer que el autor de la llamada solicita para el búfer que la aplicación de audio compartirá con el motor de audio (en modo compartido) o con el dispositivo de punto de conexión (en modo exclusivo). Si la llamada se realiza correctamente, el método asigna un búfer que es al menos este grande. Para obtener más información sobre REFERENCE_TIME, consulte la documentación de Windows SDK. Para obtener más información sobre los requisitos de almacenamiento en búfer, vea Comentarios.

[in] hnsPeriodicity

Período del dispositivo. Este parámetro solo puede ser distinto de cero en modo exclusivo. En modo compartido, establezca siempre este parámetro en 0. En modo exclusivo, este parámetro especifica el período de programación solicitado para los accesos sucesivos del búfer por parte del dispositivo de punto de conexión de audio. Si el período de dispositivo solicitado se encuentra fuera del intervalo establecido por el período mínimo del dispositivo y el período máximo del sistema, el método fija el período en ese intervalo. Si este parámetro es 0, el método establece el período del dispositivo en su valor predeterminado. Para obtener el período de dispositivo predeterminado, llame al método IAudioClient::GetDevicePeriod . Si se establece la marca de flujo de AUDCLNT_STREAMFLAGS_EVENTCALLBACK y AUDCLNT_SHAREMODE_EXCLUSIVE se establece como ShareMode, hnsPeriodicity debe ser distinto de cero y igual a hnsBufferDuration.

[in] pFormat

Puntero a un descriptor de formato. Este parámetro debe apuntar a un descriptor de formato válido de tipo WAVEFORMATEX (o WAVEFORMATEXTENSIBLE). Para obtener más información, vea la sección Comentarios.

[in] AudioSessionGuid

Puntero a un GUID de sesión. Este parámetro apunta a un valor GUID que identifica la sesión de audio a la que pertenece la secuencia. Si el GUID identifica una sesión que se ha abierto anteriormente, el método agrega la secuencia a esa sesión. Si el GUID no identifica una sesión existente, el método abre una nueva sesión y agrega la secuencia a esa sesión. La secuencia sigue siendo miembro de la misma sesión durante su vigencia. Establecer este parámetro en NULL equivale a pasar un puntero a un valor de GUID_NULL.

Valor devuelto

Si el método se realiza correctamente, devuelve S_OK. Si se produce un error, los códigos de retorno posibles incluyen, entre otros, los valores que se muestran en la tabla siguiente.

Código devuelto Descripción
AUDCLNT_E_ALREADY_INITIALIZED
El objeto IAudioClient ya se ha inicializado.
AUDCLNT_E_WRONG_ENDPOINT_TYPE
La marca AUDCLNT_STREAMFLAGS_LOOPBACK está establecida, pero el dispositivo de punto de conexión es un dispositivo de captura, no un dispositivo de representación.
AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED
Nota Se aplica a Windows 7 y versiones posteriores.
 
El tamaño del búfer solicitado no está alineado. Este código se puede devolver para una representación o un dispositivo de captura si el autor de la llamada especificó AUDCLNT_SHAREMODE_EXCLUSIVE y las marcas de AUDCLNT_STREAMFLAGS_EVENTCALLBACK. El autor de la llamada debe llamar a Initialize de nuevo con el tamaño de búfer alineado. Para obtener más información, vea la sección Comentarios.
AUDCLNT_E_BUFFER_SIZE_ERROR
Nota Se aplica a Windows 7 y versiones posteriores.
 
Indica que el valor de duración del búfer solicitado por un cliente en modo exclusivo está fuera del intervalo. El valor de duración solicitado para el modo de extracción no debe ser superior a 5000 milisegundos; para el modo de inserción, el valor de duración no debe ser mayor que 2 segundos.
AUDCLNT_E_CPUUSAGE_EXCEEDED
Indica que la duración del paso del proceso superó el uso máximo de CPU. El motor de audio realiza un seguimiento del uso de CPU manteniendo el número de veces que la duración del paso del proceso supera el uso máximo de CPU. El uso máximo de CPU se calcula como porcentaje de la periodicidad del motor. El valor porcentual es el valor de limitación de CPU del sistema (dentro del intervalo del 10 % y el 90 %). Si no se encuentra este valor, se usa el valor predeterminado del 40 % para calcular el uso máximo de CPU.
AUDCLNT_E_DEVICE_INVALIDATED
El dispositivo de punto de conexión de audio se ha desconectado o el hardware de audio o los recursos de hardware asociados se han reconfigurado, deshabilitado, quitado o dejado de estar disponible para su uso.
AUDCLNT_E_DEVICE_IN_USE
El dispositivo de punto de conexión ya está en uso. El dispositivo se usa en modo exclusivo o el dispositivo se usa en modo compartido y el autor de la llamada pidió que usara el dispositivo en modo exclusivo.
AUDCLNT_E_ENDPOINT_CREATE_FAILED
El método no pudo crear el punto de conexión de audio para la representación o el dispositivo de captura. Esto puede ocurrir si el dispositivo de punto de conexión de audio se ha desconectado o el hardware de audio o los recursos de hardware asociados se han reconfigurado, deshabilitado, quitado o si no están disponibles para su uso.
AUDCLNT_E_INVALID_DEVICE_PERIOD
Nota Se aplica a Windows 7 y versiones posteriores.
 
Indica que el período de dispositivo solicitado por un cliente en modo exclusivo es superior a 5000 milisegundos.
AUDCLNT_E_UNSUPPORTED_FORMAT
El motor de audio (modo compartido) o el dispositivo de punto de conexión de audio (modo exclusivo) no admite el formato especificado.
AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED
El autor de la llamada solicita el uso en modo exclusivo del dispositivo de punto de conexión, pero el usuario ha deshabilitado el uso del modo exclusivo del dispositivo.
AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL
La marca AUDCLNT_STREAMFLAGS_EVENTCALLBACK está establecida, pero los parámetros hnsBufferDuration y hnsPeriodicity no son iguales.
AUDCLNT_E_SERVICE_NOT_RUNNING
El servicio de audio de Windows no se está ejecutando.
E_POINTER
El parámetro pFormat es NULL.
E_INVALIDARG
El parámetro pFormat apunta a una descripción de formato no válida; o la marca AUDCLNT_STREAMFLAGS_LOOPBACK está establecida, pero ShareMode no es igual a AUDCLNT_SHAREMODE_SHARED; o la marca AUDCLNT_STREAMFLAGS_CROSSPROCESS está establecida, pero ShareMode es igual a AUDCLNT_SHAREMODE_EXCLUSIVE.

Se realizó una llamada anterior a SetClientProperties con una categoría no válida para las secuencias de audio/representación.

E_OUTOFMEMORY
Memoria insuficiente

Comentarios

Después de activar una interfaz IAudioClient en un dispositivo de punto de conexión de audio, el cliente debe llamar correctamente a Initialize una vez y solo una vez para inicializar la secuencia de audio entre el cliente y el dispositivo. El cliente puede conectarse directamente al hardware de audio (modo exclusivo) o indirectamente a través del motor de audio (modo compartido). En la llamada Initialize , el cliente especifica el formato de datos de audio, el tamaño del búfer y la sesión de audio de la secuencia.

Nota En Windows 8, el primer uso de IAudioClient para acceder al dispositivo de audio debe estar en el subproceso STA. Las llamadas desde un subproceso de MTA pueden dar lugar a un comportamiento indefinido.
 
Un intento de crear una secuencia en modo compartido solo puede realizarse correctamente si el dispositivo de audio ya funciona en modo compartido o el dispositivo no se usa actualmente. Se produce un error al intentar crear una secuencia en modo compartido si el dispositivo ya está funcionando en modo exclusivo.

Si se inicializa una secuencia para ser controlada por eventos y en modo compartido, ShareMode se establece en AUDCLNT_SHAREMODE_SHARED y una de las marcas de flujo que se establecen incluye AUDCLNT_STREAMFLAGS_EVENTCALLBACK. Para este tipo de secuencia, la aplicación asociada también debe obtener un identificador realizando una llamada a IAudioClient::SetEventHandle. Cuando es el momento de retirar la secuencia, el motor de audio puede usar el identificador para liberar los objetos de secuencia. Si no se llama a IAudioClient::SetEventHandle antes de liberar los objetos de secuencia, puede provocar un retraso de varios segundos (un período de tiempo de espera) mientras el motor de audio espera un identificador disponible. Una vez expirado el período de tiempo de espera, el motor de audio libera los objetos de secuencia.

Si un intento de crear una secuencia en modo exclusivo se realiza correctamente depende de varios factores, incluida la disponibilidad del dispositivo y la configuración controlada por el usuario que rigen el funcionamiento del modo exclusivo del dispositivo. Para obtener más información, vea Secuencias en modo exclusivo.

Un objeto IAudioClient admite exactamente una conexión con el motor de audio o el hardware de audio. Esta conexión dura la duración del objeto IAudioClient .

El cliente solo debe llamar a los métodos siguientes después de llamar a Initialize:

Los métodos siguientes no requieren que initialize se llame primero: Se puede llamar a estos métodos en cualquier momento después de activar la interfaz IAudioClient .

Antes de llamar a Initialize para configurar una conexión en modo compartido o modo exclusivo, el cliente puede llamar al método IAudioClient::IsFormatSupported para detectar si el dispositivo de punto de conexión de audio o de audio admite un formato determinado en ese modo. Antes de abrir una conexión en modo compartido, el cliente puede obtener el formato de combinación del motor de audio llamando al método IAudioClient::GetMixFormat .

El búfer de punto de conexión que se comparte entre el cliente y el motor de audio debe ser lo suficientemente grande como para evitar que se produzcan problemas en la secuencia de audio entre los pasos de procesamiento por el cliente y el motor de audio. Para un punto de conexión de representación, el subproceso de cliente escribe periódicamente datos en el búfer y el subproceso del motor de audio lee periódicamente los datos del búfer. Para un punto de conexión de captura, el subproceso del motor escribe periódicamente en el búfer y el subproceso de cliente lee periódicamente desde el búfer. En cualquier caso, si los períodos del subproceso de cliente y el subproceso del motor no son iguales, el búfer debe ser lo suficientemente grande como para dar cabida a la duración de los dos períodos sin permitir que se produzcan problemas.

El cliente especifica un tamaño de búfer a través del parámetro hnsBufferDuration . El cliente es responsable de solicitar un búfer lo suficientemente grande como para asegurarse de que los problemas no se pueden producir entre los pasos de procesamiento periódicos que realiza en el búfer. Del mismo modo, el método Initialize garantiza que el búfer nunca sea menor que el tamaño mínimo del búfer necesario para asegurarse de que los problemas no se producen entre los pasos de procesamiento periódicos que realiza el subproceso del motor en el búfer. Si el cliente solicita un tamaño de búfer menor que el tamaño mínimo necesario del búfer del motor de audio, el método establece el tamaño del búfer en este tamaño de búfer mínimo en lugar del tamaño de búfer solicitado por el cliente.

Si el cliente solicita un tamaño de búfer (a través del parámetro hnsBufferDuration ) que no es un número entero de fotogramas de audio, el método redondea el tamaño del búfer solicitado al siguiente número entero de fotogramas.

Después de la llamada Initialize , el cliente debe llamar al método IAudioClient::GetBufferSize para obtener el tamaño preciso del búfer del punto de conexión. Durante cada paso de procesamiento, el cliente necesitará el tamaño real del búfer para calcular la cantidad de datos que se van a transferir a o desde el búfer. El cliente llama al método IAudioClient::GetCurrentPadding para determinar la cantidad de datos del búfer que está disponible actualmente para su procesamiento.

Para lograr la latencia de secuencia mínima entre la aplicación cliente y el dispositivo de punto de conexión de audio, el subproceso de cliente debe ejecutarse en el mismo período que el subproceso del motor de audio. El período del subproceso del motor es fijo y no se puede controlar mediante el cliente. Hacer que el período del cliente sea menor que el período del motor aumenta innecesariamente la carga del subproceso de cliente en el procesador sin mejorar la latencia ni reducir el tamaño del búfer. Para determinar el período del subproceso del motor, el cliente puede llamar al método IAudioClient::GetDevicePeriod . Para establecer el búfer en el tamaño mínimo requerido por el subproceso del motor, el cliente debe llamar a Initialize con el parámetro hnsBufferDuration establecido en 0. Después de la llamada Initialize , el cliente puede obtener el tamaño del búfer resultante llamando a IAudioClient::GetBufferSize.

Un cliente tiene la opción de solicitar un tamaño de búfer mayor que lo estrictamente necesario para hacer que los problemas de tiempo sean poco frecuentes o inexistentes. El aumento del tamaño del búfer no aumenta necesariamente la latencia del flujo. Para una secuencia de representación, la latencia a través del búfer se determina únicamente por la separación entre el puntero de escritura del cliente y el puntero de lectura del motor. Para una secuencia de captura, la latencia a través del búfer se determina únicamente por la separación entre el puntero de escritura del motor y el puntero de lectura del cliente.

La marca de bucle invertido (AUDCLNT_STREAMFLAGS_LOOPBACK) habilita el bucle invertido de audio. Un cliente solo puede habilitar el bucle invertido de audio en un punto de conexión de representación con una secuencia en modo compartido. El bucle invertido de audio se proporciona principalmente para admitir la cancelación acústica de eco (AEC).

Un cliente AEC requiere un punto de conexión de representación y la capacidad de capturar la secuencia de salida del motor de audio. El flujo de salida del motor es la combinación global que reproduce el dispositivo de audio a través de los altavoces. Si el bucle invertido de audio está habilitado, un cliente puede abrir un búfer de captura para la combinación de audio global llamando al método IAudioClient::GetService para obtener una interfaz IAudioCaptureClient en el objeto de secuencia de representación. Si el bucle invertido de audio no está habilitado, se producirá un error al intentar abrir un búfer de captura en una secuencia de representación. Los datos de bucle invertido en el búfer de captura están en el formato de dispositivo, que el cliente puede obtener consultando la propiedad PKEY_AudioEngine_DeviceFormat del dispositivo.

En las versiones de Windows anteriores a Windows 10, un cliente de captura en modo de extracción no recibirá ningún evento cuando se inicialice una secuencia con almacenamiento en búfer controlado por eventos (AUDCLNT_STREAMFLAGS_EVENTCALLBACK) y esté habilitado para bucle invertido (AUDCLNT_STREAMFLAGS_LOOPBACK). Si la secuencia se abre con esta configuración, la llamada Initialize se realiza correctamente, pero los eventos pertinentes no se generan para notificar al cliente de captura cada vez que un búfer está listo para su procesamiento. Para solucionar esto, inicialice una secuencia de representación en modo controlado por eventos. Cada vez que el cliente recibe un evento para la secuencia de representación, debe indicar al cliente de captura que ejecute el subproceso de captura que lee el siguiente conjunto de ejemplos del búfer del punto de conexión de captura. A partir de Windows 10, los identificadores de eventos pertinentes ahora se establecen para las secuencias habilitadas para bucle invertido que están activas.

Tenga en cuenta que todas las secuencias deben abrirse en modo compartido porque las secuencias en modo exclusivo no pueden funcionar en modo de bucle invertido. Para obtener más información sobre el bucle invertido de audio, consulte Grabación de bucle invertido.

La marca AUDCLNT_STREAMFLAGS_EVENTCALLBACK indica que el procesamiento del búfer de audio por parte del cliente se controlará por eventos. WASAPI admite el almacenamiento en búfer controlado por eventos para habilitar el procesamiento de baja latencia de secuencias en modo compartido y modo exclusivo.

La versión inicial de Windows Vista admite el almacenamiento en búfer controlado por eventos (es decir, el uso de la marca AUDCLNT_STREAMFLAGS_EVENTCALLBACK) solo para representar secuencias.

En la versión inicial de Windows Vista, para secuencias de captura, la marca AUDCLNT_STREAMFLAGS_EVENTCALLBACK solo se admite en modo compartido. Establecer esta marca no tiene ningún efecto para las secuencias de captura en modo exclusivo. Es decir, aunque la aplicación especifica esta marca en modo exclusivo a través de la llamada Initialize , la aplicación no recibirá ningún evento que normalmente sea necesario para capturar la secuencia de audio. En la versión de Windows Vista Service Pack 1, esta marca es funcional en modo compartido y modo exclusivo; una aplicación puede establecer esta marca para habilitar el almacenamiento en búfer de eventos para las secuencias de captura. Para obtener más información sobre cómo capturar una secuencia de audio, vea Capturar una secuencia.

Para habilitar el almacenamiento en búfer controlado por eventos, el cliente debe proporcionar un identificador de eventos al sistema. Después de la llamada Initialize y antes de llamar al método IAudioClient::Start para iniciar la secuencia, el cliente debe llamar al método IAudioClient::SetEventHandle para establecer el identificador de eventos. Mientras se ejecuta la secuencia, el sistema indica periódicamente el evento para indicar al cliente que los datos de audio están disponibles para su procesamiento. Entre los pasos de procesamiento, el subproceso de cliente espera en el identificador de eventos mediante una llamada a una función de sincronización como WaitForSingleObject. Para obtener más información sobre las funciones de sincronización, consulte la documentación de Windows SDK.

Para una secuencia en modo compartido que usa el almacenamiento en búfer controlado por eventos, el autor de la llamada debe establecer hnsPeriodicity y hnsBufferDuration en 0. El método Initialize determina el tamaño de un búfer que se va a asignar en función del período de programación del motor de audio. Aunque el subproceso de procesamiento del búfer del cliente está controlado por eventos, el proceso básico de administración del búfer, como se ha descrito anteriormente, no se modifica. Cada vez que el subproceso se activa, debe llamar a IAudioClient::GetCurrentPadding para determinar la cantidad de datos que se van a escribir en un búfer de representación o leer desde un búfer de captura. A diferencia de los dos búferes que el método Initialize asigna para una secuencia en modo exclusivo que usa el almacenamiento en búfer controlado por eventos, una secuencia en modo compartido requiere un único búfer.

Para una secuencia en modo exclusivo que usa el almacenamiento en búfer controlado por eventos, el autor de la llamada debe especificar valores distintos de cero para hnsPeriodicity y hnsBufferDuration, y los valores de estos dos parámetros deben ser iguales. El método Initialize asigna dos búferes para la secuencia. Cada búfer es igual a la duración del valor del parámetro hnsBufferDuration . Después de la llamada Initialize para una secuencia de representación, el autor de la llamada debe rellenar el primero de los dos búferes antes de iniciar la secuencia. Para una secuencia de captura, los búferes están inicialmente vacíos y el autor de la llamada debe suponer que cada búfer permanece vacío hasta que se señala el evento de ese búfer. Mientras se ejecuta la secuencia, el sistema envía alternativamente un búfer u otro al cliente; esta forma de almacenamiento en búfer doble se conoce como "ping-ponging". Cada vez que el cliente recibe un búfer del sistema (que el sistema indica mediante la señalización del evento), el cliente debe procesar todo el búfer. Por ejemplo, si el cliente solicita un tamaño de paquete desde el método IAudioRenderClient::GetBuffer que no coincide con el tamaño del búfer, se produce un error en el método . Las llamadas al método IAudioClient::GetCurrentPadding no son necesarias porque el tamaño del paquete siempre debe ser igual al tamaño del búfer. A diferencia de los modos de almacenamiento en búfer descritos anteriormente, la latencia de un flujo de modo exclusivo controlado por eventos depende directamente del tamaño del búfer.

Como se explica en Sesiones de audio, el comportamiento predeterminado de una sesión que contiene secuencias de representación es que su configuración de volumen y silenciación persiste en los reinicios de la aplicación. La marca AUDCLNT_STREAMFLAGS_NOPERSIST invalida el comportamiento predeterminado y hace que la configuración no sea persistente. Esta marca no tiene ningún efecto en las sesiones que contienen flujos de captura; la configuración de esas sesiones nunca es persistente. Además, la configuración de una sesión que contiene una secuencia de bucle invertido (una secuencia que se inicializa con la marca AUDCLNT_STREAMFLAGS_LOOPBACK) no es persistente.

Solo una sesión que se conecta a un dispositivo de punto de conexión de representación puede tener una configuración de volumen persistente y silenciar. La primera secuencia que se va a agregar a la sesión determina si la configuración de la sesión es persistente. Por lo tanto, si la marca AUDCLNT_STREAMFLAGS_NOPERSIST o AUDCLNT_STREAMFLAGS_LOOPBACK se establece durante la inicialización de la primera secuencia, la configuración de la sesión no es persistente. De lo contrario, son persistentes. Su persistencia no se ve afectada por secuencias adicionales que podrían agregarse o quitarse posteriormente durante la vigencia del objeto de sesión.

Después de que una llamada a Initialize haya inicializado correctamente una instancia de interfaz IAudioClient , se producirá un error en una llamada posterior a Initialize para inicializar la misma instancia de interfaz y se devolverá el código de error E_ALREADY_INITIALIZED.

Si se produce un error en la llamada inicial a Initialize , las llamadas posteriores a Initialize podrían producir un error y devolver el código de error E_ALREADY_INITIALIZED, aunque la interfaz no se haya inicializado. Si esto ocurre, libere la interfaz IAudioClient y obtenga una nueva interfaz IAudioClient de la API MMDevice antes de llamar a Initialize de nuevo.

Para obtener ejemplos de código que llaman al método Initialize , consulte los temas siguientes:

A partir de Windows 7, Initialize puede devolver AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED para una representación o un dispositivo de captura. Esto indica que el tamaño del búfer, especificado por el autor de la llamada en el parámetro hnsBufferDuration , no está alineado. Este código de error solo se devuelve si el autor de la llamada solicitó una secuencia en modo exclusivo (AUDCLNT_SHAREMODE_EXCLUSIVE) y el almacenamiento en búfer controlado por eventos (AUDCLNT_STREAMFLAGS_EVENTCALLBACK).

Si Initialize devuelve AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED, el autor de la llamada debe llamar a Initialize de nuevo y especificar el tamaño del búfer alineado. Siga estos pasos:

  1. Llame a IAudioClient::GetBufferSize y reciba el siguiente tamaño de búfer alineado más alto (en fotogramas).
  2. Llame a IAudioClient::Release para liberar el cliente de audio usado en la llamada anterior que devolvió AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED.
  3. Calcule el tamaño del búfer alineado en unidades de 100 nanosegundos (hns). El tamaño del búfer es (REFERENCE_TIME)((10000.0 * 1000 / WAVEFORMATEX.nSamplesPerSecond * nFrames) + 0.5). En esta fórmula, nFrames es el tamaño del búfer recuperado por GetBufferSize.
  4. Llame al método IMMDevice::Activate con el parámetro iid establecido en REFIID IID_IAudioClient para crear un nuevo cliente de audio.
  5. Llame a Initialize (Inicializar ) de nuevo en el cliente de audio creado y especifique el nuevo tamaño del búfer y la periodicidad.

A partir de Windows 10, las secuencias de audio descargadas por hardware deben estar controladas por eventos. Esto significa que si llama a IAudioClient2::SetClientProperties y establece el parámetro bIsOffload de AudioClientProperties en TRUE, debe especificar la marca AUDCLNT_STREAMFLAGS_EVENTCALLBACK en el parámetro StreamFlags en IAudioClient::Initialize.

Ejemplos

En el código de ejemplo siguiente se muestra cómo responder al código de devolución AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED .

#define REFTIMES_PER_SEC  10000000

HRESULT CreateAudioClient(IMMDevice* pDevice, IAudioClient** ppAudioClient)
{
    if (!pDevice)
    {
        return E_INVALIDARG;
    }

    if (!ppAudioClient)
    {
        return E_POINTER;
    }

    HRESULT hr = S_OK;
    
    WAVEFORMATEX *pwfx = NULL;

    REFERENCE_TIME hnsRequestedDuration = REFTIMES_PER_SEC;

    UINT32 nFrames = 0;

    IAudioClient *pAudioClient = NULL;

    // Get the audio client.
    CHECK_HR( hr = pDevice->Activate(
        __uuidof(IAudioClient), 
        CLSCTX_ALL,
        NULL, 
        (void**)&pAudioClient));

    // Get the device format.
    CHECK_HR( hr = pAudioClient->GetMixFormat(&pwfx));

    // Open the stream and associate it with an audio session.
    hr = pAudioClient->Initialize( 
        AUDCLNT_SHAREMODE_EXCLUSIVE,
        AUDCLNT_STREAMFLAGS_EVENTCALLBACK, 
        hnsRequestedDuration, 
        hnsRequestedDuration, 
        pwfx, 
        NULL);

    // If the requested buffer size is not aligned...
    if (hr == AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED)
    {	
        // Get the next aligned frame.
        CHECK_HR( hr = pAudioClient->GetBufferSize(&nFrames));
        
        hnsRequestedDuration = (REFERENCE_TIME)
        ((10000.0 * 1000 / pwfx->nSamplesPerSec * nFrames) + 0.5);

        // Release the previous allocations.
        SAFE_RELEASE(pAudioClient);
        CoTaskMemFree(pwfx);
        
        // Create a new audio client.
        CHECK_HR( hr = pDevice->Activate(
            __uuidof(IAudioClient), 
            CLSCTX_ALL,
            NULL, 
            (void**)&pAudioClient));
    
        // Get the device format.
        CHECK_HR( hr = pAudioClient->GetMixFormat(&pwfx));
        
        // Open the stream and associate it with an audio session.
        CHECK_HR( hr = pAudioClient->Initialize( 
            AUDCLNT_SHAREMODE_EXCLUSIVE,
            AUDCLNT_STREAMFLAGS_EVENTCALLBACK, 
            hnsRequestedDuration, 
            hnsRequestedDuration, 
            pwfx, 
            NULL));
    }
    else
    {
        CHECK_HR (hr);
    }
    
    // Return to the caller.
    *(ppAudioClient) = pAudioClient;
    (*ppAudioClient)->AddRef();

done:

    // Clean up.
    CoTaskMemFree(pwfx);
    SAFE_RELEASE(pAudioClient);
    return hr;
}

Requisitos

   
Plataforma de destino Windows
Encabezado audioclient.h

Consulte también

IAudioCaptureClient (Interfaz)

IAudioClient (interfaz)

IAudioClient::GetBufferSize

IAudioClient::GetCurrentPadding

IAudioClient::GetDevicePeriod

IAudioClient::GetMixFormat

IAudioClient::GetService

IAudioClient::SetEventHandle

IAudioClient::Start

IAudioRenderClient::GetBuffer