なぜなら、AUGenericViewのイニシャライザにはAudioUnitインスタンスが必要だからです。
私が調べた限りでは、AUAudioUnitオブジェクトからAudioUnitインスタンスを取得する方法が見つかりませんでした。
一方、AVAudioUnitオブジェクトであれば、そのaudioUnitプロパティでAudioUnitインスタンを取得できます。
というわけで、適当にホストアプリを作り、AUGenericViewをつくってみました。
コードは以下の通りです。
結果、- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {AudioComponentDescription desc;desc.componentType = 'aufx';desc.componentSubType = 'vbrt';desc.componentManufacturer = 'Symi';[AVAudioUnit instantiateWithComponentDescription:descoptions:0completionHandler:^(__kindof AVAudioUnit * _Nullable audioUnit, NSError * _Nullable error) {self.unit = audioUnit;AudioUnit unit = [audioUnit audioUnit];AUGenericView *view = [[AUGenericView alloc] initWithAudioUnit:unit];view.frame = self.window.contentView.frame;[self.window.contentView addSubview:view];}];}
ビューはできたものの、パラメータが表示されませんでした。
FilterDemoとの比較の結果、AUParameter作成時に以下のようにflags:kAudioUnitParameterFlag_IsReadableとkAudioUnitParameterFlag_IsWritableを指定するようにしました。
その後、再び確認してみると 、AUParameter *freqParameter = [AUParameterTree createParameterWithIdentifier:VibratoParameterIdentifierFrequencyname:VibratoParameterNameFrequencyaddress:VibratoParameterAddressFrequencymin:0max:.01unit:kAudioUnitParameterUnit_HertzunitName:nilflags:kAudioUnitParameterFlag_IsReadable | kAudioUnitParameterFlag_IsWritablevalueStrings:nildependentParameters:nil];
期待通りDepthとFrequencyを変更できるようになりました!
なお、Depthをwritableのみ、Frequencyをreadableのみにしてみると、
以下の画像のようになりました。
Depthにはスライダーが付いているものの、Frequencyは変更できないようでした。なるほどー。
まとめ、
- ホスト側では、v3 のAudioUnitのgeneric viewが欲しい場合、AVAudioUnitオブジェクトからAudioUnitインスタンスを取得する
- クライアント側では、AUParameter生成の際にflagsとしてkAudioUnitParameterFlag_IsReadable | kAudioUnitParameterFlag_IsWritable を指定する。
以上です。