[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