iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
そもそも、録音のコールバック関数に渡されるデータは何なのだろうか?
型は以下のとおり。
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)
次回は、これをアプリケーションが独自に持っているリングバッファにどう書き込むかだ。