AUGraphを使っているとコールバック関数を登録しなければならないことがあります。

[c]

AURenderCallbackStruct callbackStruct;

{

callbackStruct.inputProc = recorderCallbackFunction;

callbackStruct.inputProcRefCon = reinterpret_cast<void *>((__bridge void *)self);

}

err = AUGraphSetNodeInputCallback(mAuGraph, remoteIONode, 0, &callbackStruct);

[/c]

こういった形で。

SwiftでAUGraphを使う場合1つ問題があり、これには関数のポインタが使われているのですがこれがSwiftで使えません。上で言うとrecorderCallbackFunctionの部分です。
つまり

[c]

func callbackFunction(

inRefCon:UnsafeMutablePointer<Void>,

ioActionFlags:UnsafeMutablePointer<AudioUnitRenderActionFlags>,

inTimeStamp:UnsafePointer<AudioTimeStamp>,

inBusNumber:UInt32,

inNumberFrames:UInt32,

ioData:UnsafeMutablePointer<AudioBufferList>) -> (OSStatus)

{

return noErr;

}

[/c]

こういうcallbackを用意したとして、

[c]

var callbackSgtruct = AURenderCallbackStruct(inputProc: callbackFunction , inputProcRefCon: nil)

error = AUGraphSetNodeInputCallback(mAuGraph, remoteIONode, 0, &callbackSgtruct)

[/c]

としてもエラーで登録できないのです。
この問題は少なくともSwift1.2まで存在しています。
解決法は現状は存在しないようなので、この部分に関してはObjective-Cを使うしか無いようです。


0 Comments

コメントを残す