diff --git a/Sources/AudioKit/Audio Files/AVAudioFile+Utilities.swift b/Sources/AudioKit/Audio Files/AVAudioFile+Utilities.swift index d048450906..e16f9c81e2 100644 --- a/Sources/AudioKit/Audio Files/AVAudioFile+Utilities.swift +++ b/Sources/AudioKit/Audio Files/AVAudioFile+Utilities.swift @@ -33,9 +33,15 @@ public extension AVAudioFile { guard let buffer = AVAudioPCMBuffer(pcmFormat: processingFormat, frameCapacity: AVAudioFrameCount(length)) else { return nil } + guard let tmpBuffer = AVAudioPCMBuffer(pcmFormat: processingFormat, + frameCapacity: AVAudioFrameCount(length)) else { return nil } + do { framePosition = 0 - try read(into: buffer) + while framePosition < length { + try read(into: tmpBuffer) + buffer.append(tmpBuffer) + } Log("Created buffer with format", processingFormat) } catch let error as NSError { diff --git a/Sources/AudioKit/Audio Files/AVAudioPCMBuffer+Utilities.swift b/Sources/AudioKit/Audio Files/AVAudioPCMBuffer+Utilities.swift index 65cdbfed23..3e90cf7f4f 100644 --- a/Sources/AudioKit/Audio Files/AVAudioPCMBuffer+Utilities.swift +++ b/Sources/AudioKit/Audio Files/AVAudioPCMBuffer+Utilities.swift @@ -65,19 +65,14 @@ public extension AVAudioPCMBuffer { precondition(frameLength + frameCount <= frameCapacity, "Insufficient space in buffer") - let dst1 = floatChannelData![0] - let src1 = buffer.floatChannelData![0] + for channel in 0...size) - - let dst2 = floatChannelData![1] - let src2 = buffer.floatChannelData![1] - - memcpy(dst2.advanced(by: stride * Int(frameLength)), - src2.advanced(by: stride * Int(startingFrame)), - Int(frameCount) * stride * MemoryLayout.size) + memcpy(dst.advanced(by: stride * Int(frameLength)), + src.advanced(by: stride * Int(startingFrame)), + Int(frameCount) * stride * MemoryLayout.size) + } frameLength += frameCount } diff --git a/Tests/AudioKitTests/Extension Tests/AVAudioFileTests.swift b/Tests/AudioKitTests/Extension Tests/AVAudioFileTests.swift new file mode 100644 index 0000000000..6b6e124feb --- /dev/null +++ b/Tests/AudioKitTests/Extension Tests/AVAudioFileTests.swift @@ -0,0 +1,17 @@ +import XCTest +import AVFoundation + +final class AVAudioFileTests: XCTestCase { + + func testReadFile() throws { + + let sampleURL = Bundle.module.url(forResource: "TestResources/0001_1-16", withExtension: "wav")! + + let wavFile = try AVAudioFile(forReading: sampleURL) + + let pcmBuffer = wavFile.toAVAudioPCMBuffer()! + + XCTAssertEqual(Int(wavFile.length), Int(pcmBuffer.frameLength)) + } + +} diff --git a/Tests/AudioKitTests/TestResources/0001_1-16.wav b/Tests/AudioKitTests/TestResources/0001_1-16.wav new file mode 100644 index 0000000000..1447eaf7ce Binary files /dev/null and b/Tests/AudioKitTests/TestResources/0001_1-16.wav differ