kAudioFormatFlagIsNonInterleaved
CoreAudioを弄って音を出すところまで試しました。(というか出したつもり)
SourceForge.jpのコンパイラファームで試しているんですが、リモートからsshでログインしてオーディオデバイスがオープンできてしまいました。
これっていいんでしょうかね。データセンターでピーピーなってるんでしょうか、、、。
念のため無音でテストしています、、、がバグってたら意味ないですね。
一応テストは動いていることにして、現在はcore_audio_sinkの実装に取り掛かっています。
基本的にASIOと同じように扱えるんですが、微妙に違うところもあってインタフェースに悩みます。
たとえば、PCMのフォーマットが、
enum { kAudioFormatFlagIsFloat = ( 1L << 0), kAudioFormatFlagIsBigEndian = ( 1L << 1), kAudioFormatFlagIsSignedInteger = ( 1L << 2), kAudioFormatFlagIsPacked = ( 1L << 3), kAudioFormatFlagIsAlignedHigh = ( 1L << 4), kAudioFormatFlagIsNonInterleaved = ( 1L << 5), kAudioFormatFlagIsNonMixable = ( 1L << 6), kAudioFormatFlagsAreAllClear = ( 1L << 31),Standard Flag Values for AudioStreamBasicDescription
というフラグの組み合わせで表現されるのですが、kAudioFormatFlagIsNonInterleavedのオン/オフでバッファの扱いが変わってしまうのが面倒なところです。
kAudioFormatFlagIsNonInterleavedがオンの場合、ASIOのように各チャンネル毎に別々のバッファを用います。
一方、kAudioFormatFlagIsNonInterleavedがオフの場合は各チャンネルのサンプルは一つのストリームにまとめられるためバッファは一つです。
よって、このフラグの値に応じてSinkの数と扱い方も変わってくることになります。
All Aboutの写真を見る限り、kAudioFormatFlagIsNonInterleavedはユーザー設定項目ではないようですが、これはプログラムで好きなほうを選んで使ってもいいんでしょうかね。
kAudioFormatFlagIsNonInterleavedのオン/オフに全てのデバイスが対応しているのなら別クラスにしてしまってもいいんですけど、そういう記述も見当たらないです。
#やっぱり実機が手元にないと辛いです。