次の方法で共有


PKEY_AudioEngine_OEMFormat

Windows Vista 以降では、 PKEY_AudioEngine_OEMFormat プロパティ キーによって、オーディオ エンドポイント デバイスの既定のストリーム形式が識別されます。 レンダリング デバイスとキャプチャ デバイスの両方に既定の形式があります。 グローバル オーディオ エンジンは、デバイスの既定の形式を使用して、共有モード操作のためにデバイスに接続します。 デバイスをインストールする INF ファイルは、デバイスの既定の形式をレジストリに読み込みます。 ユーザーは、Windows マルチメディア コントロール パネル (Mmsys.cpl) を使用して既定の形式を変更できます。 Windows XPおよびそれ以前のバージョンのWindowsでは、 PKEY_AudioEngine_OEMFormatプロパティキーはサポートされていません。

INF ファイルは、そのデバイスの追加レジストリ セクションのオーディオ エンドポイント デバイスの既定の形式を指定します。 次の INF の例は、エンドポイント デバイスの既定の形式をレジストリに読み込む add-registry セクションを示しています。

;;
;; 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 Driver Kit の 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"

前述の例では、Sysfx.infのインターフェイスインストールセクションのAddRegディレクティブによって、add-registryセクションの名前であるOEMSettingsOverride.AddRegが定義されています。 前の例では、デバイス インターフェイスのレジストリ エントリにエンドポイント番号 0 (文字列 "EP\\0" で識別される) のいくつかのプロパティを追加します。 (デバイスインターフェイスが複数のエンドポイントを持つ ウェーブ フィルターを表す場合、追加のエンドポイントには 1、2 などの番号が付けられます)。インターフェイスのインストールセクションの詳細については、「INF AddInterface ディレクティブ」を参照してください。

INFファイルが3つのプロパティキーを作成し、関連する値をレジストリにロードした後、アプリケーションは、エンドポイントデバイスのIPropertyStoreインタフェースを取得することで、プロパティにアクセスすることができます。 Windows SDK のヘッダー ファイル Mmdeviceapi.h には、3 つのプロパティ キーの 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 プロパティ」を参照してください。

前述のINFの例では、PKEY_AudioEngine_OEMFormatプロパティ・キーに関連付けられたプロパティ値は、フォーマットを記述するWAVEFORMATEXまたはWAVEFORMATEXTENSIBLE構造体のシリアライズ表現を含む48バイトのREG_BINARY値です。 PKEY_AudioEngine_OEMFormat プロパティ・キーに関連付ける REG_BINARY データ値を計算するには、WAVEFORMATEX または WAVEFORMATEXTENSIBLE 構造体を PropVariant 構造体に埋め込み、StgSerializePropVariant 関数を呼び出して PropVariant 構造体をシリアライズします。 についての詳細は、こちらをご覧ください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 ファイルに貼り付けることができます。