2017-05-17 17 views
2

私はSwiftで連続FIFOオーディオレコーダーを作成しようとしています。私は、audioQueueCallbackを作成しようとしている間に実行している問題です。ドキュメントからAudio Queue Bufferの<AudioTimeStamp>を取得

AudioTimeStampは、このinitメソッドがあります。

AudioTimeStamp(mSampleTime: Float64, mHostTime: UInt64, mRateScalar: Float64, mWordClockTime: UInt64, mSMPTETime: SMPTETime, mFlags: AudioTimeStampFlags, mReserved: UInt32)

をそして私はその使用方法のアイデアを持っていません。

audioQueuesをオフにすることができるようにするために、デバイスには信頼できる内部時計が必要ですが、そのためのドキュメントは見つかりませんでした。ここで

はBufferQueueの作成で私の試みです:

 audioQueueInputCallback(userDataUnsafe, audioQueueRef!, bufferRef!, <#T##UnsafePointer<AudioTimeStamp>#>, 0, nil) 
    } 
    } 

    private let audioQueueInputCallback: AudioQueueInputCallback = { (inUserData, inAQ, inBuffer, inStartTime, inNumberPacketDescriptions, inPacketDescs) in 

    let userData = Unmanaged<WYNDRInputQueueUserData>.fromOpaque(inUserData!).takeUnretainedValue() 

    let dataSize = Int(inBuffer.pointee.mAudioDataByteSize) 

    let inputData = Data(bytes: inBuffer.pointee.mAudioData, count: dataSize) 

    userData.callback(inputData) 

    AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, nil) 
    } 

をここに何かアドバイスをいただければ幸いです。私はaudioTimeStampを使用しているところ

ypealias WYNDRInputQueueCallback = ((Data) -> Void) 

class WYNDRInputQueue { 

    class WYNDRInputQueueUserData { 
    let callback: WYNDRInputQueueCallback 
    let bufferStub: NSData 

    init(callback: @escaping WYNDRInputQueueCallback, bufferStub: NSData){ 
     self.callback = callback 
     self.bufferStub = bufferStub 
    } 
    } 


    private var audioQueueRef: AudioQueueRef? 
    private let userData: WYNDRInputQueueUserData 



    public init(asbd: inout AudioStreamBasicDescription, callback: @escaping WYNDRInputQueueCallback, buffersCount: UInt32 = 3, bufferSize: UInt32 = 9600) throws { 

    self.userData = WYNDRInputQueueUserData(callback: callback, bufferStub: NSMutableData(length: Int(bufferSize))!) 

    let userDataUnsafe = UnsafeMutableRawPointer(Unmanaged.passRetained(self.userData).toOpaque()) 

    let input = AudioQueueNewInput(&asbd, 
            audioQueueInputCallback, 
            userDataUnsafe, 
            .none, 
            .none, 
            0, 
            &audioQueueRef) 

    if input != noErr { 
     throw InputQueueError.genericError(input) 
    } 

    assert(audioQueueRef != nil) 

    for _ in 0..<buffersCount { 
     var bufferRef: AudioQueueBufferRef? 

     let bufferInput = AudioQueueAllocateBuffer(audioQueueRef!, bufferSize, &bufferRef) 

     if bufferInput != noErr { 
     throw InputQueueError.genericError(bufferInput) 
     } 

     assert(bufferRef != nil) 

ここです!

答えて

1

タイムスタンプがどのように使用されるのか、誰がそれを使用するのかよく分かりませんが、疑問がある場合は、タイムスタンプとして記録したサンプルの数を使用してください。

var timestamp = AudioTimeStamp() 

timestamp.mSampleTime = numberOfSamplesRecorded 
timestamp.mFlags = .sampleHostTimeValid 
+0

ありがとうございます。私はクラスがどのように働いているのか、それとも変数がすべて必要なのか分からなかったと思います。私はタイムスタンプの使用を私のコードでコメントしました。私は – aBikis

+1

ええ、それは組合で厄介な試みです。それは迅速な列挙としてもっと意味をなさないでしょう。 –

関連する問題