AudioQueueStart But no sound

import Foundation
import AudioToolbox
class AudioPlay {


  static  let knumberBuffers = 3 /
    var aqData = AQPlayerState.init()
    /
    class AQPlayerState {
        var mDataFormat = AudioStreamBasicDescription()
        var mQueue:AudioQueueRef?
        var mBuffers = [AudioQueueBufferRef?].init(repeating: nil, count: AudioPlay.knumberBuffers)
        var mAudioFile:AudioFileID?
        var bufferByteSize = UInt32()
        var mCurrentPacket:Int64?
        var mNumPacketsToRead = UInt32()
        var mPacketDescs:UnsafeMutablePointer<AudioStreamPacketDescription>?
        var mIsRunning = false
    }

    /
  static let HandleOutputBuffer:AudioQueueOutputCallback = { (aqData1, inAQ, inBuffer) in

        var pAqData = (aqData1?.assumingMemoryBound(to: AQPlayerState.self).pointee)!
  
        guard pAqData.mIsRunning || pAqData.mQueue != nil else{
            print("audioplay is not running exit callback func")
            return
        }
        var numBytesReadFromFile = UInt32()
        var numPackets = pAqData.mNumPacketsToRead
  
        AudioFileReadPacketData(pAqData.mAudioFile!, false, &numBytesReadFromFile, pAqData.mPacketDescs, pAqData.mCurrentPacket!, &numPackets, inBuffer.pointee.mAudioData)
  
        if numPackets > 0 {
            inBuffer.pointee.mAudioDataByteSize = numBytesReadFromFile
      
            AudioQueueEnqueueBuffer(pAqData.mQueue!, inBuffer, ((pAqData.mPacketDescs != nil)  ? numPackets : UInt32(0)), pAqData.mPacketDescs)
      
            pAqData.mCurrentPacket! += Int64(numPackets)
        }else{
            AudioQueueStop(pAqData.mQueue!, false)
            pAqData.mIsRunning = false
        }
    }

    func start()  {
  
        let url = Bundle.main.url(forResource: "123", withExtension: "mp3")!
        let audioFileURL = url as CFURL
  
  
        print(audioFileURL)
  
  
        let result = AudioFileOpenURL(audioFileURL, .readPermission, 0, &aqData.mAudioFile)
        print(result)
  
        var dataFormatSize = UInt32(MemoryLayout.size(ofValue: aqData.mDataFormat))

  
      let result1 =  AudioFileGetProperty(aqData.mAudioFile!, kAudioFilePropertyDataFormat,&dataFormatSize, &aqData.mDataFormat)
  
        /
        var maxPacketSize = UInt32()
  
        var propertySize = UInt32(MemoryLayout.size(ofValue: maxPacketSize))
  
  
  
        let result2 = AudioFileGetProperty(aqData.mAudioFile!, kAudioFilePropertyPacketSizeUpperBound, &propertySize, &maxPacketSize)
  
  
  
        /
        DeriveBufferSize(ASBDesc: aqData.mDataFormat, maxPacketSize: maxPacketSize, seconds: 0.5, outBufferSize: &aqData.bufferByteSize, outNumPacketsToRead: &aqData.mNumPacketsToRead)
  
  
        let isFormatVBR = aqData.mDataFormat.mBytesPerPacket == 0 || aqData.mDataFormat.mFramesPerPacket == 0
  
        if isFormatVBR {
            aqData.mPacketDescs = UnsafeMutablePointer<AudioStreamPacketDescription>.allocate(capacity: MemoryLayout.size(ofValue: AudioStreamPacketDescription()))
        }else{
            aqData.mPacketDescs = nil
        }
  
  
        /
        let result4 =  AudioQueueNewOutput(&aqData.mDataFormat,AudioPlay.HandleOutputBuffer, &aqData,CFRunLoopGetCurrent(), CFRunLoopMode.commonModes.rawValue, 0, &aqData.mQueue)
  
  
  
        /
        aqData.mIsRunning = true
  
        /
        aqData.mCurrentPacket = 0
  
        for i in 0..<AudioPlay.knumberBuffers {
            AudioQueueAllocateBuffer(aqData.mQueue!, aqData.bufferByteSize,&aqData.mBuffers[i])
            AudioPlay.HandleOutputBuffer(&aqData,aqData.mQueue!, (aqData.mBuffers[i])!)
        }
  
        AudioQueueStart(aqData.mQueue!, nil)
  
  
        repeat{
            CFRunLoopRunInMode(CFRunLoopMode.defaultMode, 0.25, false)
        }while (aqData.mIsRunning)
  
        CFRunLoopRunInMode(CFRunLoopMode.defaultMode, 1, false)
  
  
    }


    /
    func DeriveBufferSize(ASBDesc:AudioStreamBasicDescription,maxPacketSize:UInt32,seconds:Float64,outBufferSize:UnsafeMutablePointer<UInt32>,outNumPacketsToRead:UnsafeMutablePointer<UInt32>) {
        let maxBufferSize:UInt32 = 0x50000
        let minBufferSIze:UInt32 = 0x4000
  
        if ASBDesc.mFramesPerPacket != 0 {
            let numPacketsForTime = ASBDesc.mSampleRate / Float64(ASBDesc.mFramesPerPacket) * seconds
            outBufferSize.pointee = UInt32(numPacketsForTime) * maxPacketSize
        }else{
            outBufferSize.pointee = (maxBufferSize > maxPacketSize) ? maxBufferSize:maxPacketSize
        }
  
        if outBufferSize.pointee > maxBufferSize && outBufferSize.pointee > maxPacketSize {
            outBufferSize.pointee = maxBufferSize
        }else{
            if outBufferSize.pointee < minBufferSIze{
                outBufferSize.pointee = minBufferSIze
            }
        }
        outNumPacketsToRead.pointee = outBufferSize.pointee/maxPacketSize
    }


    func Dispose()  {
        AudioQueueDispose(aqData.mQueue!, true)
        AudioFileClose(aqData.mAudioFile!)
        free(aqData.mPacketDescs)
    }

}

above code is writed according AudioQueueServiceProgrammingGuide!

create an instence of this class,and call the start() func compile ok,but no output voice. I had check the code many times but no advancing

can any one who familiar with audiiqueue help me? Any help will be appreciated.

replace "AudioFileReadPacketData" with "AudioFileReadPackets" can fix this problem!


but I get a new problem like below sometime! sometimes it works well!


Stream Audio(20535,0x1085ac3c0) malloc: *** error for object 0x6080001f6300: Invalid pointer dequeued from free list

*** set a breakpoint in malloc_error_break to

Accepted Answer

replace "AudioFileReadPacketData" with "AudioFileReadPackets" can fix this problem!


but I get a new problem like below sometime! sometimes it works well!


Stream Audio(20535,0x1085ac3c0) malloc: *** error for object 0x6080001f6300: Invalid pointer dequeued from free list

*** set a breakpoint in malloc_error_break to

AudioQueueStart But no sound
 
 
Q