プログラミング > Core Audio - Mac >

コールバックをObjective-Cで実装する


たとえば、AudioUnitとかでコールバックをObjective-Cで記述する方法。

AudioUnitCallbackStructを以下のような感じで宣言して、inputProcRefConにはコールバックを実装するObjective-Cのオブジェクトを渡し、

AURenderCallbackStruct callback;
callback.inputProc = Callback;
callback.inputProcRefCon = self; //あるいはObjective-Cでコールバックを実装するオブジェクト

C言語の関数からも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で囲まなくてはいけないでしょう。

トラックバック(0)

このブログ記事を参照しているブログ一覧: コールバックをObjective-Cで実装する

このブログ記事に対するトラックバックURL: http://objective-audio.jp/oa80/mt-tb.cgi/42

コメントする


画像の中に見える文字を入力してください。