| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- import AVFoundation
- import Foundation
- /// Helpers for creating test audio files and SwiftData contexts.
- enum TestHelpers {
- /// Create a short sine wave WAV file for testing.
- static func createTestAudioFile(
- name: String = "test_audio",
- duration: TimeInterval = 2.0,
- sampleRate: Double = 44100,
- frequency: Double = 440,
- in directory: URL? = nil
- ) throws -> URL {
- let dir = directory ?? FileManager.default.temporaryDirectory
- .appendingPathComponent("MixBoardTests/\(UUID().uuidString)", isDirectory: true)
- try FileManager.default.createDirectory(at: dir, withIntermediateDirectories: true)
- let url = dir.appendingPathComponent("\(name)_\(UUID().uuidString.prefix(8)).wav")
- let channels: AVAudioChannelCount = 2
- // Use standard format which AVAudioFile handles correctly
- guard let format = AVAudioFormat(standardFormatWithSampleRate: sampleRate, channels: channels) else {
- throw NSError(domain: "TestHelpers", code: 1, userInfo: [NSLocalizedDescriptionKey: "Failed to create format"])
- }
- let file = try AVAudioFile(forWriting: url, settings: format.settings)
- let frameCount = AVAudioFrameCount(duration * sampleRate)
- guard let buffer = AVAudioPCMBuffer(pcmFormat: file.processingFormat, frameCapacity: frameCount) else {
- throw NSError(domain: "TestHelpers", code: 1, userInfo: [NSLocalizedDescriptionKey: "Failed to create buffer"])
- }
- buffer.frameLength = frameCount
- if let channelData = buffer.floatChannelData {
- for frame in 0..<Int(frameCount) {
- let value = Float(sin(2.0 * .pi * frequency * Double(frame) / sampleRate))
- for ch in 0..<Int(channels) {
- channelData[ch][frame] = value * 0.5
- }
- }
- }
- try file.write(from: buffer)
- return url
- }
- /// Create multiple test audio files with different "metadata".
- static func createTestAudioFiles(count: Int, duration: TimeInterval = 1.0) throws -> [URL] {
- let frequencies = [261.63, 293.66, 329.63, 349.23, 392.00, 440.00, 493.88, 523.25]
- var urls: [URL] = []
- for i in 0..<count {
- let freq = frequencies[i % frequencies.count]
- let url = try createTestAudioFile(
- name: "test_track_\(i + 1)",
- duration: duration,
- frequency: freq
- )
- urls.append(url)
- }
- return urls
- }
- /// Clean up test files.
- static func cleanupTestFiles() {
- let dir = FileManager.default.temporaryDirectory
- .appendingPathComponent("MixBoardTests", isDirectory: true)
- try? FileManager.default.removeItem(at: dir)
- }
- /// Get the test files directory.
- static var testDirectory: URL {
- FileManager.default.temporaryDirectory
- .appendingPathComponent("MixBoardTests", isDirectory: true)
- }
- }
|