Orologi di riferimento

[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.

Una funzione di Filter Graph Manager consiste nel sincronizzare tutti i filtri nel grafico con lo stesso orologio, denominato orologio di riferimento.

Qualsiasi oggetto che espone l'interfaccia IReferenceClock può fungere da orologio di riferimento. L'orologio di riferimento potrebbe essere fornito da un filtro DirectShow, in genere il renderer audio, che ha accesso a un timer hardware. Come fallback, Filter Graph Manager può usare l'ora di sistema.

Nominalemente, un orologio di riferimento misura l'ora in intervalli di 100 nanosecondi, anche se l'accuratezza effettiva dell'orologio potrebbe essere inferiore. Per recuperare l'ora corrente dell'orologio, chiamare il metodo IReferenceClock::GetTime . La baseline dell'orologio, ovvero l'ora da cui inizia il conteggio, dipende dall'implementazione, quindi il valore restituito da GetTime non è intrinsecamente significativo. Ciò che conta è il delta da quando il grafico ha iniziato l'esecuzione.

Anche se l'accuratezza di un orologio di riferimento può variare, è garantito che i tempi restituiti dal metodo GetTime aumentino in modo monotonico. In altre parole, gli orari dell'orologio non andranno mai indietro. Se un orologio di riferimento genera orari di clock da un'origine hardware e l'orologio hardware salta indietro (ad esempio, se è presente una regolazione dell'orologio), il metodo GetTime deve continuare a restituire l'ora dell'ultima segnalazione fino a quando l'orologio hardware non viene aggiornato. Per altre informazioni, vedere Classe CBaseReferenceClock.

Orologio di riferimento predefinito

Filter Graph Manager seleziona automaticamente un orologio di riferimento quando viene eseguito il grafico. Usa l'algoritmo seguente per selezionare l'orologio:

  • Se l'applicazione ha selezionato un orologio (vedere di seguito), usare tale orologio.
  • Se il grafico contiene un filtro di origine dinamica che supporta IReferenceClock, usare tale filtro. Per la definizione di un'origine dinamica, vedere Origini live.
  • Se il grafico non contiene filtri di origine dinamica, usare qualsiasi filtro nel grafico che supporta IReferenceClock, a partire dai renderer e lavorare a monte. Preferisce i filtri connessi rispetto ai filtri non connessi. Se il grafico esegue il rendering di un flusso audio, questo passaggio nell'algoritmo selezionerà normalmente il filtro del renderer audio.
  • Se nessun filtro fornisce un orologio appropriato, utilizzare l'orologio di riferimento di sistema, basato sull'ora di sistema.

Impostazione dell'orologio di riferimento

Un'applicazione può selezionare un orologio chiamando il metodo IMediaFilter::SetSyncSource in Filter Graph Manager. È consigliabile eseguire questa operazione solo se si ha un motivo particolare per preferire un altro orologio.

È possibile indicare a Filter Graph Manager di non usare un orologio di riferimento chiamando SetSyncSource con il valore NULL. Ad esempio, è possibile eseguire questa operazione per elaborare i campioni il più rapidamente possibile. Per ripristinare l'orologio di riferimento predefinito, chiamare il metodo IFilterGraph::SetDefaultSyncSource in Filter Graph Manager.

Ogni volta che cambia l'orologio di riferimento, Filter Graph Manager invia una notifica a ogni filtro chiamando il relativo metodo IMediaFilter::SetSyncSource . Le applicazioni non devono mai chiamare questo metodo sui filtri.

Impostazione dell'orologio grafico

Ora e orologi in DirectShow