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

앞의 예제는 Windows 드라이버 키트의 Sysfx 오디오 샘플에 있는 Sysfx.inf 파일에서 가져옵니다. 이 INF 파일의 Strings 섹션에는 다음 정의가 포함되어 있습니다.

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의 이름은 Sysfx.inf의 인터페이스 설치 섹션에서 AddReg 지시문에 의해 정의됩니다. 앞의 예제에서는 디바이스 인터페이스의 레지스트리 항목에 엔드포인트 번호 0("EP\\0" 문자열로 식별됨)의 여러 속성을 추가합니다. (디바이스 인터페이스가 둘 이상의 엔드포인트가 있는 웨이브 필터 를 나타내는 경우 추가 엔드포인트의 번호는 1, 2 등입니다.) 인터페이스 설치 섹션에 대한 자세한 내용은 INF AddInterface 지시문을 참조하세요.

INF 파일이 세 개의 속성 키를 만들고 연결된 값을 레지스트리에 로드한 후 애플리케이션은 엔드포인트 디바이스에 대한 IPropertyStore 인터페이스를 가져와 속성에 액세스할 수 있습니다. Windows SDK의 헤더 파일 Mmdeviceapi.h에는 세 개의 속성 키에 대한 C/C++ 정의가 포함되어 있습니다. IPropertyStore 인터페이스를 가져오는 방법에 대한 자세한 내용은 Windows SDK 설명서에서 IMMDevice::OpenPropertyStore 메서드에 대한 설명을 참조하세요.

앞의 INF 예제에서 PKEY_AudioEndpoint_Association 속성 키는 엔드포인트 디바이스에 대한 KS 핀 범주 GUID를 식별합니다. PKEY_AudioEndpoint_ControlPanelProvider 속성 키는 엔드포인트 디바이스에 대한 Mmsys.cpl 속성 페이지에 속성 값을 제공하는 COM 인터페이스 개체의 클래스 GUID를 식별합니다. 이러한 속성 키에 대한 자세한 내용은 Windows SDK 설명서를 참조하세요. KS 핀 범주 GUID에 대한 자세한 내용은 Pin Category Property를 참조하세요.

앞의 INF 예제에서 PKEY_AudioEngine_OEMFormat 속성 키와 연결된 속성 값은 형식을 설명하는 WAVEFORMATEX 또는 WAVEFORMATEXTENSIBLE 구조체의 직렬화된 표현을 포함하는 48 바이트 REG_BINARY 값입니다. PKEY_AudioEngine_OEMFormat 속성 키와 연결할 REG_BINARY 데이터 값을 계산하려면 WAVEFORMATEX 또는 WAVEFORMATEXTENSIBLE 구조체를 PropVariant 구조체에 포함하고 StgSerializePropVariant 함수를 호출하여 PropVariant 구조를 serialize합니다. PropVariant 구조체 및 StgSerializePropVariant 함수에 대한 자세한 내용은 Windows SDK 설명서를 참조하세요.

다음 코드 예제는 앞의 INF 예제에 나타나는 REG_BINARY 데이터를 출력하는 콘솔 애플리케이션입니다.

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

이전 코드 예제의 기본 함수는 기본 형식을 설명하는 WAVEFORMATEXTENSIBLE 구조를 만듭니다. 기본 함수를 수정하여 WAVEFORMATEX 또는 WAVEFORMATEXTENSIBLE 구조를 만들어 엔드포인트 디바이스의 기본 형식을 설명할 수 있습니다.

이전 코드 예제의 PrintSerializedFormat 함수는 형식 설명을 직렬화하고 직렬화된 형식 설명을 REG_BINARY 데이터로 출력합니다. 함수에서 생성된 인쇄된 출력을 복사하여 INF 파일에 붙여넣을 수 있습니다.