Modifiche di alimentazione e stato in AVStream
Quando AVStream riceve una richiesta di IRP_MN_SET_POWER, chiama la routine di callback del minidriver AVStrMiniDeviceSetPower, se il minidriver ne ha fornita una.
Quando AVStream riceve una richiesta di impostazione della proprietà KSPROPERTY_CONNECTION_STATE, chiama la routine di callback AVStrMiniPinSetDeviceStatedel minidriver, se il minidriver ne ha fornito uno.
Quando il sistema si riattiva da uno stato di sospensione, AVStream può chiamare le routine di callback di un minidriver, AVStrMiniPinSetDeviceState e AVStrMiniDeviceSetPower, nell'ordine inverso rispetto a quello previsto. Ad esempio, AVStrMiniPinSetDeviceState può essere chiamato prima diAVStrMiniDeviceSetPower.
Di conseguenza, il driver deve essere preparato per gestire tale inversione dell'ordine di callback previsto.
Questa inversione non si verifica quando il sistema viene spento in uno stato di sospensione. Allo spegnimento, queste due routine di callback si verificano sempre nell'ordine previsto. Ad esempio, avStrMiniPinSetDeviceState viene sempre chiamato prima di AVStrMiniDeviceSetPower.
Se si verifica questa inversione, l'intera sequenza è simile alla seguente:
Prima di tutto, si verifica la sequenza di spegnimento:
AVStrMiniPinSetDeviceState viene chiamato con una richiesta di modifica dello stato del dispositivo da KSSTATE_RUN a KSSTATE_PAUSE.
AVStrMiniDeviceSetPower viene chiamato con una richiesta di modifica dello stato di alimentazione da D0 a D2/D3.
A questo punto, il sistema è in stato di sospensione.
Successivamente, si verifica la sequenza di avvio:
AVStrMiniDeviceSetPower viene chiamato con una richiesta di modifica dello stato di alimentazione da D2/D3 a D0.
AVStrMiniPinSetDeviceState viene chiamato con una richiesta di modifica dello stato del dispositivo da KSSTATE_PAUSE a KSSTATE_RUN.
In questo scenario, i passaggi 5 e 6 sono i passaggi invertiti rispetto all'ordine previsto.
Inoltre, quando un'applicazione è in streaming e il sistema avvia una sequenza di risparmio di energia, un grafico di acquisizione in esecuzione viene sempre posizionato in uno stato di sospensione. Se il grafico è già stato fermato, rimane fermato.