Compartir a través de


PKEY_AudioEngine_OEMFormat

En Windows Vista y versiones posteriores, la clave de propiedad PKEY_AudioEngine_OEMFormat identifica el formato de secuencia predeterminado para un dispositivo de punto de conexión de audio. Los dispositivos de representación y captura tienen formatos predeterminados. El motor de audio global usa el formato predeterminado de un dispositivo para conectarse al dispositivo para la operación en modo compartido. El archivo INF que instala el dispositivo carga el formato predeterminado del dispositivo en el registro. El usuario puede cambiar el formato predeterminado a través del panel de control multimedia de Windows (Mmsys.cpl). Windows XP y versiones anteriores de Windows no admiten la clave de propiedad PKEY_AudioEngine_OEMFormat .

Un archivo INF especifica el formato predeterminado para un dispositivo de punto de conexión de audio en la sección del registro de complementos para ese dispositivo. En el ejemplo INF siguiente se muestra una sección add-registry que carga el formato predeterminado para un dispositivo de punto de conexión en el Registro.

;;
;; Identify endpoint device as a set of speakers.
;; Set default format to 48-kHz, 16-bit stereo.
;; Add endpoint extension property page.
;;
[OEMSettingsOverride.AddReg]
HKR,"EP\\0", %PKEY_AudioEndpoint_Association%,,%KSNODETYPE_SPEAKER%
HKR,"EP\\0", %PKEY_AudioEngine_OEMFormat%, %REG_BINARY%, 41,00,00,00,28,00,00,00,
 FE,FF,02,00,80,BB,00,00,00,EE,02,00,04,00,10,00,16,00,10,00,03,00,00,00,01,00,
 00,00,00,00,10,00,80,00,00,AA,00,38,9B,71
HKR,"EP\\0", %PKEY_AudioEndpoint_ControlPanelProvider%,,%AUDIOENDPOINT_EXT_UI_CLSID

El ejemplo anterior se toma del archivo Sysfx.inf en el ejemplo de audio de Sysfx en el Kit de controladores de Windows. La sección Cadenas de este archivo INF contiene las siguientes definiciones.

PKEY_AudioEndpoint_ControlPanelProvider = "{1DA5D803-D492-4EDD-8C23-E0C0FFEE7F0E},1"
PKEY_AudioEndpoint_Association          = "{1DA5D803-D492-4EDD-8C23-E0C0FFEE7F0E},2"
PKEY_AudioEngine_OEMFormat              = "{E4870E26-3CC5-4CD2-BA46-CA0A9A70ED04},3"

En el ejemplo anterior, el nombre de la sección add-registry, OEMSettingsOverride.AddReg, se define mediante una directiva AddReg en una sección de instalación de interfaz en Sysfx.inf. En el ejemplo anterior se agregan varias propiedades del número de punto de conexión 0 (identificadas por la cadena "EP\\0") a la entrada del Registro para la interfaz del dispositivo. (Si una interfaz de dispositivo representa un filtro de onda con más de un punto de conexión, los puntos de conexión adicionales se numeran 1, 2, etc.). Para obtener más información sobre las secciones de instalación de la interfaz, vea INF AddInterface Directive.

Una vez que el archivo INF ha creado las tres claves de propiedad y cargado sus valores asociados en el registro, las aplicaciones pueden acceder a las propiedades obteniendo la interfaz IPropertyStore para el dispositivo de punto de conexión. El archivo de encabezado Mmdeviceapi.h en Windows SDK contiene definiciones de C/C++ de las tres claves de propiedad. Para obtener más información sobre cómo obtener la interfaz IPropertyStore, consulte la descripción del método IMMDevice::OpenPropertyStore en la documentación de Windows SDK.

En el ejemplo inf anterior, la clave de propiedad PKEY_AudioEndpoint_Association identifica el GUID de categoría de patilla KS para el dispositivo de punto de conexión. La clave de propiedad PKEY_AudioEndpoint_ControlPanelProvider identifica el GUID de clase para el objeto de interfaz COM que proporciona los valores de propiedad a la página de propiedades en Mmsys.cpl para el dispositivo de punto de conexión. Para obtener más información sobre estas claves de propiedad, consulte la documentación de Windows SDK. Para obtener más información sobre los GUID de categoría de patillas KS, vea Anclar propiedad de categoría.

En el ejemplo INF anterior, el valor de propiedad asociado a la clave de propiedad PKEY_AudioEngine_OEMFormat es un valor de REG_BINARY de 48 bytes que contiene una representación serializada de la estructura WAVEFORMATEX o WAVEFORMATEXTENSIBLE que describe el formato. Para calcular el valor de datos REG_BINARY que se va a asociar a la clave de propiedad PKEY_AudioEngine_OEMFormat, inserte la estructura WAVEFORMATEX o WAVEFORMATEXTENSIBLE en una estructura PropVariant y serialice la estructura PropVariant llamando a la función StgSerializePropVariant. Para obtener más información sobre la estructura PropVariant y la función StgSerializePropVariant , consulte la documentación de Windows SDK.

El ejemplo de código siguiente es una aplicación de consola que imprime los datos REG_BINARY que aparecen en el ejemplo inf anterior.

//
// Embed a WAVEFORMATEXTENSIBLE structure in a PropVariant
// container, and print the PropVariant structure as a
// serialized stream of bytes in REG_BINARY format.
//

#include <stdio.h>
#include <wtypes.h>
#include <propidl.h>
#include <propvarutil.h>
#include <mmreg.h>
#include <ks.h>
#include <ksmedia.h>

void PrintSerializedFormat(WAVEFORMATEX *pWfx)
{
    HRESULT hr;
    PROPVARIANT var;
    SERIALIZEDPROPERTYVALUE* pVal;
    ULONG cb;

    // Create a VT_BLOB from the WAVEFORMATEX structure.
    var.vt = VT_BLOB;
    var.blob.cbSize = sizeof(*pWfx) + pWfx->cbSize;
    var.blob.pBlobData = (BYTE*)pWfx;

    // Serialize the PROPVARIANT structure. The serialized byte stream
    // will eventually be written to the registry as REG_BINARY data.
    hr = StgSerializePropVariant(&var, &pVal, &cb);
    if (SUCCEEDED(hr))
    {
        // Write the binary data to stdout. Format the output so you can
        // copy and paste it directly into the INF file as REG_BINARY data.
        for (UINT i = 0; i < cb; i++)
        {
            BYTE b = ((BYTE*)pVal)[i];
            wprintf(L"%2.2X,", b);
        }

        wprintf(L"\n");
        CoTaskMemFree(pVal);
    }
}

//
// Use a WAVEFORMATEXTENSIBLE structure to specify the format
// for a 48-kHz, 16-bit, (2-channel) stereo audio stream.
//
void main()
{
    WAVEFORMATEXTENSIBLE wfx;

    wfx.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
    wfx.Format.nChannels = 2;
    wfx.Format.nSamplesPerSec = 48000;
    wfx.Format.nAvgBytesPerSec = 4*48000;
    wfx.Format.nBlockAlign = 4;
    wfx.Format.wBitsPerSample = 16;
    wfx.Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX);
    wfx.Samples.wValidBitsPerSample = 16;
    wfx.dwChannelMask = 3;
    wfx.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;

    PrintSerializedFormat(&wfx.Format);
}

La función principal del ejemplo de código anterior crea una estructura WAVEFORMATEXTENSIBLE para describir el formato predeterminado. Puede modificar la función principal para crear una estructura WAVEFORMATEX o WAVEFORMATEXTENSIBLE para describir el formato predeterminado para el dispositivo de punto de conexión.

La función PrintSerializedFormat del ejemplo de código anterior serializa la descripción del formato e imprime la descripción del formato serializado como REG_BINARY datos. Puede copiar la salida impresa generada por la función y pegarla en el archivo INF.