iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
Remote IO UnitのRemote Inputについて疑問が多いので、色々と調べてみたいが、実際に動作させてみて分かるという所もあるので前に進める。
音楽CDは、44.1kHz / 2ch 16bit。
Audio Unitの標準サンプル単位AudioUnitSampleTypeは、iOSでは8.24固定小数点。OS Xでは、Float32らしい。つまり、32bit。
オーディオ正準形のサンプル単位AudioSampleTypeは、16bit符号付き整数。
Remote Outputの入出力の形式は、『iPhone Core Audioプログラミング』によると、iPhone OS 2.2.1までは32bit。iPhone OS 3.0以降では16bitらしい。
以上の情報を参考にして、扱うサンプルは、Audio Unit標準サンプル単位のモノラルにする事にした。
@interface AudioUnitViewController : UIViewController
:
@property (nonatomic, assign) AudioUnitSampleType *buffer;
@property (nonatomic, assign) uint32_t startingSampleCount;
@property (nonatomic, assign) uint32_t maxSampleCount;
:
@end
バッファに書き込むメソッドを用意する。
- (void)write:(UInt32)inNumberFrames data:(AudioBufferList *)ioData
{
uint32_t available = self.maxSampleCount - self.startingSampleCount;
if (available < inNumberFrames) {
inNumberFrames = available;
}
memcpy(self.buffer + self.startingSampleCount, ioData->mBuffers[0].mData, sizeof(AudioUnitSampleType) * inNumberFrames);
self.startingSampleCount = self.startingSampleCount + inNumberFrames;
if (self.maxSampleCount <= self.startingSampleCount) {
[self stop:nil];
}
}
録音のコールバック関数に渡されたデータをこのバッファに書き込む。
static OSStatus MyAURenderCallack(void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData)
{
AudioUnitViewController *viewController = (AudioUnitViewController *)inRefCon;
[viewController write:inNumberFrames data:ioData];
return noErr;
}
ちょっと、乱暴なコードとなったが、次回は、このバッファのデータを再生してみる。さて、どうなるか。