Технические вопросы и ответы QA1452

Аудиоустройства удара молнии и задержка шины PCI

Q: У меня есть аудиоинтерфейс Удара молнии, испытывающий незначительные сбои аудио, когда присоединено к Mac, не выполняющему много другой работы. Что могло вызывать это?

A: Процессоры в современном Macs имеют состояния низкой мощности, сокращающие скорость процессора и напряжение когда в нерабочем режиме для уменьшения потребляемой мощности и тепловыделения.

Когда управление питанием решает изменить состояние питания процессора, необходимо переключить состояние электропитания всех ядер процессора одновременно. В то время как эти переходы идут полным ходом, трафик шины PCI удержан. Именно эта дополнительная задержка может вызвать побочные эффекты, такие как аудио незначительные сбои.

Лучший путь безусловно для обработки этого состоит в том, чтобы измениться, как Вы планируете свои строго ограниченные во времени операции DMA в Вашем драйвере, таким образом, что случайная задержка не будет влиять на надлежащее функционирование Вашего устройства. Однако, если это не возможно, Ваш драйвер может сообщить управлению питанием, когда строго ограниченная во времени передача начинается и заканчивается так, чтобы система не вводила самые низкие состояния электропитания в течение того времени. Чтобы сделать это, передайте значение requireMaxBusStall это сообщает управлению питанием максимальной задержки доступа к памяти в наносекундах, которые могут быть допущены драйвером. Это значение аппаратно-зависимо и связано на сумму буферизации доступного в аппаратных средствах.

Поскольку аудио передает, только происходят, в то время как Ваш аудио механизм работает, можно переопределить виртуальные методы performAudioEngineStart и performAudioEngineStop в IOAudioEngine как показано в Перечислении 1.

Перечисление 1  , Сообщающее управлению питанием о строго ограниченной во времени передаче DMA.

/* Header file */
class MyAudioEngine : public IOAudioEngine
{
    /* virtual overrides, custom function, variables, etc... */
 
public:
    virtual IOReturn performAudioEngineStart();
    virtual IOReturn performAudioEngineStop();
}
 
/* Implementation file */
IOReturn MyAudioEngine::performAudioEngineStart()
{
    // Latency tolerance interval in nanoseconds
    const UInt32 maxLatencyTolerance_ns = 10*1000;
 
    requireMaxBusStall(maxLatencyTolerance_ns);
    return IOAudioEngine::performAudioEngineStart();
}
 
IOReturn MyAudioEngine::performAudioEngineStop()
{
    // Zero means restore default bus stall time.
    // It's now safe to go into lowest-power states.
    requireMaxBusStall(0);
    return IOAudioEngine::performAudioEngineStop();
}


История версии документа


ДатаПримечания
30.01.2014

Новый документ, объясняющий, как аудиоустройства Удара молнии могут быть затронуты более высокой задержкой в состояниях низкой мощности.