2012-04-09 5 views
3

У нас есть драйвер виртуального аудио устройства, похожий на Sound flower. Это виртуальное устройство будет указано в настройках звуковой системы. Всякий раз, когда наше устройство выбирается в системных настройках, оно предотвращает простоя сна. Если мы переключим выбор на устройство вывода по умолчанию, все будет работать так, как ожидалось.Ручка бездействия от аудио-виртуального драйвера - Mac OSX

Если мы выполняем команду «pmset -g утверждений» в терминале, это дает ниже выход

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" 

Может ли один предложить мне несколько указателей, чтобы решить эту проблему.

ответ

1

Я думаю эти управляемый флагом kIOPMPreventIdleSleep, который находится в capabilityFlags поле IOPMPowerState struct.

участвовать в принятии решений, управления питанием, вам необходимо добавить драйвер устройства к плоскости управления питанием, как правило, в вашем переопределенном IOService::start(provider) метод:

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

где powerStates и numPowerStates указывает массив питания состояний вы хотите, чтобы ваше устройство было в состоянии. Вы, вероятно, не захотите больше, чем 2 для виртуального устройства, и, возможно, вам даже нужен он. Я подозреваю, что суперкласс вашего класса устанавливает состояния, которые блокируют сон. Как только вы зарегистрируетесь для управления питанием, ваш драйвер, как ожидается, будет обрабатывать методы управления питанием, такие как IOService::setPowerState().

В зависимости от того, как вы хотите, чтобы ваше устройство вел себя, вы можете создать 2 состояния питания, один «живой» при воспроизведении или захвате звука (и запрете сна), а другой «простоя», когда устройство не что-то делать, и позволять спать.

Тема управления питанием слишком велика, чтобы полностью покрыть ответ StackOverflow, поэтому я предлагаю вам прочитать документы о том, что я упомянул выше, и попытаться очистить соответствующий флаг в ваших состояниях (состояниях) питания.

Надеюсь, что это поможет.