Hi All.
I’m trying to implement the AudioQueue example from Apple in Swift, and keep it
as Swifty as I can. I’ve run into a problem where I have a let ivar for the
AudioQueue, but the only way to initialize that let ivar is to pass a block to
the function that creates the AudioQueue. I get the error, "Variable
'self.mQueue' used before being initialized”. Is there any way to get around
this catch?
Thanks!
-Kenny
The code follows.
———8<————8<————
class PDAudioPlayer {
static let kNumberBuffers :Int = 3 // 1
//var mDataFormat:AudioStreamBasicDescription // 2
let mQueue :AudioQueueRef // 3
//var mBuffers :[AudioQueueBufferRef] // 4
//var mAudioFile :AudioFileID? // 5
var bufferByteSize :UInt32? // 6
var mCurrentPacket :Int64? // 7
var mNumPacketsToRead :UInt32? // 8
var mPacketDescs :UnsafePointer<AudioStreamPacketDescription>? // 9
var mIsRunning: Bool = false // 10
let dispatchQueue :DispatchQueue
let source :PDFileAudioSource
var audioBuffers :[PDAudioBuffer]
init?(source:PDFileAudioSource) {
self.source = source
self.dispatchQueue = DispatchQueue(label:"AudioPlayer", qos:.default,
attributes:[], autoreleaseFrequency:.workItem, target:nil)
self.audioBuffers = [PDAudioBuffer]()
var tempAudioQueue :AudioQueueRef?
var dataFormat = source.mDataFormat
let status = AudioQueueNewOutputWithDispatchQueue(&tempAudioQueue,
&dataFormat, 0, self.dispatchQueue) { [weak self] (queue, buffer) in // ERROR
on this line
guard let this = self else {
return // block
}
guard let audioBuffer =
this.audioBufferForAudioQueueBuffer(aqBuffer:buffer) else {
return // block
}
this.source.fillBuffer(audioBuffer)
}
if status != 0 {
return nil
}
guard let audioQueue = tempAudioQueue else {
return nil
}
self.mQueue = audioQueue
}
private func audioBufferForAudioQueueBuffer(aqBuffer:AudioQueueBufferRef)
-> PDAudioBuffer? {
for buffer in self.audioBuffers {
if buffer.audioQueueBuffer == aqBuffer {
return buffer
}
}
return nil
}
}
_______________________________________________
swift-users mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-users