トップ «前の日記(2012-03-28) 最新 次の日記(2012-03-30)» 編集

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|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|

2012-03-29 [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プログラミング(永野 哲久 著)
とれも参考にさせていただきました。

トップ «前の日記(2012-03-28) 最新 次の日記(2012-03-30)» 編集