Attention! Translated article might be found on my English blog.

2016年8月3日水曜日

ホストアプリで自作v3 AudioUnitのカスタムUIを表示させる

前回の記事の続きです。

自作のv3 AudioUnitのカスタムUIがAUv3HostHosting AUなどのホストアプリで表示できない原因を調査していました。

どうやらビューコントローラのpreferredContentSizeプロパティをセットする必要があるようです。
FilterDemoではFilterDemoViewControllerのviewDidLoad内でpreferredContentSizeをセットしているので、それに倣って
- (void) viewDidLoad {
    [super viewDidLoad];
    
    self.preferredContentSize = NSMakeSize(480, 272);
}
としました。

なお、AudioUnit App Extensionターゲット追加時に自動生成されるコードでは、viewDidLoadの実装は
- (void) viewDidLoad {
    [super viewDidLoad];
    
    if (!audioUnit) {
        return;
    }
    
    // Get the parameter tree and add observers for any parameters that the UI needs to keep in sync with the AudioUnit
}
となっています。
しかし、このaudioUnitインスタンスは必ずnilになるようで、即returnでviewDidLoadを抜けてしまいます。
このインスタンスはAUAudioUnitFactoryプロトコルのcreateAudioUnitWithComponentDescription:error:で
- (AUAudioUnit *)createAudioUnitWithComponentDescription:(AudioComponentDescription)desc error:(NSError **)error {
    audioUnit = [[MyAudioUnit alloc] initWithComponentDescription:desc error:error];
    
    return audioUnit;
}
とセットされます。
しかし、createAudioUnitWithComponentDescription:error:よりもviewDidLoadの方が先に実行されるので、結果としてviewDidLoadの時点ではaudioUnitはnilのままになっているようです。

なんというか、AudioUnit App Extensionターゲットで自動生成されるコードって色々おかしい気がします…。

AutoLayoutを疑ったり結構原因の特定に時間がかかりました…。

というわけで次はビューにUIを追加していきます。