2012-04-09 2 views
3

Nous avons un pilote de périphérique audio virtuel similaire à Sound flower. Ce périphérique virtuel sera répertorié dans les préférences du système audio. Chaque fois que notre appareil est sélectionné dans les préférences du système, il empêche le sommeil inactif. Si nous basculons la sélection sur le périphérique de sortie par défaut, tout fonctionne comme prévu.Gérez le mode veille à partir du pilote audio virtuel - Mac OSX

Si nous exécutons la commande 'affirmations de pmset de dans le Terminal, il donne ci-dessous la sortie

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" 

Quelqu'un pourrait-il me suggérer quelques conseils pour résoudre ce problème.

Répondre

1

Je pense cette régie par le drapeau kIOPMPreventIdleSleep, qui se trouve dans le domaine capabilityFlags du IOPMPowerState struct.

Pour participer aux décisions de gestion de l'alimentation, vous devrez ajouter votre pilote de périphérique au plan de gestion de l'énergie, généralement dans votre méthode IOService::start(provider) surchargée:

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

powerStates et numPowerStates spécifie un tableau d'états de puissance vous voulez que votre appareil puisse fonctionner. Vous n'en voudrez probablement pas plus de deux pour un périphérique virtuel, et peut-être même n'en avez-vous besoin que d'un seul. Je soupçonne qu'une super-classe de votre classe définit des états qui inhibent le sommeil. Une fois que vous vous êtes inscrit à la gestion de l'alimentation, votre pilote devra gérer les méthodes de gestion de l'alimentation telles que IOService::setPowerState(). En fonction de la manière dont vous souhaitez que votre appareil se comporte, vous pouvez créer 2 états d'alimentation, un "en direct" lors de la lecture ou de la capture du son (et inhiber le sommeil) et l'autre "inactif" lorsque l'appareil n'est pas faire quelque chose, et permettre le sommeil. Le sujet de gestion de l'alimentation est un peu trop gros pour couvrir entièrement une réponse StackOverflow, donc je vous suggère de lire les docs sur les choses que j'ai mentionnées ci-dessus et essayer d'effacer le drapeau correspondant dans votre état d'alimentation.

Espérons que cela aide.