3

我们有一个类似于 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" 

任何人都可以建议我一些解决这个问题的建议。

4

1 回答 1

1

认为这由kIOPMPreventIdleSleep位于structcapabilityFlags字段中的 flag 控制。IOPMPowerState

要参与电源管理决策,您需要将设备驱动程序添加到电源管理平面,通常在您的覆盖IOService::start(provider)方法中:

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

wherepowerStatesnumPowerStates指定您希望设备能够处于的一系列电源状态。对于虚拟设备,您可能不希望超过 2 个,甚至可能只需要一个。我怀疑你班级的一个超类正在设置抑制睡眠的状态。一旦您注册了电源管理,您的驱动程序将需要处理电源管理方法,例如IOService::setPowerState().

根据您希望设备的行为方式,您可能需要创建 2 种电源状态,一种是在播放或捕获声音(并禁止睡眠)时“活动”,另一种是在设备不执行任何操作时“空闲”,以及允许睡眠。

电源管理主题有点太大,无法在 StackOverflow 答案中完全涵盖,因此我建议您阅读有关我上面提到的内容的文档,并尝试清除电源状态中的相关标志。

希望有帮助。

于 2012-04-28T16:17:53.313 回答