Inter-App Audioに対応する

まったく安定しないですな。
特にEffectがダメっぽい。

ざっくりした手順としては、
プロジェクトを作成して、
Inter-App AudioとBackground Modesを有効にして、
Background Modesは「Audio, AirPlay and Picture in Picture」にチェックを入れる。
プロジェクトを作成する前でも後でも良いので、
Inter-App Audioが有効なProvisioning Profileを作成して、
それをプロジェクトのBundle Identifierに設定する。

次に、”Info.plist”に「AudioComponents」(Array)を追加する。
そして要素(Dictionary)を1つ追加して、

manufacturer
name
subtype
type
version

を追加する。
Typeは、versionのみNumberに変更して、
それ以外はString(デフォルト)のままでOK。

manufacturerは、作成した会社を識別する4文字。
Appleは’appl'(*1)を使っている。
nameはアプリ名。
subtypeは、アプリを識別する4文字。
サンプルコードでは’iasp’を使っているが、
これは、”IAA Sampler”を略したと思われる。
typeは、’aurx’と’auri’と’aurg’のいずれか。
Generatorなら’aurg’を使用する。(”AUComponent.h”を参照)
versionは、整数値を使用すること。

あと、もう一つ、「Bundle display name」を追加して、
とりあえず、$(PRODUCT_NAME)を指定しておく。
(どこで使われるのかまでは把握していない。。。)

次に、これらを使ってホストアプリにAudioUnitを公開する。

    AudioComponentDescription desc = {
        kAudioUnitType_RemoteGenerator, 'hoge', 'fuga', 0, 0 };
    OSStatus result = AudioOutputUnitPublish( &desc, CFSTR("Foo"), 1, audioUnit );

ここでのポイントは、AudioComponentDescriptionの
componentFlagsとcomponentFlagsMaskには0を設定すること。
AudioOutputUnitPublishの3つ目の引数にはversionの値を指定するらしいが、
サンプルコードを見ると、そうなってないのでなんとも・・・。

これでうまくいくはず。
“Info.plist”でスペルミスをすると、AudioOutputUnitPublishで失敗する。

あとは、音の出口であるRemoteIOを、
AudioOutputUnitPublishを使って公開するだけ。
なので、シンセアプリのように動的に波形を生成する場合は、
AUGraphによる接続は必要なかったりする。

残りはサンプルコードを見てなんとかしてください。
動作が不安定だけど、サンプルコードでも同様に不安定なので、
もう少しさぐってみようと思う。

おしまい。

(*1) kAudioUnitManufacturer_Appleとして定義されている。

Leave a Comment