[swift-users] Initialization Catch-22?
Kenny Leung
kenny_leung at pobox.com
Mon Sep 25 20:12:08 CDT 2017
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
}
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20170925/37f62764/attachment.html>
More information about the swift-users
mailing list