【问题标题】:Handle idle sleep from audio virtual driver - Mac OSX处理来自音频虚拟驱动程序的空闲睡眠 - Mac OSX
【发布时间】:2012-04-21 17:48:06
【问题描述】:

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

谁能给我一些建议来解决这个问题。

【问题讨论】:

    标签: osx-lion core-audio audio-streaming kernel-extension


    【解决方案1】:

    认为这由标志kIOPMPreventIdleSleep 管理,该标志位于IOPMPowerState structcapabilityFlags 字段中。

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

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

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

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

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

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2013-08-28
      • 2011-05-19
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      相关资源
      最近更新 更多