iPhone / iPod TouchでのSynthesisやAudioUnit プログラミングに関する個人的なまとめ


Callback

AUのコールバックをObjective-Cで実装する方法

Objective-Audioより
  • AudioUnitCallbackStructの設定
AURenderCallbackStruct callback;
callback.inputProc = Callback;
callback.inputProcRefCon = self; //あるいはObjective-Cでコールバックを実装するオブジェクト
  • コールバック関数から呼び出し
OSStatus Callback(void *inRefCon,
                  AudioUnitRenderActionFlags *ioActionFlags,
                  const AudioTimeStamp *inTimeStamp,
                  UInt32 inBusNumber,
                  UInt32 inNumberFrames,
                  AudioBufferList *ioData)
{
    OSStatus err = 
        [(id)inRefCon callback:inNumberFrames
                        ioData:ioData 
                 ioActionFlags:ioActionFlags 
                   inTimeStamp:inTimeStamp 
                   inBusNumber:inBusNumber];

    return err;
} 
  • コールバック用メソッド
- (OSStatus)callback:(UInt32)inNumberFrames 
              ioData:(AudioBufferList *)ioData
       ioActionFlags:(AudioUnitRenderActionFlags *)ioActionFlags
         inTimeStamp:(const AudioTimeStamp *)inTimeStamp
         inBusNumber:(UInt32)inBusNumber
{
    OSStatus err;
    
    //ここに実装する
    
    return err;
}
  • インスタンス変数とかselfとか何の制限もなく普通にアクセス出来るようになる
  • コールバック内をNSAutoreleasePoolで囲まなくてはいけない

NSTimer

NSRunLoopでタイマーの処理を非同期にする

[[NSRunLoop currentRunLoop] addTimer: hogehoge forMode:NSEventTrackingRunLoopMode];
  • サンプル単位の処理や時間軸に対する厳密性が必要なシーケンサを作る場合、GUIのアクセス等でタイマーが狂い処理がいい加減になる事がある為、NSTimerの後に上記のコードを挟むことで非同期でイベント処理させ、問題を改善する事が出来る

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

管理人/副管理人のみ編集できます