トップ «前の日記(2012-04-02) 最新 次の日記(2012-04-04)» 編集

Cocoa練習帳

iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど

2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|

2012-04-03 [iOS]Looping Recorderの基礎(Audio Unit (5))

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;
}

ちょっと、乱暴なコードとなったが、次回は、このバッファのデータを再生してみる。さて、どうなるか。

_ ソースコード

GitHubからどうぞ。
https://github.com/murakami/DemoAudio - GitHub

_ 関連情報

Cocoa Life KOF2011特別編 - Facebook
Cocoa勉強会 関西の会誌。
iPhone Core Audioプログラミング(永野 哲久 著)
とれも参考にさせていただきました。

トップ «前の日記(2012-04-02) 最新 次の日記(2012-04-04)» 編集