Compartilhar via


PKEY_AudioEngine_OEMFormat

No Windows Vista e posteriores, a PKEY_AudioEngine_OEMFormat chave de propriedade identifica o formato de fluxo padrão para um dispositivo de ponto de extremidade de áudio. Os dispositivos de renderização e captura têm formatos padrão. O mecanismo de áudio global usa o formato padrão de um dispositivo para se conectar ao dispositivo para operação de modo compartilhado. O arquivo INF que instala o dispositivo carrega o formato padrão do dispositivo no registro. O usuário pode alterar o formato padrão por meio do painel de controle multimídia do Windows (Mmsys.cpl). O Windows XP e as versões anteriores do Windows não dão suporte à chave de propriedade PKEY_AudioEngine_OEMFormat .

Um arquivo INF especifica o formato padrão para um dispositivo de ponto de extremidade de áudio na seção add-registry para esse dispositivo. O exemplo inf a seguir mostra uma seção add-registry que carrega o formato padrão de um dispositivo de ponto de extremidade no 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

O exemplo anterior é obtido do arquivo Sysfx.inf no exemplo de áudio Sysfx no Kit de Driver do Windows. A seção Strings deste arquivo INF contém as definições a seguir.

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"

No exemplo anterior, o nome da seção add-registry, OEMSettingsOverride.AddReg, é definido por uma diretiva AddReg em uma seção de instalação de interface no Sysfx.inf. O exemplo anterior adiciona várias propriedades do número 0 do ponto de extremidade (identificado pela cadeia de caracteres "EP\\0") à entrada do Registro para a interface do dispositivo. (Se uma interface do dispositivo representar um filtro de onda com mais de um ponto de extremidade, os pontos de extremidade adicionais serão numerados 1, 2 e assim por diante.) Para obter mais informações sobre as seções de instalação da interface, consulte Diretiva AddInterface do INF.

Depois que o arquivo INF tiver criado as três chaves de propriedade e carregado seus valores associados no registro, os aplicativos poderão acessar as propriedades obtendo a interface IPropertyStore para o dispositivo de ponto de extremidade. O arquivo de cabeçalho Mmdeviceapi.h no SDK do Windows contém definições C/C++ das três chaves de propriedade. Para obter mais informações sobre como obter a interface IPropertyStore, consulte a descrição do método IMMDevice::OpenPropertyStore na documentação do SDK do Windows.

No exemplo inf anterior, a chave de propriedade PKEY_AudioEndpoint_Association identifica o GUID da categoria de pino KS para o dispositivo de ponto de extremidade. A PKEY_AudioEndpoint_ControlPanelProvider chave de propriedade identifica o GUID de classe para o objeto de interface COM que fornece os valores de propriedade para a página de propriedades em Mmsys.cpl para o dispositivo de ponto de extremidade. Para obter mais informações sobre essas chaves de propriedade, consulte a documentação do SDK do Windows. Para obter mais informações sobre GUIDs de categoria de pino KS, consulte Fixar propriedade category.

No exemplo inf anterior, o valor da propriedade associado à chave de propriedade PKEY_AudioEngine_OEMFormat é um valor de REG_BINARY de 48 bytes que contém uma representação serializada da estrutura WAVEFORMATEX ou WAVEFORMATEXTENSIBLE que descreve o formato. Para calcular o valor de dados REG_BINARY a ser associado à chave de propriedade PKEY_AudioEngine_OEMFormat , insira a estrutura WAVEFORMATEX ou WAVEFORMATEXTENSIBLE em uma estrutura PropVariant e serialize a estrutura PropVariant chamando a função StgSerializePropVariant . Para obter mais informações sobre a estrutura PropVariant e a função StgSerializePropVariant , consulte a documentação do SDK do Windows.

O exemplo de código a seguir é um aplicativo de console que imprime os dados REG_BINARY que aparecem no exemplo 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);
}

A função main no exemplo de código anterior cria uma estrutura WAVEFORMATEXTENSIBLE para descrever o formato padrão. Você pode modificar a função main para criar uma estrutura WAVEFORMATEX ou WAVEFORMATEXTENSIBLE para descrever o formato padrão para seu dispositivo de ponto de extremidade.

A função PrintSerializedFormat no exemplo de código anterior serializa a descrição do formato e imprime a descrição do formato serializado como REG_BINARY dados. Você pode copiar a saída impressa produzida pela função e colá-la no arquivo INF.