2016-11-12 2 views
3

Depuis la voie d'instancier un AVAudioUnit est ceci:Comment sous-classe AVAudioUnit?

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

Comment suis-je censé sous-classe AVAudioUnit? Je l'ai essayé:

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

Mais le audioUnit qui est retourné dans le bloc est toujours de type AVAudioUnit et NON MySubclassOfAVAudioUnit.


par Rythmique Réponse Fistman, je suis ma sous-classe personnalisée enregistrais AUAudioUnit avec le code exemple d'Apple:

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

Je veux que ma sous-classe AVAudioUnit toujours utiliser mon AUAudioUnit.

+0

J'ai réalisé que ma réponse était erronée, vous ne pouvez que sous-classer AUAudioUnit et l'avoir enveloppé dans le bon type de sous-classe 'AVAudioUnit'. S'il vous plaît voir ma réponse mise à jour. –

Répondre

3

De instantiateWithComponentDescription:completionHandler:

L'exemple retourné sera normalement de AVAudioUnit une sous-classe (AVAudioUnitEffect, AVAudioUnitGenerator, AVAudioUnitMIDIInstrument ou AVAudioUnitTimeEffect), choisi en fonction du type du composant.

MISE À JOUR J'ai eu ce mal - vous ne pouvez pas instancier votre propre AVAudioUnit sous-classe, vous ne pouvez instancier votre AUAudioUnit, enveloppé dans le haut-AVFoundation AVAudioUnit sous-classe appropriée (par exemple AVAudioUnitEffect, etc.) .

Le code suivant provoque MyAUAudioUnit, une sous-classe de AUAudioUnit à instancié:

#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); 
    }]; 
} 

BIT MAUVAIS

Donc, pour avoir votre AVAudioUnit sous-classe instanciée, vous devez d'abord vous inscrire avec le AUAudioUnit méthode:

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

Il y a un extrait de code et quelques pièges possibles dans this devforum thread.

+0

Merci pour la réponse rapide. J'ai suivi exactement cette procédure, mais instantiateWithComponentDescription ne retournera jamais une instance de ma sous-classe. Le fil de discussion ne semble pas résoudre ce problème, malheureusement. Je vais ajouter un peu plus de détails à la question. – user1021430

+0

pouvez-vous montrer comment vous appelez 'registerSubclass'? peut-être montrer une partie de votre sous-classe 'AUAudioUnit' aussi? –

+0

Juste curieux de savoir si l'OP a compris cela. J'ai le même problème. – GWRodriguez