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

Свойства аудиоустройства и базовые типы данных основы

Q: При работе со свойствами Audio Unit, берущими и возвращающими Базовые Типы данных Основы, кто ответственен за сохранение или выпуск.

A: При работе со свойствами Audio Unit, берущими и возвращающими Базовые Типы данных Основы, кто ответственен за сохранение или выпуск.

Каждый раз, когда узел Аудиоустройства работает со свойствами Audio Unit, которые являются Базовыми Типами данных Основы, вызывающая сторона почти всегда владеет ссылкой и поэтому ответственна за выпуск его как требуется.

Сводка для AudioUnitSetProperty

Сводка для AudioUnitGetProperty

Все Базовые объекты Основы, возвращенные AudioUnitGetProperty следуйте за Базовой семантикой Копии Основы, и поэтому принадлежат вызывающей стороне. Это - ответственность за вызывающие стороны оставить владение (использование CFRelease) когда сделано с возвращенным значением.

Следующие свойства возвращают Базовые объекты Основы:

  • kAudioUnitProperty_ClassInfo - Возвраты a CFDictionaryRef.

  • kAudioUnitProperty_ParameterValueStrings - Возвраты a CFArrayRef.

  • kAudioUnitProperty_FactoryPresets - Возвраты a CFArrayRef.

  • kAudioUnitProperty_ElementName - Возвраты a CFStringRef.

  • kAudioUnitOfflineProperty_PreflightName - Возвраты a CFStringRef.

  • kMusicDeviceProperty_BankName - Возвраты a CFStringRef.

Следующие свойства возвращают Базовые объекты Основы, встроенные как поля в структуры C:

  • kAudioUnitProperty_PresentPreset - Возвраты AUPreset, где presetName a CFStringRef содержа предварительно установленное имя.

  • kAudioUnitProperty_ParameterStringFromValue - Возвраты a AudioUnitParameterStringFromValue структура, где outString a CFStringRef (может быть NULL).

  • kAudioUnitProperty_ParameterIDName - Возвраты a AudioUnitParameterNameInfo структура, где outName a CFStringRef.

  • kAudioUnitProperty_ParameterClumpName - Возвраты a AudioUnitParameterNameInfo структура, где outName a CFStringRef.

  • kAudioUnitProperty_CocoaUI - Возвраты a AudioUnitCocoaViewInfo структура, где CFStringRef имя (ена) класса возвращается в mCocoaAUViewClass поле.

Число имен классов в mCocoaAUViewClass поле может быть найдено при помощи следующего кода. dataSize максимальный размер свойства, возвращенного путем вызова AudioUnitGetPropertyInfo для kAudioUnitProperty_CocoaUI свойство.

UInt32 numberOfClasses = (dataSize - sizeof(CFURLRef)) / sizeof(CFStringRef);

Обработка названий параметра

Владение основывается kAudioUnitParameterFlag_CFNameRelease флаг. Этот флаг обычно всегда устанавливается.

  • kAudioUnitProperty_ParameterInfo - Возвраты a AudioUnitParameterInfo структура. Только выпуск unitName и cfNameString CFStringRefs если kAudioUnitParameterFlag_CFNameRelease флаг установлен. См. Перечисление 1.

Узел Аудиоустройства должен проверить на этот флаг и, если установлено, должен выпустить название параметра аудиоустройства, когда это сделано с помощью него. Если этот флаг не установлен, Узел может предположить, что Аудиоустройство выпустит свои названия параметра.

Перечисление 1  , Иллюстрирующее использование kAudioUnitParameterFlag_CFNameRelease.

AudioUnitParameterInfo auinfo;
UInt32 propertySize = sizeof(AudioUnitParameterInfo);
OSStatus err = AudioUnitGetProperty(mAudioUnit,
                                    kAudioUnitProperty_ParameterInfo,
                                    mScope,
                                    mParameterID,
                                    &auinfo,
                                    &propertySize);
if (err) { // handle error };

... 

if (auinfo.flags & kAudioUnitParameterFlag_CFNameRelease) {
    if (auinfo.flags & kAudioUnitParameterFlag_HasCFNameString && auinfo.cfNameString != NULL)
        CFRelease(auinfo.cfNameString);
    if (auinfo.unit == kAudioUnitParameterUnit_CustomUnit && auinfo.unitName != NULL)
        CFRelease(auinfo.unitName);
}


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


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

Новый документ, описывающий владение типов данных CF когда свойства Getting/Setting AU.