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

これは、構造体のフィールドにあるフラグによって管理されていると思います。kIOPMPreventIdleSleepcapabilityFlagsIOPMPowerState

IOService::start(provider)電源管理の決定に参加するには、通常はオーバーライドされたメソッドで、デバイス ドライバーを電源管理プレーンに追加する必要があります。

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

ここでpowerStates、 およびnumPowerStatesは、デバイスが存在できるようにする電源状態の配列を指定します。おそらく、仮想デバイスに 2 つ以上は必要ないでしょう。必要なのは 1 つだけです。あなたのクラスのスーパークラスが睡眠を阻害する状態を設定していると思われます。電源管理に登録すると、ドライバーは などの電源管理方法を処理することが期待されIOService::setPowerState()ます。

デバイスをどのように動作させたいかによって、2 つの電源状態を作成したい場合があります。1 つはサウンドの再生またはキャプチャ (およびスリープの禁止) 時の「ライブ」、もう 1 つはデバイスが何もしていないときの「アイドル」です。睡眠を許可します。

電源管理のトピックは、StackOverflow の回答で完全にカバーするには大きすぎるため、上記のドキュメントを読んで、電源状態の関連フラグをクリアすることをお勧めします。

それが役立つことを願っています。

于 2012-04-28T16:17:53.313 に答える