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

2017年10月14日土曜日

自作V3 AudioUnitをin-processに対応させるためのステップ

NOTEEnglish article is available.

前回の記事で自作AUをGarageBandで使えるようにするには、
in-processな読み込みに対応させる必要がありそうということが分かりました。

試行錯誤の結果、なんとかGarageBand対応版をリリースできたので、
おおまかな修正手順を載せておきます。

手順:
1:AU用のcocoa frameworkターゲットを作る。
2:frameworkのターゲットにAU(.appex)ターゲットの実装ファイルを全て移す。
  ただし、xibや画像リソース類は両方のターゲットに含める。  
3:適当な.mファイルを用意し、ダミー関数を実装する。それを.appexターゲットに含ませる。
4:.appexのInfo.plistを編集する。NSExtension -> NSExtensionAttributes にAudioComponentBundleというキーを追加し、frameworkターゲットのbundle identifierを値として設定する。
5:サンプルコードのFilterDemoViewController.mを参考にして、AUのview controllerのinitをオーバーライドする。自分の場合は以下の通り。
- (id)init {
    self = [super initWithNibName:@"AudioUnitViewController"
                           bundle:[NSBundle bundleForClass:NSClassFromString(@"AudioUnitViewController")]];
    return self;
}
これが無いとGarageBandでビューを表示できませんでした。
  GarageBandのAUの扱い方は少し特殊な気がします。

その他tips:

外部framework(今回新しく作ったAU用のCocoa Frameworkではなく、in-process対応前から既に利用していたもの)は内包アプリとAU用frameworkの両方にembedする方が良さそう。AU用framework側がembedしてない場合、GarageBandでは以下のようなエラーが出てAUをロードできなかった。
Error loading {...中略...}/SYVibratoFramework:  dlopen({...中略...}/SYVibratoApp.app/Contents/Frameworks/SYVibratoFramework.framework/SYVibratoFramework, 265): Library not loaded: @rpath/SYFW.framework/Versions/A/SYFW
  Referenced from: {...中略...}/SYVibratoApp.app/Contents/Frameworks/SYVibratoFramework.framework/SYVibratoFramework
  Reason: image not found
もしかしたら@rpathてのを設定できればembedしなくても解決できるかもしれない。