2012-04-09 2 views
3

Wir haben einen virtuellen Audio-Gerätetreiber ähnlich Sound Blume. Dieses virtuelle Gerät wird in den Systemeinstellungen aufgeführt. Wann immer unser Gerät in den Systemeinstellungen ausgewählt wird, verhindert es Leerlaufschlaf. Wenn wir die Auswahl auf das Standard-Ausgabegerät umschalten, funktioniert alles wie erwartet.Handle Ruhezustand von virtuellen Audio-Treiber - Mac OSX

Wenn wir ‚pmset -g Behauptungen‘ Befehl im Terminal ausführen, gibt es unter Ausgabe

Assertion status system-wide: 
    ChargeInhibit       0 
    PreventUserIdleDisplaySleep    0 
    PreventUserIdleSystemSleep    1 
    NoRealPowerSources_debug    0 
    CPUBoundAssertion      0 
    EnableIdleSleep       1 
    PreventSystemSleep      0 
    DisableInflow       0 
    DisableLowPowerBatteryWarnings   0 
    ExternalMedia       0 

Listed by owning process: 

    pid 115: [0x0000012c00000073] PreventUserIdleSystemSleep named: MY_DRIVER_IDENTIFER.noidlesleep" 

Könnte jemand vorschlagen, mir einige Hinweise um dieses Problem zu beheben.

Antwort

1

Ich denke diese durch die Flagge kIOPMPreventIdleSleep, geregelt, die in dem capabilityFlags Bereich der IOPMPowerState struct befindet.

Um in Power-Management-Entscheidungen teilnehmen, werden Sie Ihren Gerätetreiber auf die Power-Management-Ebene, in der Regel in Ihrer überschriebene IOService::start(provider) Methode hinzufügen müssen:

PMinit(); 
provider->joinPMtree(this); 
registerPowerDriver(this, powerStates, numPowerStates); 

wo powerStates und numPowerStates eine Reihe von Leistungszuständen spezifizieren Sie möchten, dass Ihr Gerät in der Lage ist, in. Sie werden wahrscheinlich nicht mehr als 2 für ein virtuelles Gerät wollen, und vielleicht brauchen Sie sogar nur eins. Ich vermute, eine Oberklasse Eurer Klasse setzt Zustände, die den Schlaf hemmen. Sobald Sie sich für die Energieverwaltung registriert haben, wird von Ihrem Treiber erwartet, dass er die Energieverwaltungsmethoden wie IOService::setPowerState() behandelt.

Je nachdem, wie sich Ihr Gerät verhalten soll, möchten Sie möglicherweise zwei Stromzustände erstellen, einen "Live" bei der Wiedergabe oder beim Aufnehmen von Ton (und das Verhindern von Schlaf) und den anderen "Leerlauf", wenn das Gerät nicht aktiv ist alles tun und schlafen zulassen.

Das Power Management-Thema ist ein bisschen zu groß, um vollständig in einer StackOverflow-Antwort zu decken, also empfehle ich Ihnen, die Dokumente zu den oben erwähnten Sachen zu lesen und die relevanten Flags in Ihrem/Ihren Stromzustand (en) zu löschen.

Hoffe, dass hilft.