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
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to