我正在嘗試使用AudioQueueInputCallback
將麥克風數據寫入文件。我的代碼的回調看起來是這樣的:AudioFileWritePackets失敗(錯誤代碼:1885563711 - 'kcp')
func myAQInputCallback(inUserData: UnsafeMutableRawPointer?,
inQueue: AudioQueueRef,
inBuffer: AudioQueueBufferRef,
inStartTime: UnsafePointer<AudioTimeStamp>,
inNumPackets: UInt32,
inPacketDesc: UnsafePointer<AudioStreamPacketDescription>?) {
var error: OSStatus
var recorder = inUserData!.load(as: MyRecorder.self)
// Is this neccessary?
var tmpInOutNumPackets = inNumPackets
if inNumPackets > 0 {
error = AudioFileWritePackets(recorder.recordFile!,
false,
inBuffer.pointee.mAudioDataByteSize,
inPacketDesc,
recorder.recordPacket,
&tmpInOutNumPackets,
inBuffer.pointee.mAudioData)
checkError(error, msg: "Couldn't write packet to audio file.")
recorder.recordPacket += Int64(inNumPackets)
}
if recorder.running {
error = AudioQueueEnqueueBuffer(inQueue, inBuffer, 0, nil)
checkError(error, msg: "Couldn't enqueue buffer.")
}
}
凡MyRecorder
是struct
看起來像這樣:
struct MyRecorder {
var recordFile: AudioFileID?
var recordPacket: Int64
var running: Bool
}
的代碼失敗在AudioFileWritePackets
通話(與錯誤碼:1885563711 - 'kcp'
)。這裏可能會發生什麼故障?
我很樂意提供進一步的信息,但目前我不知道哪些代碼在這裏有幫助。
而且你可以看到我創建的函數參數inNumPackets
的臨時副本,否則AudioFileWritePackets
不會接受&inNumPackets
作爲參數(因爲它是一個不可改變的let
的常數)。
謝謝你的回答。這個改變並沒有解決我的問題,但錯誤描述確實幫助了我。我發現,record.recordPacket在一次回調調用後不會改變(就像'struct'是通過值傳遞的 - 即使我使用了'UnsafeMutableRawPointer?')。 [這是一個後續問題。](http://stackoverflow.com/questions/42596246/swift-3-pass-struct-by-reference-via-unsafemutablerawpointer)。 – Herickson
啊哈 - 很好看 –