Экономия Электроэнергии Во время Аудио I/O - kAudioHardwarePropertyPowerHint Свойство
Это техническое примечание обсуждает kAudioHardwarePropertyPowerHint свойство доступное начало в OS X 10.9 Индивидуалистов. Разработчики могут установить это свойство для экономии электроэнергии при выполнении аудио I/O.
Фон
Быстрая производительность и продолжительный срок использования батарей является двумя критическими элементами, способствующими полному положительному опыту, который пользователи имеют с Mac. Но в то время как пользователи стали более зависящими от времени работы от батареи, приложения, которые они используют, одновременно стали более жаждущими питания. Поэтому стало очень важно в развитии OS X искать способы сэкономить электроэнергию, также поддерживая системную скорость отклика и быструю производительность.
OS X удостоверяется, что электроэнергия экономится во многих отношениях с помощью передовых технологий как Объединение Таймера, Дремота Приложения и т.д. Однако, чтобы сэкономить электроэнергию при выполнении аудиовхода и вывести, OS X нужна информация из самого приложения.
Для экономии электроэнергии OS X должен принять решения, которые увеличат задержку аудио подсистемы I/O, таким образом, непосредственно влияние на приложение. Для некоторых приложений, компромисса между задержкой и время работы от батареи прекрасен абсолютно и не приводит ни к какой воспринятой потере производительности. Для других приложений это может иметь катастрофические последствия. Поэтому OS X нужна помощь приложения для знания, когда этот тип компромисса в порядке и когда это не.
Подсказка мощности звука
Для упрощения пути к приложениям для уведомления OS X, как обработать питание, сохраняют/производительность компромисс, платформа CoreAudio обеспечивает вызванное свойство kAudioHardwarePropertyPowerHint.
Приложения могут установить это свойство в значение kAudioHardwarePowerHintFavorSavingPower указать, что OS X должен принять меры для сохранения электроэнергии включая действия, которые могут увеличить задержку системы I/O. С OS X 10.9, устанавливая эту подсказку увеличит размер буфера I/O по умолчанию с 512 выборка структурирует к 4096 демонстрационные кадры. Взаимодействие между размером буфера и задержкой обсуждено в разделе I/O Buffer Size и I/O Latency этого документа.
Приложения имеют два способа установить подсказку питания:
Включением названного ключа»
AudioHardwarePowerHint«вinfo.plist. Значение этого ключа может быть»Favor Saving Power«который говорит OS X, что приложение выбирает в ко всем мерам по экономии электроэнергии. Значение может также быть»None«указывая к OS X, что приложение не хочет, чтобы система внесла любые изменения I/O для экономии электроэнергии.При помощи
AudioObjectSetPropertyDataAPI. Обратите внимание на то, что приложению позволяют установить значение этой подсказки так много раз, как этому нравится, таким образом, решить в меры по экономии электроэнергии первоначально только отказаться в более позднее время, когда изменяются потребности пользователя. См. Перечисление 1.
Перечисление 1 , устанавливающее подсказку мощности звука.
#include <CoreAudio/CoreAudio.h> |
static OSStatus SetAudioPowerHintToFavorSavingPower() |
{ |
AudioObjectPropertyAddress theAddress = { kAudioHardwarePropertyPowerHint, |
kAudioObjectPropertyScopeGlobal, |
kAudioObjectPropertyElementMaster }; |
UInt32 thePowerHint = kAudioHardwarePowerHintFavorSavingPower; |
return AudioObjectSetPropertyData(kAudioObjectSystemObject, |
&theAddress, |
0, |
NULL, |
sizeof(UInt32), &thePowerHint); |
} |
static OSStatus SetAudioPowerHintToNone() |
{ |
AudioObjectPropertyAddress theAddress = { kAudioHardwarePropertyPowerHint, |
kAudioObjectPropertyScopeGlobal, |
kAudioObjectPropertyElementMaster }; |
UInt32 thePowerHint = kAudioHardwarePowerHintNone; |
return AudioObjectSetPropertyData(kAudioObjectSystemObject, |
&theAddress, |
0, |
NULL, |
sizeof(UInt32), &thePowerHint); |
} |
Сэкономьте электроэнергию с конфигурацией
Экономия электроэнергии в общих чертах является процессом нахождения способов выполнить те же задачи при использовании меньшего количества CPU и других системных ресурсов. Это может часто принимать форму пакетной обработки работы, которая будет сделана одновременно так, чтобы CPU мог заскочить в более глубокие состояния сна в течение более длительных промежутков времени. Этот принцип обнаруживается в нескольких местах всюду по аудио штабелю программного обеспечения.
У многих Core Audio APIs есть параметры и свойства, разрешающие разработчику управлять алгоритмической сложностью цепочки обработки сигналов. Например, AudioConverter имеет несколько свойств для управления качеством различных этапов во время процесса преобразования, таких как преобразователь частоты дискретизации (kAudioConverterSampleRateConverterQuality) и аудиокодек (kAudioConverterCodecQuality). Другим примером является 3D микшер со своим свойством для управления качеством рендеринга путем выбора различных spatialization алгоритмов, как обсуждено в TN2112 Используя 3DMixer Аудиоустройство. Все еще другой - предоставленные аудиоустройства системы, реализующие различные алгоритмы для преобразований отбывания срока и подачи. Эти аудиоустройства предусматривают различные компромиссы между видом и качеством сделанной обработки сигналов, и сумма CPU раньше делала обработку. При помощи этих средств приложения могут управлять объемом работы, сделанным, таким образом, экономя электроэнергию, когда является надлежащим сделать так.
Это - ответственность за приложения смотреть на тип сделанной обработки сигналов и понять, где это может выключить качество или использовать альтернативные алгоритмы для достижения того же результата. Это может потребовать некоторого экспериментирования. Это всегда - хорошая идея зарезервировать некоторое время в графике разработки для концентрации на настройке производительности. Для аудио проанализируйте обработку сигналов, сделанную приложением для наблюдения, где вещи могут быть вычислены, не влияя на пользовательский опыт.
Размер буфера I/O
Используя свойства и параметры аудиоустройств для понижения объема работы, сделанного, обрабатывая аудиоданные, очень полезно, но ограничивается уровень экономии электроэнергии, которая может быть достигнута тот путь. Самая влиятельная установка приложения имеет в его размещении для управления суммой питания, используемого во время рендеринга, размер буфера I/O, который это выбирает. Размер управлений буфером I/O уровень, на котором аудио штабель разбудит CPU для выполнения I/O. Поэтому размер буфера I/O почти всегда будет доминирующим фактором, влияющим на аудио использование питания штабеля.
Приложение имеет полный контроль над размером буфера I/O, который это использует. Это управление выражено путем сообщения аудиосистемы что размер буфера I/O использовать через kAudioDevicePropertyBufferFrameSize свойство, которое может быть установлено любой с AudioObjectSetPropertyData API или с аудиоустройством AUHAL AudioUnitSetProperty API.
Юридический диапазон для буферного свойства типа телосложения может быть запрошен при помощи kAudioDevicePropertyBufferFrameSizeRange свойство. См. Списки 2 и 3.
Перечисление 2 , Устанавливающее Размер буфера I/O для HAL.
#include <CoreAudio/CoreAudio.h> |
static OSStatus GetIOBufferFrameSizeRange(AudioObjectID inDeviceID, |
UInt32* outMinimum, |
UInt32* outMaximum) |
{ |
AudioObjectPropertyAddress theAddress = { kAudioDevicePropertyBufferFrameSizeRange, |
kAudioObjectPropertyScopeGlobal, |
kAudioObjectPropertyElementMaster }; |
AudioValueRange theRange = { 0, 0 }; |
UInt32 theDataSize = sizeof(AudioValueRange); |
OSStatus theError = AudioObjectGetPropertyData(inDeviceID, |
&theAddress, |
0, |
NULL, |
&theDataSize, |
&theRange); |
if(theError == 0) |
{ |
*outMinimum = theRange.mMinimum; |
*outMaximum = theRange.mMaximum; |
} |
return theError; |
} |
static OSStatus SetCurrentIOBufferFrameSize(AudioObjectID inDeviceID, |
UInt32 inIOBufferFrameSize) |
{ |
AudioObjectPropertyAddress theAddress = { kAudioDevicePropertyBufferFrameSize, |
kAudioObjectPropertyScopeGlobal, |
kAudioObjectPropertyElementMaster }; |
return AudioObjectSetPropertyData(inDeviceID, |
&theAddress, |
0, |
NULL, |
sizeof(UInt32), &inIOBufferFrameSize); |
} |
static OSStatus GetCurrentIOBufferFrameSize(AudioObjectID inDeviceID, |
UInt32* outIOBufferFrameSize) |
{ |
AudioObjectPropertyAddress theAddress = { kAudioDevicePropertyBufferFrameSize, |
kAudioObjectPropertyScopeGlobal, |
kAudioObjectPropertyElementMaster }; |
UInt32 theDataSize = sizeof(UInt32); |
return AudioObjectGetPropertyData(inDeviceID, |
&theAddress, |
0, |
NULL, |
&theDataSize, |
outIOBufferFrameSize); |
} |
Перечисление 3 , Устанавливающее размер буфера I/O для AUHAL.
#include <AudioToolbox/AudioToolbox.h> |
#include <AudioUnit/AudioUnit.h> |
static OSStatus GetIOBufferFrameSizeRange(AudioUnit inAUHAL, |
UInt32* outMinimum, |
UInt32* outMaximum) |
{ |
AudioValueRange theRange = { 0, 0 }; |
UInt32 theDataSize = sizeof(AudioValueRange); |
OSStatus theError = AudioUnitGetProperty(inAUHAL, |
kAudioDevicePropertyBufferFrameSizeRange, |
kAudioUnitScope_Global, |
0, |
&theRange, &theDataSize); |
if(theError == 0) |
{ |
*outMinimum = theRange.mMinimum; |
*outMaximum = theRange.mMaximum; |
} |
return theError; |
} |
static OSStatus SetCurrentIOBufferFrameSize(AudioUnit inAUHAL, |
UInt32 inIOBufferFrameSize) |
{ |
return AudioUnitSetProperty(inAUHAL, |
kAudioDevicePropertyBufferFrameSize, |
kAudioUnitScope_Global, |
0, |
&inIOBufferFrameSize, sizeof(UInt32)); |
} |
static OSStatus GetCurrentIOBufferFrameSize(AudioUnit inAUHAL, |
UInt32* outIOBufferFrameSize) |
{ |
UInt32 theDataSize = sizeof(UInt32); |
return AudioUnitGetProperty(inAUHAL, |
kAudioDevicePropertyBufferFrameSize, |
kAudioUnitScope_Global, |
0, |
outIOBufferFrameSize, &theDataSize); |
} |
Размер буфера I/O и Задержка I/O
Размер буфера I/O непосредственно связан с задержкой системы I/O. Это - связь «один к одному». Поскольку каждый демонстрационный кадр, размер буфера I/O увеличен, существует соответствующее увеличение одного демонстрационного кадра больше задержки. Для приложений, которые чувствительны к задержке, изменяется, это означает, что любое изменение в размере буфера I/O может существенно влиять на пользовательский опыт.
Приложения, чувствительные к изменениям в задержке, обычно являются теми, которые должны обеспечить интерактивный пользовательский опыт. Приложения цифровой звуковой рабочей станции как GarageBand или Логика Pro X являются очевидными примерами приложений, чувствительных к задержке, а также играм, где звуковые эффекты должны сразу играться в ответ на игровые события, и даже приложения организации телеконференций, где производительность эхоподавления и подавления шумов непосредственно затронута суммой задержки в системе.
Для этого класса приложения используемый размер буфера I/O должен быть самым большим буфером, возможным, не повреждая определенные требования варианта использования для приложения. Экспериментирование с размером буфера призвано достигнуть этой цели.
Приложения, не чувствительные к изменениям задержки, были бы медиапроигрывателями, например приложения как QuickTime Player или iTunes. Этот класс приложения обычно более касается игры аудио в синхронизации с другими носителями (такими как видео), чем это с игрой аудио как можно быстрее в ответ на пользовательское событие.
Этот класс приложения должен использовать самый большой возможный размер буфера I/O и устанавливать подсказку мощности звука для одобрения электроэнергии экономии. Просто установка»AudioHardwarePowerHint«ключ info.plist файл может быть всем, что требуется, поскольку выполнение так позволит OS X автоматически увеличивать размер буфера I/O по умолчанию и экономить электроэнергию.
Отказ обновить kAudioUnitProperty_MaximumFramesPerSlice свойство заставит аудиоустройства не выполнять любую обработку (это включало не надевание любых вводов), и возвратите ошибку kAudioUnitErr_TooManyFramesToProcess.
Сводка
Использование питания быстро становится ключевой метрикой, по которой оценено качество приложения. Когда дело доходит до аудиосистемы OS X предоставляет много возможностей увеличивать эффективность питания приложений. Это включает установку Подсказки Мощности звука, уделения внимания размеру буфера I/O, а также использованию доступных параметров аудиоустройства и свойств, чтобы гарантировать, что Ваше приложение установило аудиосистему в пути, не только звучащем хорошим, но также и эффективное питание.
Это до самого приложения для использования в своих интересах этих функций аудиосистемы. Разработчики призваны экспериментировать с буферными размерами I/O для выяснения самого большого размера, который они могут использовать, не влияя на пользовательский опыт и одобрить экономию электроэнергии, где это необходимо.
Для определенных приложений, просто устанавливающих ключ «AudioHardwarePowerHint» в»Favor Saving Power«в приложениях info.plist файл может быть всем, что требуется, поскольку выполнение так позволит OS X автоматически управлять аудиосистемой для одобрения электроэнергии экономии.
История версии документа
| Дата | Примечания |
|---|---|
| 30.07.2013 | Новый документ, предоставляющий информацию, которую разработчики могут использовать для экономии электроэнергии при выполнении аудио I/O. |