Hi Kenny,
You could use a lazy var and initialise it with a closure.
class PDAudioPlayer {
//Would be created lazily when first invoked
lazy var mQueue : AudioQueueRef = {
//create an audioQueue and return that instance
return audioQueue
}()
}
Thanks and regards,
Muthu
> On 26 Sep 2017, at 9:12 AM, Kenny Leung via swift-users
> <[email protected]> wrote:
>
> 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
_______________________________________________
swift-users mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-users