Техническое примечание TN2321

Экономия Электроэнергии Во время Аудио I/O - kAudioHardwarePropertyPowerHint Свойство

Это техническое примечание обсуждает kAudioHardwarePropertyPowerHint свойство доступное начало в OS X 10.9 Индивидуалистов. Разработчики могут установить это свойство для экономии электроэнергии при выполнении аудио I/O.

Фон
Подсказка мощности звука
Сэкономьте электроэнергию с конфигурацией
Размер буфера I/O
Размер буфера I/O и Задержка 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 этого документа.

Приложения имеют два способа установить подсказку питания:

Перечисление 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.