次の方法で共有


クロスバーの操作

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]

ビデオ キャプチャ カードに複数の物理入力がある場合、またはデータに対して複数のハードウェア パスをサポートしている場合は、フィルター グラフにアナログ ビデオ クロスバー フィルターが含まれている可能性があります。 必要に応じ、Capture Graph Builder によってこのフィルターが自動的に追加されます。キャプチャ フィルターからアップストリームになります。 ハードウェアによっては、フィルター グラフにクロスバー フィルターの複数のインスタンスが含まれている場合があります。

クロスバー フィルターは、特定の入力を特定の出力にルーティングするために使用できる IAMCrossbar インターフェイスを公開します。 たとえば、ビデオ カードには同軸コネクタと S ビデオ入力が含まれます。 これらは、クロスバー フィルターの入力ピンとして表されます。 入力を選択するには、 IAMCrossbar::Route メソッドを使用して、対応する入力ピンをクロスバーの出力ピンにルーティングします。

グラフ内のクロスバー フィルターを見つけるには、 ICaptureGraphBuilder2::FindInterface メソッドを使用して 、IAMCrossbar をサポートするフィルターを検索できます。 たとえば、次のコードは 2 つのクロスバーを検索します。

// Search upstream for a crossbar.
IAMCrossbar *pXBar1 = NULL;
hr = pBuild->FindInterface(&LOOK_UPSTREAM_ONLY, NULL, pSrc,
        IID_IAMCrossbar, (void**)&pXBar1);
if (SUCCEEDED(hr)) 
{
    // Found one crossbar. Get its IBaseFilter interface.
    IBaseFilter *pFilter = NULL;
    hr = pXBar1->QueryInterface(IID_IBaseFilter, (void**)&pFilter);
    if (SUCCEEDED(hr)) 
    {
        // Search upstream for another crossbar.
        IAMCrossbar *pXBar2 = NULL;
        hr = pBuild->FindInterface(&LOOK_UPSTREAM_ONLY, NULL, pFilter,
                 IID_IAMCrossbar, (void**)&pXBar2);
        pFilter->Release();

        if (SUCCEEDED(hr))
        {
            /* ... */
            pXBar2->Release();
        }
    }
    pXBar1->Release();
}

より一般化されたアプローチについては、 AmCap サンプルの CCrossbar クラスを参照してください。

IAMCrossbar インターフェイスへのポインターを取得すると、各ピンの物理タイプや、出力ピンにルーティングできる入力ピンのマトリックスなど、クロスバー フィルターに関する情報を取得できます。

  • ピンが対応する物理コネクタの種類を確認するには、 IAMCrossbar::get_CrossbarPinInfo メソッドを呼び出します。 メソッドは PhysicalConnectorType 列挙体のメンバーを返します。 たとえば、S-Video ピンはPhysConn_Video_SVideo値を返します。

    get_CrossbarInfoメソッドは、2 つのピンが相互に関連付けられているかどうかを示します。 たとえば、ビデオ チューナー ピンはオーディオ チューナー ピンに関連している場合があります。 関連ピンは同じピン方向を持ち、通常はカード上の同じ物理ジャックまたはコネクタの一部です。

  • 入力ピンを特定の出力ピンにルーティングできるかどうかを判断するには、 IAMCrossbar::CanRoute メソッドを呼び出します。

  • ピン間の現在のルーティングを確認するには、 IAMCrossbar::get_IsRoutedTo メソッドを 呼び出します。

前の方法では、すべてインデックス番号でピンを指定し、出力ピンと入力ピンの両方に 0 からインデックスを付けます。 IAMCrossbar::get_PinCounts メソッドを呼び出して、フィルター上のピンの数を見つけます。

たとえば、次のコードは、クロスバー フィルターに関する情報をコンソール ウィンドウに表示します。

// Helper function to associate a name with the type.
const char * GetPhysicalPinName(long lType)
{
    switch (lType) 
    {
    case PhysConn_Video_Tuner:            return "Video Tuner";
    case PhysConn_Video_Composite:        return "Video Composite";
    case PhysConn_Video_SVideo:           return "S-Video";
    case PhysConn_Video_RGB:              return "Video RGB";
    case PhysConn_Video_YRYBY:            return "Video YRYBY";
    case PhysConn_Video_SerialDigital:    return "Video Serial Digital";
    case PhysConn_Video_ParallelDigital:  return "Video Parallel Digital"; 
    case PhysConn_Video_SCSI:             return "Video SCSI";
    case PhysConn_Video_AUX:              return "Video AUX";
    case PhysConn_Video_1394:             return "Video 1394";
    case PhysConn_Video_USB:              return "Video USB";
    case PhysConn_Video_VideoDecoder:     return "Video Decoder";
    case PhysConn_Video_VideoEncoder:     return "Video Encoder";
        
    case PhysConn_Audio_Tuner:            return "Audio Tuner";
    case PhysConn_Audio_Line:             return "Audio Line";
    case PhysConn_Audio_Mic:              return "Audio Microphone";
    case PhysConn_Audio_AESDigital:       return "Audio AES/EBU Digital";
    case PhysConn_Audio_SPDIFDigital:     return "Audio S/PDIF";
    case PhysConn_Audio_SCSI:             return "Audio SCSI";
    case PhysConn_Audio_AUX:              return "Audio AUX";
    case PhysConn_Audio_1394:             return "Audio 1394";
    case PhysConn_Audio_USB:              return "Audio USB";
    case PhysConn_Audio_AudioDecoder:     return "Audio Decoder";
        
    default:                              return "Unknown Type";
    }    
}

void DisplayCrossbarInfo(IAMCrossbar *pXBar)
{
    HRESULT hr;
    long cOutput = -1, cInput = -1;
    hr = pXBar->get_PinCounts(&cOutput, &cInput);

    for (long i = 0; i < cOutput; i++)
    {
        long lRelated = -1, lType = -1, lRouted = -1;

        hr = pXBar->get_CrossbarPinInfo(FALSE, i, &lRelated, &lType);
        hr = pXBar->get_IsRouted(i, &lRouted);

        printf("Output pin %d: %s\n", i, GetPhysicalPinName(lType));
        printf("\tRelated out: %d, Routed in: %d\n", lRelated, lRouted);
        printf("\tSwitching Matrix: ");

        for (long j = 0; j < cInput; j++)
        {
            hr = pXBar->CanRoute(i, j);
            printf("%d-%s", j, (S_OK == hr ? "Yes" : "No"));
        }
        printf("\n\n");
    }

    for (i = 0; i < cInput; i++)
    {
        long lRelated = -1, lType = -1;

        hr = pXBar->get_CrossbarPinInfo(TRUE, i, &lRelated, &lType);

        printf("Input pin %d - %s\n", i, GetPhysicalPinName(lType));
        printf("\tRelated in: %d\n", lRelated);
    }
}

仮定のカードの場合、この関数は次の出力を生成する可能性があります。

Output pin 0: S-Video
    Related out: 2, Routed in: 0
    Switching Matrix: 0-Yes 1-No 2-No 3-No
Output pin 1 - Video Tuner
    Related out: 2, Routed in: 1
    Switching Matrix: 0-No 1-Yes 2-No 3-No
Output pin 2 - Audio decoder
    Related out: 1, Routed in: -1
    Switching Matrix: 0-No 1-No 2-Yes 3-Yes

Input pin 0 - S-Video
    Related in: 2
Input pin 1 - Video Tuner
    Related in: 3
Input pin 2 - Audio line
    Related in: 0
Input pin 3 - Audio tuner
    Related in: 1

出力側では、S-Video とビデオ チューナーの両方がオーディオ デコーダーに関連しています。 入力側では、ビデオチューナーはオーディオチューナーに関連し、S-Videoはオーディオラインに関連しています。 S ビデオ入力は S-Video 出力にルーティングされます。ビデオチューナー入力はビデオチューナー出力にルーティングされます。 現在、オーディオ デコーダーには何もルーティングされませんが、 のオーディオ行またはオーディオ チューナーをルーティングできます。

既存のルーティングを変更するには、 IAMCrossbar::Route メソッドを呼び出します。