2017-03-03 20 views
1

現在、AudioQueueInputCallbackを使用してマイクデータをファイルに書き込もうとしています。AudioFileWritePacketsが失敗しました(エラーコード:1885563711 - 'kcp')

struct MyRecorder { 
    var recordFile: AudioFileID? 
    var recordPacket: Int64 
    var running: Bool 
} 

コードは(: - 'kcp' 1885563711 errorCodeを持つ)AudioFileWritePackets呼び出しで失敗:MyRecorderはこのように見ているstructある

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.") 
    } 
} 

:私のコードのコールバックは、次のようになります。ここで何が失敗するのでしょうか?

私はさらなる情報を提供してくれると嬉しく思っていますが、現在どのコードが役に立つかはわかりません。

また、あなたが(それは不変let -constantだから)そうAudioFileWritePacketsが引数として&inNumPacketsを受け付けませんので、私は、関数の引数inNumPacketsの一時的なコピーを作成しています見ることができるように。

答えて

1

というエラーがファイルの終わりを超えたオフセット

パケットとして記載され、実際'pck?'又はkAudioFileInvalidPacketOffsetErrorある、またはファイルの末尾に書き込まないVBR形式、 又はパケットテーブルを構築するときに破損したパケットサイズが読み取られました。

問題は、あなたがAudioFileWritePackets戻った後tmpInOutNumPacketsで発見され書かれたパケットの実際の数を、使用していないという事実に関係すると考えられます。

ので、代わりに

recorder.recordPacket += Int64(tmpInOutNumPackets) 

を試してみてください。

+0

ありがとうございます。変更は私の問題を解決しませんでしたが、エラーの説明が間違いなく私を助けました。私は、 'record.recordPacket'は(' UnsafeMutableRawPointer? 'を使用していたとしても) 'call'コールが1回コールバックされた後に変更されないことを発見しました。 [フォローアップの質問です。](http://stackoverflow.com/questions/42596246/swift-3-pass-struct-by-reference-via-unsafemutablerawpointer)。 – Herickson

+0

aha - well spotted –

関連する問題