API privada v2.0

07.02.21

Índice del Contenido

Introducción

El controlador ASIO4ALL proporciona una interfaz ASIO estándar a la aplicación host mediante la cual el host puede controlar ciertos aspectos del comportamiento del controlador. Otros aspectos, como la configuración del dispositivo WDM, no están cubiertos por los medios de control que se pueden lograr a través de una interfaz ASIO estándar. Teniendo en cuenta la necesidad de un mayor control (incluida la opción de que el OEM proporcione su propio reemplazo para la interfaz gráfica de usuario ASIO4ALL original), se creó una interfaz propietaria para el motor central ASIO4ALL.

El alcance de esta definición de interfaz se aplica a todas las versiones 2.x del software ASIO4ALL disponible gratuitamente a partir de la versión 2.9, así como a las compilaciones personalizadas para las que se haya especificado soporte para esta interfaz.

Accediendo a la interfaz

Dado que en Windows se accede a ASIO como un objeto de servidor en proceso COM, la elección de diseño obvia fue utilizar el mismo tipo de mecanismo también para la interfaz propietaria.

Una DLL de controlador con registro automático que admita la interfaz privada ASIO4ALL registrará esta última junto con la interfaz ASIO estándar en su rutina DLLRegisterServer. Los desarrolladores de aplicaciones pueden consultar cualquier IASIO existente para encontrar un IA4APRIVATE y, una vez descubierto, utilizar la funcionalidad proporcionada.

En consecuencia, crear una instancia de la interfaz privada ASIO4ALL es tan fácil como:

CoCreateInstance(IID_IASIO,0,1,IID_IA4APRIVATE, (LPVOID*) &ifcInstance);

  • ¡Vea el código constructor de la clase contenedora a4aInterface.cpp!

El CLSID de la interfaz (en CLSID.cpp) es {A26078C5-2840-4726-B427-E60FC8FEE403}.

La definición real de la interfaz así como todas las declaraciones asociadas están contenidas en COMÚN\iaa4aprv.h

Funciones miembro de la interfaz

DWORD iA4APrivateGetVersion()

Esta función se puede llamar en cualquier momento y devuelve la versión de la interfaz privada en formato codificado BCD 0xMMMMmmmm, donde MMMM es el número de revisión principal y mmmm el número de revisión menor. Revisión 1.23 se codificaría como 0x00010023.

vacío iA4APrivateEnumerate()

Al llamar a esta función, el controlador volverá a ejecutar la enumeración de dispositivos de audio. Solo es seguro llamarla cuando el controlador se encuentra en estado inactivo (“inicializado” según la especificación ASIO). Esta función se utiliza normalmente después de que se haya instalado una devolución de llamada, ya que la devolución de llamada se invocaría inmediatamente después de la enumeración, lo que permite que la aplicación asuma el control de la configuración del dispositivo WDM.

vacío iA4APrivateEnumSetCallback(BOOL (vacío *), vacío * pCbData)

Instala una función de devolución de llamada que el controlador invocará inmediatamente después de la enumeración del dispositivo de audio. El argumento pCbData es un puntero a datos arbitrarios y se pasará a la función de devolución de llamada. Normalmente, esto apuntaría a datos de instancia, etc. La función de devolución de llamada se invoca siempre después de que el controlador haya finalizado su (re)enumeración interna del dispositivo WDM. ¡Use iA4APrivateEnumerate() para que el controlador vuelva a ejecutar la enumeración inmediatamente!

Si la función de devolución de llamada devuelve VERDADERO, el controlador volverá a ejecutar la enumeración una vez más. Por lo tanto, normalmente querrá devolver FALSO para evitar un bucle infinito.

¡Solo en el contexto de la función de devolución de llamada es seguro acceder a las propiedades del dispositivo de audio, la interfaz y el pin! El acceso a estas propiedades fuera de la función de devolución de llamada puede generar resultados impredecibles.

A4AError iA4APrivateGetDeviceProperty (A4ADeviceProperty DeviceProperty, índice de dispositivo largo, void *PropertyData, tamaño de datos largo)

Lee la propiedad DeviceProperty del dispositivo de audio enumerado DeviceIndex en el almacenamiento suministrado por el usuario PropertyData de tamaño DataSize.

¡Sólo se puede utilizar de forma segura en el contexto de una devolución de llamada de enumeración!

A4AError iA4APrivateSetDeviceProperty (A4ADeviceProperty DeviceProperty, índice de dispositivo largo, void *PropertyData, tamaño de datos largo)

Escribe la propiedad DeviceProperty del dispositivo de audio enumerado DeviceIndex del almacenamiento suministrado por el usuario PropertyData de tamaño DataSize.

¡Sólo se puede utilizar de forma segura en el contexto de una devolución de llamada de enumeración!

DeviceProperty puede ser cualquiera de los siguientes:

kA4A_Device_dwFlags [Tamaño de datos=4]

Este es un campo de bits con las siguientes definiciones de bits:

A4A_BANDERA_HWBUFFERHabilitar el método de acceso al búfer de hardware.
A4A_FUERZAS_DE_BANDERA_RCAplicar remuestreo de 44.1<-> 48 kHz
A4A_MODO_EXTRAER_BANDERAPermitir el modo “Pull” para dispositivos WaveRT, si es compatible.
A4A_FUERZA_BANDERA16Limite la profundidad de bits de la interfaz WDM a 16
A4A_BANDERA_EN_EJECUCIÓNIndica que el objeto está en estado “en ejecución”.
A4A_ERROR_BANDERAIndicador de error no especificado.
A4A_BANDERA_HABILITADAHabilitado en la configuración actual.

kA4A_Device_lpszName [Tamaño de datos=tamaño de (void*)]

Puntero a la cadena del nombre del dispositivo (tal como se obtiene del registro)

kA4A_Device_lpszVendorName [Tamaño de datos=tamaño de (void*)]

Puntero a la cadena con el nombre del proveedor (tal como se obtiene del registro)

kA4A_Device_lpszServiceName [Tamaño de datos=tamaño de (void*)]

Puntero a la cadena de nombre del servicio (tal como se obtiene del registro)

kA4A_Device_lpszLocationInfo [Tamaño de datos=tamaño de (void*)]

Puntero a la cadena de información de ubicación (tal como se obtiene del registro)

kA4A_Device_lpszDeviceID [Tamaño de datos=tamaño de (void*)]

Puntero a la cadena de identificación PnP (tal como se obtiene del registro)

kA4A_Device_dwBusNumber [Tamaño de datos=4]

Número de bus (tal como se obtiene del registro). En realidad, es una cadena de 3 caracteres con un cero al final.

kA4A_Device_dwKsBuffers [Tamaño de datos=4]

Número de buffers de kernel a utilizar.

kA4A_Device_dwIoDelay [Tamaño de datos=4]

Desplazamiento de retardo en el búfer de hardware (ms).

kA4A_Device_dwInputComp [Tamaño de datos=4]

Compensación de latencia de entrada (muestras)

kA4A_Device_dwOutputComp [Tamaño de datos=4]

Compensación de latencia de salida (muestras)

kA4A_Device_dwBufferSize [Tamaño de datos=4]

Tamaño del búfer ASIO (muestras) para este dispositivo.

A4AError iA4APrivateGetInterfaceProperty (A4AInterfaceProperty InterfaceProperty, índice de dispositivo largo, índice de interfaz largo, void *PropertyData, tamaño de datos largo)

Lee la propiedad InterfaceProperty de la interfaz del dispositivo enumerado InterfaceIndex en el dispositivo de audio enumerado DeviceIndex en el almacenamiento suministrado por el usuario PropertyData de tamaño DataSize.

¡Sólo se puede utilizar de forma segura en el contexto de una devolución de llamada de enumeración!

A4AError iA4APrivateSetInterfaceProperty(A4AInterfaceProperty InterfaceProperty, índice de dispositivo largo, índice de interfaz largo, void *PropertyData, tamaño de datos largo)

Escribe la propiedad InterfaceProperty de la interfaz del dispositivo enumerado InterfaceIndex en el dispositivo de audio enumerado DeviceIndex del almacenamiento suministrado por el usuario PropertyData de tamaño DataSize.

¡Sólo se puede utilizar de forma segura en el contexto de una devolución de llamada de enumeración!

Propiedad de interfazPuede ser cualquiera de los siguientes:

kA4A_Interface_dwFlags [Tamaño de datos=4]

Este es un campo de bits con las siguientes definiciones de bits:

A4A_BANDERA_RTAUDIOIndica que la interfaz es WaveRT.
A4A_BANDERA_EN_EJECUCIÓNIndica que el objeto está en estado “en ejecución”.
A4A_ERROR_BANDERAIndicador de error no especificado.
A4A_BANDERA_HABILITADAHabilitado en la configuración actual.

kA4A_Interface_lpszName [Tamaño de datos=tamaño de (void*)]

Cadena de nombre de interfaz obtenida del registro.

kA4A_Interface_pSPDIDD [Tamaño de datos=tamaño de (void*)]

Puntero a la estructura SP_DEVICE_INTERFACE_DETAIL_DATA para esta interfaz de dispositivo, consulte Windows DDK para la definición de la estructura.

kA4A_Interface_dwProperties [Tamaño de datos=4]

Características físicas de la interfaz del dispositivo. Pueden ser cualquiera de las siguientes:

  • A4A_IFPROPERTY_ADC
  • A4A_IFPROPERTY_DAC
  • A4A_IFPROPERTY_SPDIF

A4AError iA4APrivateGetPinProperty (A4APinProperty PinProperty, índice de dispositivo largo, índice de interfaz largo, índice de pin largo, void *PropertyData, tamaño de datos largo)

Lee la propiedad PinProperty del pin de audio PinIndex en la interfaz del dispositivo enumerado InterfaceIndex en el dispositivo de audio enumerado DeviceIndex en el almacenamiento suministrado por el usuario PropertyData de tamaño DataSize.

¡Sólo se puede utilizar de forma segura en el contexto de una devolución de llamada de enumeración!

A4AError iA4APrivateSetPinProperty (A4APinProperty PinProperty, índice de dispositivo largo, índice de interfaz largo, índice de pin largo, void *PropertyData, tamaño de datos largo)

Escribe la propiedad PinProperty del pin de audio PinIndex en la interfaz del dispositivo enumerado InterfaceIndex en el dispositivo de audio enumerado DeviceIndex del almacenamiento suministrado por el usuario PropertyData de tamaño DataSize.

¡Sólo se puede utilizar de forma segura en el contexto de una devolución de llamada de enumeración!

Propiedad del pinPuede ser cualquiera de los siguientes:

kA4A_Pin_dwFlags [Tamaño de datos=4]

Este es un campo de bits con las siguientes definiciones de bits:

A4A_BANDERA_DISPONIBLEQueda al menos un caso posible.
A4A_BANDERA_EN_EJECUCIÓNIndica que el objeto está en estado “en ejecución”.
A4A_ERROR_BANDERAIndicador de error no especificado.
A4A_BANDERA_HABILITADAHabilitado en la configuración actual.

kA4A_Pin_dwDataFlow [Tamaño de datos=4]

Valores posibles:

  • KSPIN_DATAFLOW_IN (para “pin de salida”)
  • KSPIN_DATAFLOW_OUT (para “pin de entrada”)

 – ¡Consulte el DDK de Windows para obtener definiciones!

kA4A_Pin_dwMaxChannels [Tamaño de datos=4]

Máximo de canales PCM.

kA4A_Pin_dwMaxBits [Tamaño de datos=4]

Profundidad de bits máxima de audio.

kA4A_Pin_dwMinSR [Tamaño de datos=4]

Frecuencia mínima de muestreo (Hz).

kA4A_Pin_dwMaxSR [Tamaño de datos=4]

Frecuencia máxima de muestreo (Hz).

códigos de error

Las funciones que devuelven el tipo A4AError devolverán cualquiera de los siguientes:

A4A_PRIVADO_SIN_ERROR

La operación se completó con éxito.

A4A_REINGRESO_ENUMERADO_DE_ERROR_PRIVADO

Se intentó volver a ingresar a la enumeración de dispositivos mientras la enumeración de dispositivos ya estaba en progreso. La razón más probable es que una devolución de llamada instalada con iA4APrivateEnumSetCallback() intenta invocar iA4APrivateEnumerate(). ¡iA4APrivateEnumerate() nunca debe usarse dentro de la devolución de llamada!

A4A_ERROR_PRIVADO_CONTROLADOR_NO_INACTIVO

Se intentó acceder a los datos de enumeración mientras el controlador ASIO no estaba en estado inactivo. ¡Detenga todo el procesamiento de audio y solo entonces llame a iA4APrivateEnumerate()!

A4A_ERROR_PRIVADO_NO_HAY_TAL_OBJETO

El objeto (dispositivo, interfaz, pin) con el índice proporcionado no existe. Puede encontrarse legalmente con este error al enumerar objetos. Si este código se devuelve dentro de un bucle de enumeración, esto sería un indicador de que se ha llegado al final de la lista de dispositivos/interfaces/pins.

A4A_ERR_PRIVADO_ARGUMENTO_ILEGAL

Se ha pasado un argumento a la interfaz que está fuera de lo que puede manejar. Las posibles causas incluyen identificadores de propiedad fuera de rango, puntero NULL a datos de propiedad o un argumento de tamaño de datos demasiado pequeño para la propiedad solicitada.

 Aplicación de muestra

Se proporciona un proyecto de aplicación de muestra MSVC++ que demuestra el uso de la API descrita en este documento con el fin de administrar la configuración del dispositivo WDM desde el contexto de su aplicación.

Referencias

  1. Kit de desarrollo de software ASIO, Steinberg Media Technologies GmbH
  2. Kit de controladores de Windows, Microsoft, Corporación.
  3. Kit de desarrollo de software Win32, Microsoft, Corporación.
  4. Manual de instrucciones ASIO4ALL, Michael Tippach

Derechos de autor © 2003-2021, Michael Tippach

A menos que se acuerde lo contrario, no se ofrece garantía con respecto a la exactitud de la información proporcionada en este documento ni con respecto a futuros cambios en las interfaces y definiciones aquí descritas.

Todas las marcas comerciales utilizadas en este documento son propiedad totalmente reconocida de sus respectivos dueños y se utilizan únicamente con fines de identificación del producto.