Anteprima dell'audio TV

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation invece di 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 dell'audio tv, instradare il pin del decodificatore audio sul filtro incrociato al pin Del tuner audio. Per disattivare l'audio, instradare il pin del decodificatore audio a -1, come illustrato nel diagramma seguente. I filtri barra incrociata sono descritti in Uso delle barre incrociate.

routing del pin del decodificatore audio

L'approccio di base è il seguente:

  1. Utilizzare il metodo ICaptureGraphBuilder2::FindInterface per individuare il filtro a 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 si trovano i pin corretti, chiamare IAMCrossbar::Route per instradare i pin. In caso contrario, cercare un'altra barra incrociata e ripetere il processo.
  4. Per disattivare l'audio, indirizzare il decodificatore audio a -1.

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

Nota

Contrariamente a quanto 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 . Cerca i pin necessari nel filtro barra incrociata specificato. 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 non riesce, il metodo cerca a monte una seconda barra incrociata 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, enumera i puntini incrociati ogni volta. In un'applicazione reale è possibile memorizzare nella cache alcune di queste informazioni.

Audio televisore analogico

Uso delle barre incrociate