次の方法で共有


IAudioSessionEnumerator インターフェイス (audiopolicy.h)

IAudioSessionEnumerator インターフェイスは、オーディオ デバイス上のオーディオ セッションを列挙します。 セッション列挙子オブジェクトの IAudioSessionEnumerator インターフェイスへの参照を取得するには、アプリケーションで IAudioSessionManager2::GetSessionEnumerator を呼び出す必要があります。

継承

IAudioSessionEnumerator インターフェイスは、IUnknown インターフェイスから継承します。 IAudioSessionEnumerator には、次の種類のメンバーもあります。

メソッド

IAudioSessionEnumerator インターフェイスには、これらのメソッドがあります。

 
IAudioSessionEnumerator::GetCount

GetCount メソッドは、オーディオ デバイスで開かれているオーディオ セッションの合計数を取得します。
IAudioSessionEnumerator::GetSession

GetSession メソッドは、オーディオ セッション番号で指定されたオーディオ セッションを取得します。

解説

新しいセッションの作成時にアプリケーションに通知を受け取る場合は、 その IAudioSessionNotification の実装をセッション マネージャーに登録する必要があります。 登録が成功すると、セッション マネージャーはコールバックの形式でアプリケーションにセッション作成通知を送信します。 これらの通知には、新しく作成されたセッションの IAudioSessionControl ポインターへの参照が含まれています。

セッション列挙子は、各セッションの IAudioSessionControl ポインターへの参照を保持することで、現在のセッションの一覧を保持します。 ただし、セッション列挙子は 、IAudioSessionNotification を介して報告される新しいセッションを認識していない可能性があります。 その場合、アプリケーションはセッションの一部のリストにのみアクセスできます。 これは、セッション列挙子が初期化される前に IAudioSessionControl ポインター (コールバック内) が解放された場合に発生する可能性があります。 そのため、アプリケーションでオーディオ エンドポイントのセッションの完全なセットが必要な場合、アプリケーションは独自のリストを保持する必要があります。

アプリケーションは、セッション通知を受信し、現在のセッションの一覧を管理するために、次の手順を実行する必要があります。

  1. UI 以外のスレッドで を呼び出 CoInitializeEx(NULL, COINIT_MULTITHREADED) して、マルチスレッド アパートメント (MTA) モデルで COM を初期化します。 MTA が初期化されていない場合、アプリケーションはセッション マネージャーからセッション通知を受信しません。
    メモ アプリケーションのユーザー インターフェイスを実行するスレッドは、アパートメント スレッド モデルで初期化する必要があります。
     
  2. オーディオ エンドポイント デバイスから IAudioSessionManager2 インターフェイスをアクティブ化します。 パラメーター iidIID_IAudioSessionManager2 に設定して IMMDevice::Activate を呼び出します。 この呼び出しは、ppInterface パラメーターでセッション マネージャーの IAudioSessionManager2 インターフェイスへの参照を受け取ります。
  3. コールバック動作を提供するには、 IAudioSessionNotification インターフェイスを実装します。
  4. IAudioSessionManager2::RegisterSessionNotification を呼び出して、アプリケーションの IAudioSessionNotification の実装を登録します。
  5. IAudioSessionManager2::GetSessionEnumerator を呼び出して、セッション列挙子オブジェクトを作成して初期化します。 このメソッドは、エンドポイントで使用できる現在のセッションの一覧を生成し、リスト内の各セッションの IAudioSessionControl ポインターを追加します (まだ存在しない場合)。
  6. セッションの一覧を取得して列挙するには、前の手順で返された IAudioSessionEnumerator インターフェイスを使用します。 各セッションのセッション 制御は、 IAudioSessionEnumerator::GetSession を呼び出すことによって取得できます。 参照カウントを維持するには、セッション コントロールごとに AddRef を呼び出してください。
  7. アプリケーションがセッション作成通知を受け取ったら、新しいセッションの IAudioSessionControl ポインター ( IAudioSessionNotification::OnSessionCreated で受信) を既存のセッションの一覧に追加します。
アプリケーションは、このセッションの一覧を保持し、アプリケーションの要件に基づいてセッションの有効期間を管理するため、セッション制御オブジェクトにオーディオ システムによって適用される有効期限メカニズムはありません。

セッション コントロールは、アプリケーションが一覧のセッション コントロールへの参照を持っている限り有効です。

次のコード例は、セッション列挙子オブジェクトを作成し、セッションを列挙する方法を示しています。

HRESULT EnumSessions(IAudioSessionManager2* pSessionManager)
{
    if (!pSessionManager)
    {
        return E_INVALIDARG;
    }

    HRESULT hr = S_OK;
    
    int cbSessionCount = 0;
    LPWSTR pswSession = NULL;
    
    IAudioSessionEnumerator* pSessionList = NULL;
    IAudioSessionControl* pSessionControl = NULL;
    
    // Get the current list of sessions.
    CHECK_HR( hr = pSessionManager->GetSessionEnumerator(&pSessionList));
    
    // Get the session count.
    CHECK_HR( hr = pSessionList->GetCount(&cbSessionCount));

    for (int index = 0 ; index < cbSessionCount ; index++)
    {
        CoTaskMemFree(pswSession);
        SAFE_RELEASE(pSessionControl);
        
        // Get the <n>th session.
        CHECK_HR(hr = pSessionList->GetSession(index, &pSessionControl));

        CHECK_HR(hr = pSessionControl->GetDisplayName(&pswSession));

        wprintf_s(L"Session Name: %s\n", pswSession);
    }

done:
    CoTaskMemFree(pswSession);
    SAFE_RELEASE(pSessionControl);
    SAFE_RELEASE(pSessionList);

    return hr;

}

要件

   
サポートされている最小のクライアント Windows 7 [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows Server 2008 R2 [デスクトップ アプリのみ]
対象プラットフォーム Windows
ヘッダー audiopolicy.h

関連項目

コア オーディオ インターフェイス