Win32 API 日本語リファレンス
ホームMedia.KernelStreaming › IKsJackDescription

IKsJackDescription

COM
IID4509f757-2d46-4637-8e62-ce7db944f57b継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

IKsJackDescription インターフェイスは、オーディオアダプター上のデバイスと、外部または内部のエンドポイントデバイス(たとえばマイクや CD プレーヤー)との間で物理的な接続を提供するジャックまたは内部コネクターに関する情報を提供します。

解説(Remarks)

オーディオエンドポイントデバイスが IKsJackDescription インターフェイスをサポートしている場合、Windows マルチメディアコントロールパネルである Mmsys.cpl はジャック情報を表示します。ジャック情報を表示するには、次の手順に従います。

  1. Mmsys.cpl を実行するには、コマンドプロンプトウィンドウを開き、次のコマンドを入力します。

    control mmsys.cpl

    あるいは、タスクバーの右側にある通知領域のスピーカーアイコンを右クリックし、再生デバイスまたは録音デバイスのいずれかを選択して Mmsys.cpl を実行することもできます。

  2. Mmsys.cpl ウィンドウが開いたら、再生デバイスの一覧または録音デバイスの一覧からデバイスを選択し、プロパティをクリックします。
  3. プロパティウィンドウが開いたら、全般をクリックします。選択したプロパティページにそのデバイスのジャック情報が表示される場合、そのデバイスは IKsJackDescription インターフェイスをサポートしています。プロパティページに「No jack information is available」というテキストが表示される場合、そのデバイスはこのインターフェイスをサポートしていません。
次のコード例は、オーディオエンドポイントデバイスの IKsJackDescription インターフェイスを取得する方法を示しています。
//-----------------------------------------------------------
// Get the IKsJackDescription interface that describes the
// audio jack or jacks that the endpoint device plugs into.
//-----------------------------------------------------------
#define EXIT_ON_ERROR(hres)  \
              if (FAILED(hres)) { goto Exit; }
#define SAFE_RELEASE(punk)  \
              if ((punk) != NULL)  \
                { (punk)->Release(); (punk) = NULL; }

HRESULT GetJackInfo(IMMDevice *pDevice,
                    IKsJackDescription **ppJackDesc)
{
    HRESULT hr = S_OK;
    IDeviceTopology *pDeviceTopology = NULL;
    IConnector *pConnFrom = NULL;
    IConnector *pConnTo = NULL;
    IPart *pPart = NULL;
    IKsJackDescription *pJackDesc = NULL;

    if (NULL != ppJackDesc)
    {
        *ppJackDesc = NULL;
    }
    if (NULL == pDevice || NULL == ppJackDesc)
    {
        return E_POINTER;
    }

    // Get the endpoint device's IDeviceTopology interface.
    hr = pDevice->Activate(__uuidof(IDeviceTopology), CLSCTX_ALL,
                           NULL, (void**)&pDeviceTopology);
    EXIT_ON_ERROR(hr)

    // The device topology for an endpoint device always
    // contains just one connector (connector number 0).
    hr = pDeviceTopology->GetConnector(0, &pConnFrom);
    EXIT_ON_ERROR(hr)

    // Step across the connection to the jack on the adapter.
    hr = pConnFrom->GetConnectedTo(&pConnTo);
    if (HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr)
    {
        // The adapter device is not currently active.
        hr = E_NOINTERFACE;
    }
    EXIT_ON_ERROR(hr)

    // Get the connector's IPart interface.
    hr = pConnTo->QueryInterface(__uuidof(IPart), (void**)&pPart);
    EXIT_ON_ERROR(hr)

    // Activate the connector's IKsJackDescription interface.
    hr = pPart->Activate(CLSCTX_INPROC_SERVER,
                         __uuidof(IKsJackDescription), (void**)&pJackDesc);
    EXIT_ON_ERROR(hr)

    *ppJackDesc = pJackDesc;

Exit:
    SAFE_RELEASE(pDeviceTopology)
    SAFE_RELEASE(pConnFrom)
    SAFE_RELEASE(pConnTo)
    SAFE_RELEASE(pPart)
    return hr;
}

上記のコード例では、GetJackInfo 関数は 2 つのパラメーターを取ります。入力パラメーター pDevice は、エンドポイントデバイスの IMMDevice インターフェイスを指します。出力パラメーター ppJackDesc は、インターフェイスが存在する場合に、対応する IKsJackDescription インターフェイスのアドレスを関数が書き込むポインター値を指します。インターフェイスが存在しない場合、関数は *ppJackDescNULL を書き込み、エラーコード E_NOINTERFACE を返します。

上記のコード例では、IMMDevice::Activate の呼び出しによって、エンドポイントデバイスの IDeviceTopology インターフェイスを取得します。エンドポイントデバイスのデバイストポロジには、アダプターデバイスに接続する単一のコネクター(コネクター番号 0)が含まれます。この接続の反対側では、アダプターデバイス上のコネクターが、エンドポイントデバイスの差し込み先となるオーディオジャックを表します。IDeviceTopology::GetConnector メソッドの呼び出しによってエンドポイントデバイス上のコネクターの IConnector インターフェイスを取得し、IConnector::GetConnectedTo メソッドの呼び出しによってアダプターデバイス上の対応するコネクターを取得します。最後に、IConnector::QueryInterface メソッドの呼び出しによってアダプターデバイスのコネクターの IPart インターフェイスを取得し、IPart::Activate メソッドの呼び出しによって、存在する場合はコネクターの IKsJackDescription インターフェイスを取得します。

メソッド 2

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT GetJackCount(DWORD* pcJacks)

GetJackCount メソッドは、オーディオエンドポイントデバイスへの接続に必要なジャックの数を取得します。

pcJacksDWORD*outコネクターに関連付けられたジャックの数をメソッドが書き込む UINT 変数へのポインター。

戻り値

メソッドが成功した場合は S_OK を返します。失敗した場合、返される可能性のあるコードには、以下の表に示す値が含まれますが、これらに限定されません。

戻り値 説明
E_POINTER
ポインター pcJacksNULL です。

解説(Remarks)

複数のチャネルを含むストリームを再生または録音するオーディオエンドポイントデバイスは、複数のジャック(物理コネクター)による接続を必要とする場合があります。

たとえば、6 チャネルのオーディオストリームを再生するサラウンドスピーカーのセットは、3 つのステレオジャックを必要とする場合があります。この例では、1 番目のジャックは前方左と前方右のスピーカー用のチャネルを伝送し、2 番目のジャックは前方中央と低周波効果(サブウーファー)のスピーカー用のチャネルを伝送し、3 番目のジャックは側方左と側方右のスピーカー用のチャネルを伝送します。

このメソッドを呼び出してジャック数を取得した後、各ジャックについて IKsJackDescription::GetJackDescription メソッドを 1 回ずつ呼び出して、ジャックの説明を取得します。

vtbl 4 HRESULT GetJackDescription(DWORD nJack, KSJACK_DESCRIPTION* pDescription)

GetJackDescription メソッドは、オーディオジャックの説明を取得します。

nJackDWORDinジャックのインデックス。接続が n 個のジャックで構成される場合、ジャックには 0 から n– 1 までの番号が付けられます。ジャックの数を取得するには、IKsJackDescription::GetJackCount メソッドを呼び出します。
pDescriptionKSJACK_DESCRIPTION*outジャックに関する情報を含む KSJACK_DESCRIPTION 型の構造体をメソッドが書き込む、呼び出し元が割り当てたバッファーへのポインター。バッファーのサイズは、少なくとも sizeof(KSJACK_DESCRIPTION) でなければなりません。

戻り値

メソッドが成功した場合は S_OK を返します。失敗した場合、返される可能性のあるコードには、以下の表に示す値が含まれますが、これらに限定されません。

戻り値 説明
E_INVALIDARG
パラメーター nJack が有効なジャックのインデックスではありません。
E_POINTER
ポインター pDescriptionNULL です。

解説(Remarks)

ユーザーがオーディオエンドポイントデバイスをジャックに差し込む、またはジャックから抜く必要がある場合、オーディオアプリケーションはこのメソッドから取得した説明情報を使用して、ユーザーがジャックを見つけるのを支援できます。この情報には次のものが含まれます。

詳細については、KSJACK_DESCRIPTION を参照してください。
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

出力引数:
#define global IID_IKsJackDescription "{4509F757-2D46-4637-8E62-CE7DB944F57B}"
#usecom global IKsJackDescription IID_IKsJackDescription "{}"
#comfunc global IKsJackDescription_GetJackCount        3 var
#comfunc global IKsJackDescription_GetJackDescription  4 int,var
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。