Monday 9 September 2019

Crash on Read AVAudioFile Buffer Create Waves Swift

I have been working in AVAudioPlayer and draw a wave. I am using AudioArmada Github pods to draw waves With the help of AudioArmada Pods. But Some Cases AVAudioFile Crash on reading buffer time.

Code Below:

public func openFile(_ file: URL) {
    let audioFile = try! AVAudioFile(forReading: file)
    // specify the format we WANT for the buffer
    let format = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: audioFile.fileFormat.sampleRate, channels: audioFile.fileFormat.channelCount, interleaved: false)
    // initialize and fill the buffer
    let buffer = AVAudioPCMBuffer(pcmFormat: format!, frameCapacity: UInt32(audioFile.length))
    try! audioFile.read(into: buffer!)
    // copy buffer to readFile struct
    readFile.floatValuesLeft = Array(UnsafeBufferPointer(start: buffer?.floatChannelData?[0], count:Int(buffer!.frameLength)))
    readFile.populated = true
    reload(zoomFactor: zoomFactor)
}

public func reload(zoomFactor: Float = 1.0) {
    self.zoomFactor = zoomFactor
    setNeedsDisplay()
}

func drawSoundcloudWaveform(_ rect: CGRect) {
  let path = UIBezierPath()
  path.move(to: CGPoint(x: 0.0, y: rect.height/2))
  var index = 0
  while index < readFile.leftPoints.count {
  let point = readFile.leftPoints[index]
  let drawFrom = CGPoint(x: point.x, y: path.currentPoint.y)
  path.move(to: drawFrom)
  let drawPointBottom = CGPoint(x: point.x, y: path.currentPoint.y + (point.y))
   path.addLine(to: drawPointBottom)
   path.addLine(to: CGPoint(x: drawPointBottom.x + pixelWidth, y: drawPointBottom.y))
   path.addLine(to: CGPoint(x: drawFrom.x + pixelWidth, y: drawFrom.y))
   path.close()
   path.move(to: drawFrom)
   let drawPointTop = CGPoint(x: point.x, y: path.currentPoint.y - (point.y))
   path.addLine(to: drawPointTop)
   path.addLine(to: CGPoint(x: drawPointTop.x + pixelWidth, y: drawPointTop.y))
   path.addLine(to: CGPoint(x: drawFrom.x + pixelWidth, y: drawFrom.y))
   path.close()
   index = index + Int(pixelWidth) + Int(pixelSpacing)
   }
    UIColor(red:0.21, green:0.77, blue:0.78, alpha:1.0).set()
    path.stroke()
    path.fill()
}

Below Cases:

  1. Running Case:

    guard let file = Bundle.main.url(forResource: "Beat9", withExtension: ".mp3") else { return }
    openFile(file) 
    
    AVAudioPCMBuffer Output:  AVAudioPCMBuffer@0x6000005c9300: 0/35864064 bytes
    
    

Wave Screen Shot:

Running Case Screen Shot

  1. Crash Case:

    guard let file = Bundle.main.url(forResource: "IshqMubarak", withExtension: ".mp3") else { return }
    openFile(file)
    
    AVAudioPCMBuffer Output: AVAudioPCMBuffer@0x600003eb1180: 0/0 bytes // i m confused why show zero bytes buffer 
    
    

Error: Fatal error: 'try!' expression unexpectedly raised an error: Foundation._GenericObjCError.nilError: file /Users/apple/Desktop/AudioArmada-90f214d3d9483e817cdb1396e08f8f626a7be821/AudioArmada/Classes/WaveformZoomable.swift, line 63

Question: How to solve this issue and why crash on some times?

Any help would be greatly appreciated.

Thanks in advance.



from Crash on Read AVAudioFile Buffer Create Waves Swift

No comments:

Post a Comment