繁体   English   中英

获取音频队列缓冲区的<AudioTimeStamp>

[英]Obtain a <AudioTimeStamp> for Audio Queue Buffer

我正在尝试在Swift中创建一个连续的FIFO录音机。 我在尝试创建audioQueueCallback时遇到并发出问题。

来自文档AudioTimeStamp有这个init方法:

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

我不知道如何使用它。

在我看来,设备应该有一个可靠的内部时钟,以便能够管理audioQueues但我无法找到它的任何文档。

这是我尝试创建BufferQueue:

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)

这是我使用audioTimeStamp的地方:

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

这里的任何建议将不胜感激!

我不确定时间戳将如何使用或者谁将使用它,但如果有疑问,为什么不使用您记录的样本数作为时间戳?

var timestamp = AudioTimeStamp()

timestamp.mSampleTime = numberOfSamplesRecorded
timestamp.mFlags = .sampleHostTimeValid

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM