Audioのオーディオデバイスと入出力のデータをやり取りするには、入出力を行う関数を登録したあと、デバイスの動作を開始させます。入出力の関数の登録を行う関数は<CoreAudio/AudioHardware.h>で宣言されていて、AudioDeviceCreateIOProcIDという関数になります。Tiger以前はAudioDeviceAddIOProcという関数でしたが、LeopardからはDeprecatedになって、こちらに変わっています。outIOProcID)inDeviceはAudioDeviceID、inClientDataは任意のデータ、inProcには入出力に使う関数名を渡します。outIOProcIDには登録ごとにIDナンバーが返ってきます。これがLeopardの追加部分なのですが、関数名でなくIDで登録を管理するようになり、同じIOProcに複数のデバイスを登録しても大丈夫みたいな感じのようです。IOProc関数の引数の構成は決められていて以下のように宣言されています。inClientData);AudioUnitと違って、オーディオデバイスにインプットとアウトプット両方ある場合、両方のデータが一回で渡ってきます。レイテンシーなんてモノがありますから、インプットのデータは少し前に取り込まれたデータですし、アウトプットに渡すデータは少し後に再生されますので、それらの時間がAudioTimeStampで渡ってきます。DAWみたいに再生しながら録音する場合などは、これらの時間のギャップを計算して、録音されたデータを再生したものに合わせる事が必要になってくると思います。IOProc関数を解除するのはAudioDeviceDestroyIOProcID関数です。こちらもLeopardから変更になって、以前のAudioDeviceRemoveIOProcはDeprecatedになっています。inIOProcID)AudioDeviceCreateIOProcIDで関数が登録できたら、動作を開始させます。それが、AudioDeviceStart関数になります。動作を停止させるにはAudioDeviceStopを使います。inProcID)では、これらを使ってオーディオデバイスを動かしてみたいと思います。Builderでインスタンス化して、実行します。return;}@end実行してみるとログにダダダーッと文字が表示されてIOProcが(デフォルトだと512フレーム単位で)呼ばれている事が分かるとおもいます。AudioのIOProcは大丈夫だと思うのですが、AudioUnitのOutputUnitだと、アウトのデータを何も書き込まないままnoErrを返したら大音量でノイズが再生されてしまったというトラウマがあるので、いちおうアウトをゼロでクリアしています。何か音を出すにはここでデータを渡してください。Audio用の別スレッドで呼ばれますので、マルチスレッディングなコードを心がけてください。いった感じで、7回ほど続けてきたCoreAudio.Frameworkはこんなところでしょうか。普通にオーディオデバイス使うならAudioUnitのOutputUnitでやった方がいろいろと面倒見てくれて良いと思いますが、こうやって裸にして調べてみるとAudioUnitの中で何やってるのかもだいたい分かりますし、サンプリングレートの変換とか必要なければこっちでやった方がパフォーマンスを稼げると思いますので。次はAudioToolboxに移ってオーディオファイル関係あたりを見ていこうと思います。CoreAudio.Frameworkに関しては気が向けばまた何か追加するかもしれません。わかりやすい説明でいつも参考にさせていただいています。引数inInputDataでレコーディングバッファを取得しながらoutOutputDataでプレイバックバッファの出力が行えそうだと思うのですが、なぜか実現できません。AM入力と出力が違うオーディオデバイスじゃありませんか?Macの本体についてる入力と出力は別のオーディオデバイスだったりしますので。外付けのオーディオインターフェースだと、入力も出力も同じIDなので大丈夫だったと思います。Audioがごぶさたになっていまして、ちょっとうろ覚えです、すみません。ちなみに、違うデバイスの入力から出力へスルーさせるのとかはAppleのサンプルのComplexPlayThruあたりが参考になると思います。AM回答ありがとうございます。PMkotanさんがまたここをチェックしていただいている事を祈りつつ...。僕が試した限りではひとつのIOProcでインもアウトも来ています。確認で書きますが、同じIDというのはDefaultInputDeviceもDefaultOutputDeviceもホントに同じAudioDeviceIDでしょうか?同じであれば、このエントリのコードを動作させた場合、inInputDataにはインプットのオーディオデータが来ていますので、そのままoutOutputDataに書き込んでやれば音声がスルーされます。AudioDeviceIDはインプットもアウトプットも関係ありませんので、AudioDeviceCreateIOProcIDは一回だけです。最初のコメントに「入力用と出力用の二つのデバイスIDで開き」とありますが、IDが同じなのにふたつ開くというのは矛盾している気がします。コメントをキャンセルメールアドレスが公開されることはありません。