Condividi tramite


Anteprima dell'audio TV

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stato sostituito da MediaPlayer, IMFMediaEnginee Acquisizione audio/video in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente di usare un nuovo codice MediaPlayer, IMFMediaEngine e Acquisizione audio/video in Media Foundation anziché DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Per visualizzare l'anteprima, instradare il pin del decodificatore audio sul filtro crossbar al pin del sintonizzatore audio. Per disattivare l'audio, instradare il pin del decodificatore audio a -1, come illustrato nel diagramma seguente. I filtri a barre incrociate sono descritti in Uso delle barre incrociate.)

instradamento del pin del decodificatore audio

L'approccio di base è il seguente:

  1. Usare il metodo ICaptureGraphBuilder2::FindInterface per individuare il filtro della barra incrociata.
  2. Usare il metodo IAMCrossbar::get_CrossbarPinInfo per enumerare i pin di input e output del filtro incrociato. Cercare un pin di output del decodificatore audio e un pin di input del tuner audio.
  3. Se trovi i pin corretti, chiama IAMCrossbar::Route per instradare i pin. In caso contrario, cercare un'altra barra trasversale più a monte e ripetere il processo.
  4. Per disattivare l'audio, instradare il pin del decodificatore audio a -1.

La maggior parte dei sintonizzatori TV usa un singolo filtro a barre incrociate, ma alcuni usano due filtri barra incrociata. Pertanto, potrebbe essere necessario cercare una seconda barra incrociata se la prima non funziona.

Nota

Contrariamente a ciò che ci si potrebbe aspettare, non è necessario alcun filtro di acquisizione audio o renderer audio per visualizzare l'anteprima dell'audio, perché esiste una connessione fisica tra la scheda tuner e la scheda audio.

 

Il codice seguente illustra questi passaggi in modo più dettagliato. In primo luogo, ecco una funzione helper che cerca un filtro a barre incrociate per un tipo di pin specificato:

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;
}

La funzione successiva tenta di attivare o disattivare l'audio, a seconda del valore del parametro bActivate. Esegue una ricerca nel filtro crossbar specificato per individuare i pin richiesti. Se non riesce a trovarli, restituisce un codice di errore.

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;
}

La funzione successiva cerca un filtro a barre incrociate nel grafico dei filtri. Se ne trova uno, tenta di attivare o disattivare l'audio (usando la funzione precedente). Se l'operazione ha esito negativo, il metodo ricerca verso l'alto un secondo crossbar e riprova. Per un approccio più generalizzato alla gestione di più filtri a barre incrociate in un grafico, vedere la classe CCrossbar nell'applicazione di esempio 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;
}

Il codice seguente illustra come chiamare queste funzioni:

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

Si noti che queste funzioni di esempio ripetono molte delle stesse chiamate di funzione. Ad esempio, enumerano i perni della traversa ogni volta. In un'applicazione reale è possibile memorizzare nella cache alcune di queste informazioni.

Audio della televisione analogica

Uso delle barre incrociate