DirectSound アプリケーションのデバイス ロール

Note

MMDevice API では、デバイス ロールがサポートされます。 ただし、Windows Vista のユーザー インターフェイスでは、この機能のサポートは実装されていません。 デバイス ロールのユーザー インターフェイスのサポートは、今後のバージョンの Windows で実装される可能性があります。 詳しくは、「Windows Vista のデバイス ロール」をご覧ください。

 

DirectSound API は、ユーザーが特定のデバイス ロールに割り当てたオーディオ エンドポイント デバイスをアプリケーションが選択するための手段を提供しません。 ただし、Windows Vista では、コア オーディオ API を DirectSound アプリケーションと組み合わせて使用し、デバイスの役割に基づいてデバイスを選択できます。 アプリケーションは、コア オーディオ API を利用することにより、特定のロールに割り当てられているオーディオ エンドポイント デバイスを識別して、エンドポイント デバイスの DirectSound デバイス GUID を取得し、DirectSoundCreate または DirectSoundCaptureCreate 関数を呼び出して、エンドポイント デバイスをカプセル化する IDirectSound または IDirectSoundCapture インターフェイス インスタンスを作成できます。 DirectSound の詳細については、Windows SDK のドキュメントを参照してください。

次のコード例は、特定のデバイス ロールに現在割り当てられているレンダリングまたはキャプチャ デバイスの DirectSound デバイス GUID を取得する方法を示しています。

//-----------------------------------------------------------
// Get the DirectSound or DirectSoundCapture device GUID for
// an audio endpoint device. If flow = eRender, the function
// gets the DirectSound device GUID for the rendering device
// with the specified device role. If flow = eCapture, the
// function gets the DirectSoundCapture device GUID for the
// capture device with the specified device role.
//-----------------------------------------------------------
#define EXIT_ON_ERROR(hr)  \
              if (FAILED(hr)) { goto Exit; }
#define SAFE_RELEASE(punk)  \
              if ((punk) != NULL)  \
                { (punk)->Release(); (punk) = NULL; }

HRESULT GetDirectSoundGuid(EDataFlow flow, ERole role, GUID* pDevGuid)
{
    HRESULT hr = S_OK;
    IMMDeviceEnumerator *pEnumerator = NULL;
    IMMDevice *pDevice = NULL;
    IPropertyStore *pProps = NULL;

    PROPVARIANT var;
    PropVariantInit(&var);

    if (pDevGuid == NULL)
    {
        return E_POINTER;
    }

    // Get a device enumerator for the audio endpoint
    // devices in the system.
    hr = CoCreateInstance(__uuidof(MMDeviceEnumerator),
                          NULL, CLSCTX_INPROC_SERVER,
                          __uuidof(IMMDeviceEnumerator),
                          (void**)&pEnumerator);
    EXIT_ON_ERROR(hr)

    // Get the endpoint device with the specified dataflow
    // direction (eRender or eCapture) and device role.
    hr = pEnumerator->GetDefaultAudioEndpoint(flow, role,
                                              &pDevice);
    EXIT_ON_ERROR(hr)

    hr = pDevice->OpenPropertyStore(STGM_READ, &pProps);
    EXIT_ON_ERROR(hr)

    // Get the DirectSound or DirectSoundCapture device GUID
    // (in WCHAR string format) for the endpoint device.
    hr = pProps->GetValue(PKEY_AudioEndpoint_GUID, &var);
    EXIT_ON_ERROR(hr)

    // Convert the WCHAR string to a GUID structure.
    hr = CLSIDFromString(var.pwszVal, pDevGuid);
    EXIT_ON_ERROR(hr)

Exit:
    PropVariantClear(&var);
    SAFE_RELEASE(pEnumerator);
    SAFE_RELEASE(pDevice);
    SAFE_RELEASE(pProps);
    return hr;
}

前のコード例では、GetDirectSoundGuid 関数は、データ フローの方向 (eRender または eCapture) とデバイス ロール (eConsole、eMultimedia、または eCommunications) を入力パラメーターとして受け取ります。 3 つ目のパラメーターは、アプリケーションが DirectSoundCreate または DirectSoundCaptureCreate 関数に入力パラメーターとして指定できるデバイス GUID を関数が書き込むポインターです。

前のコード例では、次の方法によって DirectSound デバイス GUID を取得します。

  • 指定されたデータ フロー方向とデバイス ロールを持つオーディオ エンドポイント デバイスを表す IMMDevice インターフェイス インスタンスを作成します。
  • オーディオ エンドポイント デバイスのプロパティ ストアを開く。
  • プロパティ ストアから PKEY_AudioEndpoint_GUID プロパティを取得する。 プロパティ値は、オーディオ エンドポイント デバイスの DirectSound デバイス GUID の文字列表現です。
  • CLSIDFromString 関数を呼び出して、デバイス GUID の文字列形式を GUID 構造に変換する。 CLSIDFromString の詳細については、Windows SDK のドキュメントを参照してください。

GetDirectSoundGuid 関数からデバイス GUID を取得した後、アプリケーションはこの GUID によって DirectSoundCreate または DirectSoundCaptureCreate を呼び出して、オーディオ エンドポイント デバイスをカプセル化する DirectSound レンダリングまたはキャプチャ デバイスを作成できます。 DirectSound は、この方法でデバイスを作成するとき、必ずデバイスのオーディオ ストリームを既定のセッション (セッション GUID 値 GUID_NULL によって識別されるプロセス固有のオーディオ セッション) に割り当てます。

ストリームをプロセス間オーディオ セッションまたは NULL 以外のセッション GUID を持つセッションにストリームを割り当てることがアプリケーションで求められる場合、前のコード例に示した手法を使用する代わりに、IMMDevice::Activate メソッドを呼び出して、IDirectSound または IDirectSoundCapture オブジェクトを作成する必要があります。 Activate メソッドを使用してストリームのプロセス間オーディオ セッションまたは NULL 以外のセッション GUID を指定する方法を示すコード例については、「DirectShow アプリケーションのデバイス ロール」をご覧ください。 このセクションのコード例は DirectShow フィルターを作成する方法を示していますが、わずかな変更を加えると、DirectSound デバイスを作成するようコードを調整できます。

前のコード例の GetDirectSoundGuid 関数は、CoCreateInstance 関数を呼び出して、システム内のオーディオ エンドポイント デバイスの列挙子を作成します。 呼び出し元のプログラムが COM ライブラリを 初期化するために CoInitialize 関数または CoInitializeEx 関数を以前に呼び出していない限り、CoCreateInstance 呼び出しは失敗します。 CoCreateInstanceCoInitializeCoInitializeEx の詳細については、Windows SDK のドキュメントを参照してください。

レガシ オーディオ API との相互運用性