Поделиться через


PKEY_AudioEngine_OEMFormat

В Windows Vista и более поздних версиях ключ свойства PKEY_AudioEngine_OEMFormat определяет формат потока по умолчанию для конечного звукового устройства. Устройства отрисовки и записи имеют форматы по умолчанию. Глобальный обработчик звука использует формат устройства по умолчанию для подключения к устройству для работы в общем режиме. INF-файл, устанавливающий устройство, загружает формат устройства по умолчанию в реестр. Пользователь может изменить формат по умолчанию с помощью панели управления мультимедиа Windows (Mmsys.cpl). Windows XP и предыдущие версии Windows не поддерживают ключ свойства PKEY_AudioEngine_OEMFormat .

INF-файл указывает формат по умолчанию для конечного аудиоустройства в разделе реестра надстроек для этого устройства. В следующем примере INF показан раздел реестра надстроек, который загружает в реестр формат по умолчанию для устройства конечной точки.

;;
;; 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

Предыдущий пример взят из файла Sysfx.inf в примере звука Sysfx в комплекте драйверов Windows. Раздел Строки этого INF-файла содержит следующие определения.

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"

В предыдущем примере имя раздела надстройки реестра OEMSettingsOverride.AddReg определяется директивой AddReg в разделе установки интерфейса в Sysfx.inf. В предыдущем примере добавляется несколько свойств конечной точки с номером 0 (определяемой строкой "EP\\0") в запись реестра для интерфейса устройства. (Если интерфейс устройства представляет волновой фильтр с несколькими конечными точками, дополнительные конечные точки нумеруются 1, 2 и т. д.) Дополнительные сведения о разделах установки интерфейса см. в разделе Inf AddInterface Directive.

После того как INF-файл создаст три ключа свойств и загрузит связанные с ними значения в реестр, приложения могут получить доступ к свойствам, получив интерфейс IPropertyStore для устройства конечной точки. Файл заголовка Mmdeviceapi.h в Windows SDK содержит определения C/C++ трех ключей свойств. Дополнительные сведения о получении интерфейса IPropertyStore см. в описании метода IMMDevice::OpenPropertyStore в документации по Windows SDK.

В предыдущем примере INF ключ свойства PKEY_AudioEndpoint_Association идентифицирует GUID категории контактов KS для устройства конечной точки. Ключ свойства PKEY_AudioEndpoint_ControlPanelProvider определяет GUID класса для объекта COM-интерфейса, который предоставляет значения свойств на странице свойств в Mmsys.cpl для устройства конечной точки. Дополнительные сведения об этих ключах свойств см. в документации по Windows SDK. Дополнительные сведения о идентификаторах GUID категории закрепления KS см. в разделе Закрепление свойства категории.

В предыдущем примере INF значение свойства, связанное с ключом свойства PKEY_AudioEngine_OEMFormat , представляет собой 48-байтовое REG_BINARY значение, содержащее сериализованное представление структуры WAVEFORMATEX или WAVEFORMATEXTENSIBLE , описывающей формат . Чтобы вычислить REG_BINARY значение данных для связывания с ключом свойства PKEY_AudioEngine_OEMFormat , внедрите структуру WAVEFORMATEX или WAVEFORMATEXTENSIBLE в структуру PropVariant и сериализируйте структуру PropVariant , вызвав функцию StgSerializePropVariant . Дополнительные сведения о структуре PropVariant и функции StgSerializePropVariant см. в документации по Windows SDK.

Следующий пример кода представляет собой консольное приложение, которое выводит REG_BINARY данные, которые отображаются в предыдущем примере INF.

//
// 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);
}

Функция main в предыдущем примере кода создает структуру WAVEFORMATEXTENSIBLE для описания формата по умолчанию. Вы можете изменить функцию main, чтобы создать структуру WAVEFORMATEX или WAVEFORMATEXTENSIBLE, чтобы описать формат по умолчанию для устройства конечной точки.

Функция PrintSerializedFormat в предыдущем примере кода сериализует описание формата и выводит его в виде REG_BINARY данных. Вы можете скопировать печатные выходные данные, созданные функцией , и вставить их в INF-файл.