Как создать подкласс AVAudioUnit?

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

[AVAudioUnit instantiateWithComponentDescription:componentDescription options:0 completionHandler:^(__kindof AVAudioUnit * _Nullable audioUnit, NSError * _Nullable error) {
    }];

Как я должен создать подкласс AVAudioUnit? Я пробовал это:

[MySubclassOfAVAudioUnit instantiateWithComponentDescription:componentDescription options:0 completionHandler:^(__kindof AVAudioUnit * _Nullable audioUnit, NSError * _Nullable error) {
    }];

Но audioUnit, возвращаемый в блоке, по-прежнему имеет тип AVAudioUnit, а НЕ MySubclassOfAVAudioUnit.


Согласно ответу Rhythmic Fistman, я регистрирую свой пользовательский подкласс AUAudioUnit с примером кода Apple:

componentDescription.componentType = kAudioUnitType_Effect;
componentDescription.componentSubType = 0x666c7472; /*'fltr'*/
componentDescription.componentManufacturer = 0x44656d6f; /*'Demo'*/
componentDescription.componentFlags = 0;
componentDescription.componentFlagsMask = 0;

Я хочу, чтобы мой подкласс AVAudioUnit всегда использовал мой AUAudioUnit.


person user1021430    schedule 12.11.2016    source источник
comment
Я понял, что мой ответ был неправильным, вы можете только подкласс AUAudioUnit и завернуть его в правильный тип подкласса AVAudioUnit. Пожалуйста, смотрите мой обновленный ответ.   -  person Rhythmic Fistman    schedule 17.11.2016


Ответы (1)


От 1_

Возвращенный экземпляр AVAudioUnit обычно относится к подклассу (AVAudioUnitEffect, AVAudioUnitGenerator, AVAudioUnitMIDIInstrument или AVAudioUnitTimeEffect), выбранному в соответствии с типом компонента.

ОБНОВЛЕНИЕ Я ошибся: вы не можете создать свой собственный подкласс AVAudioUnit, вы можете только создать экземпляр своего AUAudioUnit, обернутого в соответствующий встроенный подкласс AVFoundation AVAudioUnit (например, AVAudioUnitEffect , так далее).

Следующий код вызывает создание экземпляра MyAUAudioUnit, подкласса AUAudioUnit:

#import <AVFoundation/AVFoundation.h>

@interface MyAUAudioUnit : AUAudioUnit {

}
@end

@implementation MyAUAudioUnit
    // implement it here
@end

// later
- (void)instantiateMyAUAudioUnitWrappedInAVAudioUnit {
    // register it (need only be done once)
    AudioComponentDescription desc;
    desc.componentType = kAudioUnitType_Effect;
    desc.componentSubType = 0x666c7472; /*'fltr'*/
    desc.componentManufacturer = 0x44656d6f; /*'Demo'*/
    desc.componentFlags = 0;
    desc.componentFlagsMask = 0;

    [AUAudioUnit registerSubclass:MyAUAudioUnit.class asComponentDescription:desc name:@"MyAU" version:1];

    // Instantiate as many times as you like:
    [AVAudioUnit instantiateWithComponentDescription:desc options:0 completionHandler:^(AVAudioUnit * audioUnit, NSError *error) {
        NSLog(@"AVAudioUnit: %@, error: %@", audioUnit, error);
    }];
}

НЕПРАВИЛЬНЫЙ БИТ

Поэтому, чтобы создать экземпляр вашего подкласса AVAudioUnit, вы должны сначала зарегистрировать его с помощью метода AUAudioUnit:

+[AUAudioUnit registerSubclass:asComponentDescription:name:version:]

В этой ветке форума разработчиков есть фрагмент кода и некоторые возможные ошибки.

person Rhythmic Fistman    schedule 12.11.2016
comment
Спасибо за быстрый ответ. Я следовал именно этой процедуре, но instanceiateWithComponentDescription никогда не вернет экземпляр моего подкласса. Тема обсуждения, к сожалению, не затрагивает эту проблему. Я добавлю немного больше деталей к вопросу. - person user1021430; 15.11.2016
comment
можешь показать, как ты звонишь registerSubclass? может быть, показать некоторые из вашего подкласса AUAudioUnit тоже? - person Rhythmic Fistman; 16.11.2016
comment
Просто любопытно узнать, понял ли это ОП. У меня точно такая же проблема. - person GW.Rodriguez; 29.11.2017
comment
Здесь есть код, связанный с ответом @ hotpaw2: stackoverflow.com/a/46775145/22147 - person Rhythmic Fistman; 29.11.2017