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:
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:
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.
Seeing the error it's crashing at line 63 of WaveformZoomable.swift of AudioArmada where try!
is used on a nil object.
AVAudioFile throws (same for line 56):
func read(into buffer: AVAudioPCMBuffer) throws
You can use
try?
to get rid of crash for nowtry
catch
to find the reason why it's not able to read