iOS
AudioUnit
CoreAudio

ギター入力ができるまで

More than 5 years have passed since last update.

注) @7ganoさん著書『iPhone Core Audio プログラミング』 のパクリ記事です。

Sample Code: github/GuitarInput


上にも書いた通りパクリ記事です。
本の中ではマイクからスピーカーのPlayThroughとして紹介されています。

ギターとiPhoneはApogee Jamを使いました。(iRigでも問題無く動きます)

説明する事がほとんど無いぐらい簡潔に書けてしまう。
ギター入力するためのコードがたった20行程度で書けてしまった。
けっこうすごいねAudioUnit。

- (void)prepareAUGraph {

    NewAUGraph(&_graph);
    AUGraphOpen(_graph);

    AudioComponentDescription cd;
    cd.componentType            = kAudioUnitType_Output;
    cd.componentSubType         = kAudioUnitSubType_RemoteIO;
    cd.componentManufacturer    = kAudioUnitManufacturer_Apple;
    cd.componentFlags           = 0;
    cd.componentFlagsMask       = 0;

    AUNode remoteIONode;
    AUGraphAddNode(_graph, &cd, &remoteIONode);

    AudioUnit remoteIOUnit;
    AUGraphNodeInfo(_graph, remoteIONode, &cd, &remoteIOUnit);

    UInt32 flag = 1;
    AudioUnitSetProperty(remoteIOUnit,
                         kAudioOutputUnitProperty_EnableIO,
                         kAudioUnitScope_Input,
                         1,
                         &flag,
                         sizeof(flag));

    AUGraphConnectNodeInput(_graph, remoteIONode, 1, remoteIONode, 0);

    AUGraphInitialize(_graph);

}

AUGraph作って、remoteIO用のAudioUnit作って、繋ぐだけ。
ポイントはremoteIOのenableIOスイッチをオンする所ぐらいでしょうか。

追伸

ギター入力してbluetoothスピーカーへの出力がしたかったのですができませんでした。
カテゴリをAVAudioSessionCategoryPlayAndRecordにするとbluetoothスピーカー読んでくれなくなります。
(パフォーマンスの問題で絞ってるのかも。ただでさえややラグだし)

ちなみにiOS6からカテゴリにAVAudioSessionCategoryMultiRouteができたのですが、
これでもbluetoothスピーカー出力できませんでした。
WWDC2012のセッション見るとHDMI(2ch)とイヤホン(2ch)の表記があるので、
いい音で聞きたかったらiRig+HDMIが良いのかな(できるのかは未確認)
ただそれだとノイズ出そうだし悩ましいw