Bagikan melalui


Mempratinjau Audio TV

[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Pengambilan Audio/Video di Media Foundation. Fitur-fitur tersebut telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan MediaPlayer, IMFMediaEngine , dan Pengambilan Audio/Video di Media Foundation alih-alih DirectShow, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]

Untuk mempratinjau audio TV, rutekan pin Audio Decoder pada filter crossbar ke pin Audio Tuner. Untuk mematikan suara audio, rutekan pin Audio Decoder ke -1, seperti yang diperlihatkan dalam diagram berikut. (Filter bilah silang dijelaskan dalam Bekerja dengan Bilah Silang.)

merutekan pin dekoder audio

Pendekatan dasarnya adalah sebagai berikut:

  1. Gunakan metode ICaptureGraphBuilder2::FindInterface untuk menemukan filter bilah silang.
  2. Gunakan metode IAMCrossbar::get_CrossbarPinInfo untuk menghitung pin input dan output filter crossbar. Cari pin output dekoder audio dan pin input tuner audio.
  3. Jika Anda menemukan pin yang benar, panggil IAMCrossbar::Route untuk merutekan pin. Jika tidak, cari upstream untuk crossbar lain dan ulangi prosesnya.
  4. Untuk mematikan suara audio, rutekan pin dekoder audio ke -1.

Sebagian besar penyetel TV menggunakan filter palang tunggal, tetapi beberapa menggunakan dua filter crossbar. Oleh karena itu, Anda mungkin harus mencari crossbar kedua jika yang pertama gagal.

Catatan

Berlawanan dengan apa yang mungkin Anda harapkan, tidak ada filter tangkapan audio atau penyaji audio yang diperlukan untuk mempratinjau audio, karena ada koneksi fisik antara kartu tuner dan kartu suara.

 

Kode berikut menunjukkan langkah-langkah ini secara lebih rinci. Pertama, berikut adalah fungsi pembantu yang mencari filter crossbar untuk jenis pin tertentu:

HRESULT FindCrossbarPin(
    IAMCrossbar *pXBar,                 // Pointer to the crossbar.
    PhysicalConnectorType PhysicalType, // Pin type to match.
    PIN_DIRECTION Dir,                  // Pin direction.
    long *pIndex)       // Receives the index of the pin, if found.
{
    BOOL bInput = (Dir == PINDIR_INPUT ? TRUE : FALSE);

    // Find out how many pins the crossbar has.
    long cOut, cIn;
    HRESULT hr = pXBar->get_PinCounts(&cOut, &cIn);
    if (FAILED(hr)) return hr;
    // Enumerate pins and look for a matching pin.
    long count = (bInput ? cIn : cOut);
    for (long i = 0; i < count; i++)
    {
        long iRelated = 0;
        long ThisPhysicalType = 0;
        hr = pXBar->get_CrossbarPinInfo(bInput, i, &iRelated,
            &ThisPhysicalType);
        if (SUCCEEDED(hr) && ThisPhysicalType == PhysicalType)
        {
            // Found a match, return the index.
            *pIndex = i;
            return S_OK;
        }
    }
    // Did not find a matching pin.
    return E_FAIL;
}

Fungsi berikutnya mencoba mengaktifkan atau membisukan audio, tergantung pada nilai parameter bActivate . Ini mencari filter bilah silang yang ditentukan untuk pin yang diperlukan. Jika tidak dapat menemukannya, kode kesalahan akan dikembalikan.

HRESULT ConnectAudio(IAMCrossbar *pXBar, BOOL bActivate)
{
    // Look for the Audio Decoder output pin.
    long i = 0;
    HRESULT hr = FindCrossbarPin(pXBar, PhysConn_Audio_AudioDecoder,
        PINDIR_OUTPUT, &i);
    if (SUCCEEDED(hr))
    {
        if (bActivate)  // Activate the audio. 
        {
            // Look for the Audio Tuner input pin.
            long j = 0;
            hr = FindCrossbarPin(pXBar, PhysConn_Audio_Tuner, 
                PINDIR_INPUT, &j);
            if (SUCCEEDED(hr))
            {
                return pXBar->Route(i, j);
            }
        }
        else  // Mute the audio
        {
            return pXBar->Route(i, -1);
        }
    }
    return E_FAIL;
}

Fungsi berikutnya mencari grafik filter untuk filter bilah silang. Jika menemukannya, ia mencoba mengaktifkan atau membisukan audio (menggunakan fungsi sebelumnya). Jika operasi tersebut gagal, metode akan mencari di hulu untuk bilah silang kedua dan mencoba lagi. Untuk pendekatan yang lebih umum untuk mengelola beberapa filter crossbar dalam grafik, lihat kelas CCrossbar di aplikasi sampel AmCap.

HRESULT ActivateAudio(ICaptureGraphBuilder2 *pBuild, IBaseFilter *pSrc,
  BOOL bActivate)
{
    // Search upstream for a crossbar.
    IAMCrossbar *pXBar1 = NULL;
    HRESULT hr = pBuild->FindInterface(&LOOK_UPSTREAM_ONLY, NULL, pSrc,
        IID_IAMCrossbar, (void**)&pXBar1);
    if (SUCCEEDED(hr)) 
    {
        hr = ConnectAudio(pXBar1, bActivate);
        if (FAILED(hr))
        {
            // Look for another crossbar.
            IBaseFilter *pF = NULL;
            hr = pXBar1->QueryInterface(IID_IBaseFilter, (void**)&pF);
            if (SUCCEEDED(hr)) 
            {
                // Search upstream for another one.
                IAMCrossbar *pXBar2 = NULL;
                hr = pBuild->FindInterface(&LOOK_UPSTREAM_ONLY, NULL, pF,
                    IID_IAMCrossbar, (void**)&pXBar2);
                pF->Release();
                if (SUCCEEDED(hr))
                {
                    hr = ConnectAudio(pXBar2, bActivate);
                    pXBar2->Release();
                }
            }
        }
        pXBar1->Release();
    }
    return hr;
}

Kode berikut menunjukkan cara memanggil fungsi-fungsi ini:

// Build the analog TV graph (not shown).
// Activate the audio.
hr = ActivateAudio(pBuild, pCap, TRUE);
// Later, mute the audio.
hr = ActivateAudio(pBuild, pCap, FALSE);

Perhatikan bahwa fungsi contoh ini mengulangi banyak panggilan fungsi yang sama. Misalnya, mereka menghitung pin crossbar setiap kali. Dalam aplikasi nyata, Anda mungkin menyimpan beberapa informasi ini.

Audio Televisi Analog

Bekerja dengan Crossbar