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

Всегда проверяйте код результата от AudioUnitGetProperty, когда используется с kAudioUnitProperty_FastDispatch

Q: Я использую kAudioUnitProperty_FastDispatch с AudioUnitGetProperty вернуть указатели функции для некоторых селекторов Аудиоустройства такой как kAudioUnitRenderSelect, kAudioUnitSetParameterSelect и т.д. Насколько важный он для проверки кода возврата от AudioUnitGetProperty?

A: Я использую kAudioUnitProperty_FastDispatch с AudioUnitGetProperty вернуть указатели функции для некоторых селекторов Аудиоустройства такой как kAudioUnitRenderSelect, kAudioUnitSetParameterSelect и т.д. Насколько важный он для проверки кода возврата от AudioUnitGetProperty?

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

Нормальный образец использования должен проверить код возврата и только предположить, что допустимый указатель функции был возвращен если AudioUnitGetProperty возвраты noErr. Когда noErr возвращается, существует гарантия, что у Вас есть допустимый указатель функции для указанного селектора.

Проверка кода возврата и принятие допустимого указателя функции во всех экземплярах приведут к катастрофическому отказу, так как некоторые Аудиоустройства могут не реализовать kAudioUnitProperty_FastDispatch свойство.

Перечисление 1  , Правильно получающее и использующее указатели функции Аудиоустройства.

AudioUnit myAUnit;
ProcPtr myRenderProc, myGetParamProc, mySetParamProc;
void *myConnInstanceStorage;

void GetFastDispatchPointers(void)
{ 
    UInt32 size = sizeof(AudioUnitRenderProc);
    if (AudioUnitGetProperty(myAUnit, kAudioUnitProperty_FastDispatch,
                             kAudioUnitScope_Global, kAudioUnitRenderSelect,
                             &myRenderProc, &size) != noErr)
        myRenderProc = NULL;

    if (AudioUnitGetProperty(myAUnit, kAudioUnitProperty_FastDispatch,
                             kAudioUnitScope_Global, kAudioUnitGetParameterSelect,
                             &myGetParamProc, &size) != noErr)
        myGetParamProc = NULL;

    if (AudioUnitGetProperty(myAUnit, kAudioUnitProperty_FastDispatch,
                             kAudioUnitScope_Global, kAudioUnitSetParameterSelect,
                             &mySetParamProc, &size) != noErr)
        mySetParamProc = NULL;

    if (myRenderProc || myGetParamProc || mySetParamProc) {
        myConnInstanceStorage = GetComponentInstanceStorage(myAUnit);
    } else {
        myConnInstanceStorage = NULL;
    }
}

...

OSStatus Render (AudioUnitRenderActionFlags *  ioActionFlags,
                 const AudioTimeStamp *        inTimeStamp,
                 UInt32                        inOutputBusNumber,
                 UInt32                        inNumberFrames,
                 AudioBufferList *             ioData)

{

    if (myRenderProc != NULL) {
        return reinterpret_cast<AudioUnitRenderProc>(myRenderProc) (myConnInstanceStorage,
                                                                    ioActionFlags, inTimeStamp,
                                                                    inOutputBusNumber, inNumberFrames,
                                                                    ioData);
    }

    return AudioUnitRender(myAUnit, ioActionFlags, inTimeStamp, inOutputBusNumber, inNumberFrames, ioData);
}

Ссылки:

Посмотрите CAAudioUnit.cpp и CAAudioUnit.h включенный с 10.6 Инструментами XCode расположился в Developer/Extras/CoreAudio/PublicUtility.



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


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

Новый документ, описывающий, почему необходимо всегда проверять код возврата от AudioUnitGetProperty при использовании kAudioUnitProperty_FastDispatch свойства.