[swift-users] Initialization Catch-22?

Kenny Leung kenny_leung at pobox.com
Mon Sep 25 20:38:51 CDT 2017


Hi Muthu.

Thanks for the suggestion.

I don’t want to do that because failure to create the AudioQueue should mean failure to create the AudioPlayer itself.

-Kenny


> On Sep 25, 2017, at 6:33 PM, somu subscribe <somu.subscribe at gmail.com> wrote:
> 
> 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 <swift-users at swift.org <mailto:swift-users at swift.org>> 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
>> swift-users at swift.org <mailto:swift-users at swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-users
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20170925/8bfb0097/attachment.html>


More information about the swift-users mailing list