Всегда проверяйте код результата от 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 свойства. |