我们有一个类似于Sound flower的虚拟音频设备驱动程序。此虚拟设备将在声音系统首选项中列出。每当我们的设备在系统首选项中被选中时,它就会阻止空闲睡眠。如果我们将选择切换到默认输出设备,一切都按预期工作。
如果我们在终端中执行'pmset -g assertions'命令,它会给出以下输出
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"
任何人都可以向我提出解决此问题的一些建议。
答案 0 :(得分:1)
我认为这由kIOPMPreventIdleSleep
标志管理,该标志位于IOPMPowerState
struct的capabilityFlags
字段中。
要参与电源管理决策,您需要将设备驱动程序添加到电源管理平面,通常采用覆盖的IOService::start(provider)
方法:
PMinit();
provider->joinPMtree(this);
registerPowerDriver(this, powerStates, numPowerStates);
其中powerStates
和numPowerStates
指定了您希望设备能够进入的电源状态数组。对于虚拟设备,您可能不希望超过2个,也许您甚至可能只需要一个。我怀疑你班级的超类正在设置抑制睡眠的状态。注册电源管理后,您的驱动程序将需要处理IOService::setPowerState()
等电源管理方法。
根据您希望设备的行为方式,您可能需要创建2种电源状态,一种是“现场”播放或捕获声音(并禁止睡眠)而另一种是“闲置”设备未执行时任何东西,并允许睡觉。
电源管理主题有点太大而无法完全覆盖StackOverflow的答案,因此我建议您阅读上面提到的内容并尝试清除电源状态下的相关标志。< / p>
希望有所帮助。