diff --git a/Source/Engine/AudioStreamEngine.swift b/Source/Engine/AudioStreamEngine.swift index b3fb310..027b309 100644 --- a/Source/Engine/AudioStreamEngine.swift +++ b/Source/Engine/AudioStreamEngine.swift @@ -203,6 +203,9 @@ class AudioStreamEngine: AudioEngine { } private func pollForNextBufferRecursive() { + if(!converter.initialized) { + return + } do { var nextScheduledBuffer: AVAudioPCMBuffer! = try converter.pullBuffer() numberOfBuffersScheduledFromPoll += 1 diff --git a/Source/Engine/Converter/AudioConverter.swift b/Source/Engine/Converter/AudioConverter.swift index 5670c7f..5f9f610 100644 --- a/Source/Engine/Converter/AudioConverter.swift +++ b/Source/Engine/Converter/AudioConverter.swift @@ -35,6 +35,7 @@ import AudioToolbox protocol AudioConvertable { var engineAudioFormat: AVAudioFormat {get} + var initialized:Bool {get} init(withRemoteUrl url: AudioURL, toEngineAudioFormat: AVAudioFormat, withPCMBufferSize size: AVAudioFrameCount) throws func pullBuffer() throws -> AVAudioPCMBuffer @@ -74,6 +75,11 @@ class AudioConverter: AudioConvertable { //Field var converter: AudioConverterRef? //set by AudioConverterNew + + public var initialized:Bool { + converter != nil + } + var currentAudioPacketIndex: AVAudioPacketCount = 0 // use to store reference to the allocated buffers from the converter to properly deallocate them before the next packet is being converted diff --git a/Source/Engine/Converter/AudioConverterListener.swift b/Source/Engine/Converter/AudioConverterListener.swift index 656c16f..5e480aa 100644 --- a/Source/Engine/Converter/AudioConverterListener.swift +++ b/Source/Engine/Converter/AudioConverterListener.swift @@ -80,15 +80,14 @@ func ConverterListener(_ converter: AudioConverterRef, _ packetCount: UnsafeMuta ioData.pointee.mBuffers.mDataByteSize = UInt32(packetByteCount) selfAudioConverter.converterBuffer = ioData.pointee.mBuffers.mData - - if let lastDescription = selfAudioConverter.converterDescriptions { - lastDescription.deallocate() - } - + // Handle packet descriptions for compressed formats (MP3, AAC, etc) let fileFormatDescription = fileAudioFormat.streamDescription.pointee if fileFormatDescription.mFormatID != kAudioFormatLinearPCM { if outPacketDescriptions?.pointee == nil { + if let lastDescription = selfAudioConverter.converterDescriptions { + lastDescription.deallocate() + } outPacketDescriptions?.pointee = UnsafeMutablePointer.allocate(capacity: 1) } outPacketDescriptions?.pointee?.pointee.mDataByteSize = UInt32(packetByteCount) diff --git a/Source/Engine/Parser/AudioParser.swift b/Source/Engine/Parser/AudioParser.swift index c486722..9dd51c4 100644 --- a/Source/Engine/Parser/AudioParser.swift +++ b/Source/Engine/Parser/AudioParser.swift @@ -97,7 +97,7 @@ class AudioParser: AudioParsable { let predictedCount = AVAudioPacketCount(Double(sizeOfFileInBytes) / bytesPerPacket) guard networkProgress != 1.0 else { - return max(AVAudioPacketCount(audioPackets.count), predictedCount) + return min(AVAudioPacketCount(audioPackets.count), predictedCount) } return predictedCount