たとえば、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で囲まなくてはいけないでしょう。
コメントする