Partager via


Aperçu de l’audio TV

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture in Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation au lieu de DirectShow, si possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

Pour afficher un aperçu de l’audio TV, routez l’épingle audio décodeur sur le filtre de barre croisée vers l’épingle Audio Tuner. Pour désactiver le son, acheminez l’épingle audio décodeur vers -1, comme illustré dans le diagramme suivant. (Les filtres crossbar sont décrits dans Utilisation des barres croisées.)

routage du code pin du décodeur audio

L’approche de base est la suivante :

  1. Utilisez la méthode ICaptureGraphBuilder2::FindInterface pour localiser le filtre de barre croisée.
  2. Utilisez la méthode IAMCrossbar::get_CrossbarPinInfo pour énumérer les broches d’entrée et de sortie du filtre de barre croisée. Recherchez une broche de sortie de décodeur audio et une broche d’entrée de tuner audio.
  3. Si vous trouvez les broches correctes, appelez IAMCrossbar::Route pour router les broches. Si ce n’est pas le cas, recherchez amont une autre barre croisée et répétez le processus.
  4. Pour désactiver l’audio, acheminez l’épingle du décodeur audio vers -1.

La plupart des tuners TV utilisent un seul filtre à barre croisée, mais certains utilisent deux filtres à barre croisée. Par conséquent, vous devrez peut-être rechercher une deuxième barre croisée si la première échoue.

Notes

Contrairement à ce que vous pouvez vous attendre, aucun filtre de capture audio ou convertisseur audio n’est nécessaire pour afficher un aperçu de l’audio, car il existe une connexion physique entre le tuner carte et le son carte.

 

Le code suivant montre ces étapes plus en détail. Tout d’abord, voici une fonction d’assistance qui recherche un type d’épingle spécifié dans un filtre de barre croisée :

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 fonction suivante tente d’activer ou de désactiver le son, en fonction de la valeur du paramètre bActivate . Il recherche les broches requises dans le filtre de barre croisée spécifié. S’il ne les trouve pas, il retourne un code d’erreur.

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 fonction suivante recherche un filtre à barres croisées dans le graphique de filtres. S’il en trouve un, il tente d’activer ou de désactiver le son (à l’aide de la fonction précédente). Si cette opération échoue, la méthode recherche amont une deuxième barre croisée, puis réessaye. Pour une approche plus générale de la gestion de plusieurs filtres à barres croisées dans un graphique, consultez la classe CCrossbar dans l’exemple d’application 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;
}

Le code suivant montre comment appeler ces fonctions :

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

Notez que ces exemples de fonctions répètent la plupart des mêmes appels de fonction. Par exemple, ils énumèrent les broches à barre croisée à chaque fois. Dans une application réelle, vous pouvez mettre en cache certaines de ces informations.

Audio de télévision analogique

Utilisation des barres croisées