![](/img/trans.png)
[英]Popping to specific view controller in navigation stack WITHOUT seeing other VCs in between
[英]Popping noise between AudioQueueBuffers
我正在嘗試使用Core Audio AudioQueue的(Swift 3)播放純正弦波音調。
它的播放效果很好,但是每次我的AudioQueueOutputCallback調用以用音頻數據填充新緩沖區時,我都會突然發出雜音。
我的AudioStreamer類如下所示:
let kNumberBuffers = 3
protocol AudioStreamerDelegate {
func requestAudioData() -> [Float]
}
let sampleRate = 48000.0
let bufferSize = Int(sampleRate) / 50
let bufferByteSize = UInt32(bufferSize * sizeof(Float)) // 20 mili sec of audio
class AudioStreamer {
var delegate: AudioStreamerDelegate
var outputQueue: AudioQueueRef?
var buffers = [AudioQueueBufferRef?](repeatElement(nil, count: kNumberBuffers))
var streamBasicDescription = AudioStreamBasicDescription(
mSampleRate: sampleRate,
mFormatID: kAudioFormatLinearPCM,
mFormatFlags: kAudioFormatFlagsNativeFloatPacked | kAudioFormatFlagIsNonInterleaved,
mBytesPerPacket: UInt32(sizeof(Float)),
mFramesPerPacket: 1,
mBytesPerFrame: UInt32(sizeof(Float)),
mChannelsPerFrame: 1,
mBitsPerChannel: UInt32(8 * sizeof(Float)),
mReserved: 0
)
init(delegate: AudioStreamerDelegate) {
// create new output audio queue
self.delegate = delegate
}
func play() {
let queue = DispatchQueue.main
queue.async(execute: {
let selfPointer = unsafeBitCast(self, to: UnsafeMutablePointer<Void>.self)
AudioQueueNewOutput(
&self.streamBasicDescription,
AudioStreamerOuputCallback,
selfPointer,
nil,
nil,
0,
&self.outputQueue
)
// allocate buffers
for i in 0 ..< kNumberBuffers {
AudioQueueAllocateBuffer(
self.outputQueue!,
bufferByteSize,
&self.buffers[i]
)
if let bufferRef = self.buffers[i] {
// configure audio buffer
let selfPointer = unsafeBitCast(self, to: UnsafeMutablePointer<Void>.self)
bufferRef.pointee.mUserData = selfPointer
bufferRef.pointee.mAudioDataByteSize = bufferByteSize
}
}
AudioQueuePrime(self.outputQueue!, 0, nil)
for bufferRef in self.buffers {
AudioStreamerOuputCallback(userData: unsafeBitCast(self, to: UnsafeMutablePointer<Void>.self), queueRef: self.outputQueue!, buffer: bufferRef!)
}
AudioQueueStart(self.outputQueue!, nil)
})
}
}
func AudioStreamerOuputCallback(userData: Optional<UnsafeMutablePointer<Void>>, queueRef: AudioQueueRef, buffer: AudioQueueBufferRef) {
let this = Unmanaged<AudioStreamer>.fromOpaque(OpaquePointer(userData!)).takeUnretainedValue()
let audioData = this.delegate.requestAudioData()
memcpy(buffer.pointee.mAudioData, unsafeBitCast(audioData, to: UnsafeMutablePointer<Void>.self), Int(bufferByteSize))
AudioQueueEnqueueBuffer(queueRef, buffer, 0, nil)
}
僅帶有“播放”按鈕的ViewController類的音頻數據生成器方法(theta是該ViewController上的存儲屬性):
func generateAudioData(frequency: Double) {
semaphore.wait()
let amplitude: Double = 0.25
let theta_increment: Double = 2.0 * M_PI * frequency / sampleRate
for j in 0 ..< Int(bufferSize) {
audioData[j] = Float(sin(theta) * amplitude)
theta += theta_increment
if theta > 2.0 * M_PI {
theta -= 2.0 * M_PI
}
}
}
該問題看起來類似於該問題 ,但沒有人回答。
任何幫助將不勝感激。
在輸出回調中,您沒有生成新的音頻數據集,其中新緩沖區的第一個樣本的相位是前一個緩沖區的最后一個樣本的增量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.