[iOS]Looping Recorderの基礎(Audio Unit (2))
そもそも、録音のコールバック関数に渡されるデータは何なのだろうか?
型は以下のとおり。
static OSStatus MyAURenderCallack(void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData);
typedef struct AudioBufferList {
UInt32 mNumberBuffers;
AudioBuffer mBuffers[1];
} AudioBufferList;
typedef struct AudioBuffer {
UInt32 mNumberChannels;
UInt32 mDataByteSize;
void* mData;
} AudioBuffer;
AudioBuffer構造体のmDataメンバー変数は、AudioUnitSampleType型だ。
typedef SInt32 AudioUnitSampleType;
OS XのAudio UnitではFloat32型という情報があったが、Xcodeの文書では、SInt32となっていた。サイズは同じで、それをどう使うのかアプリ次第なので、SInt32に統一されたのだろうか?ちなみに、iOSでは8.24固定小数点だそうだ。
先日の録音時に呼ばれるコールバック関数のデバッグ出力をもう少し詳細にしてみた。
static OSStatus MyAURenderCallack(void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData)
{
DBGMSG(@"%s, inNumberFrames:%u", __func__, (unsigned int)inNumberFrames);
DBGMSG(@"ioData: mNumberBuffers(%u)", (unsigned int)ioData->mNumberBuffers);
DBGMSG(@"ioData->mBuffers: mNumberChannels(%u), mDataByteSize(%u)",
(unsigned int)ioData->mBuffers->mNumberChannels,
(unsigned int)ioData->mBuffers->mDataByteSize);
return noErr;
}
エミュレータでの出力結果は以下のとおり。
2012-03-30 00:56:22.237 DemoAudio[1566:12307] MyAURenderCallack, inNumberFrames:512
2012-03-30 00:56:22.239 DemoAudio[1566:12307] ioData: mNumberBuffers(1)
2012-03-30 00:56:22.240 DemoAudio[1566:12307] ioData->mBuffers: mNumberChannels(2), mDataByteSize(2048)
次回は、これをアプリケーションが独自に持っているリングバッファにどう書き込むかだ。
ソースコード
GitHubからどうぞ。
https://github.com/murakami/DemoAudio - GitHub
関連情報
Cocoa Life KOF2011特別編 - Facebook
Cocoa勉強会 関西の会誌。
iPhone Core Audioプログラミング(永野 哲久 著)
とれも参考にさせていただきました。