removed unwanted bar now with waveforms, major updates and enhancements

This commit is contained in:
Mark Gregory
2026-11-06 14:01:54 +00:00
parent 50e7fb358a
commit a33ebdc1d3
3 changed files with 85 additions and 10 deletions
+46
View File
@@ -3053,4 +3053,50 @@ extension KJamsCloneTests {
for song in dj.songs { XCTAssertNotNil(try WaveformCache.load(audio:URL(fileURLWithPath:song.audio),directory:dj.waveformDirectory)) }
}
@MainActor func testAddingLoopToPlayingTrackDoesNotRestartAudioNode() async throws {
let root = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString)
defer { try? FileManager.default.removeItem(at:root) }
let fixture = try XCTUnwrap(Bundle(for:Self.self).resourceURL?.appendingPathComponent("Fixtures/Demo.wav"))
let player = Player(waveformCacheDirectory:root,persistsMix:false)
defer { player.stop() }
player.autoFade = false
try player.load(Song(id:1,title:"Demo",audio:fixture.path,cdg:nil,rating:0,plays:0))
for _ in 0..<100 where player.displayTime < 0.05 { try await Task.sleep(nanoseconds:10_000_000) }
let start = player.displayTime,restarts = player.audioScheduleRestartCount
player.defineLoop(start:start,end:start+0.3)
for _ in 0..<100 where !player.nativeLoopActive { try await Task.sleep(nanoseconds:10_000_000) }
XCTAssertTrue(player.nativeLoopActive);XCTAssertTrue(player.audioPlaybackStarted)
XCTAssertEqual(player.audioScheduleRestartCount,restarts,"Adding a live loop must not stop the audio node")
try await Task.sleep(nanoseconds:400_000_000)
XCTAssertGreaterThanOrEqual(player.displayTime,start);XCTAssertLessThan(player.displayTime,start+0.301)
player.loopEnabled = false
XCTAssertEqual(player.audioScheduleRestartCount,restarts,"Cancelling the loop must also leave the audio node running")
XCTAssertTrue(player.audioPlaybackStarted)
}
@MainActor func testLoopOffNearTrackEndStillFinishesWithoutRestarting() async throws {
let root = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString)
defer { try? FileManager.default.removeItem(at:root) }
let fixture = try XCTUnwrap(Bundle(for:Self.self).resourceURL?.appendingPathComponent("Fixtures/Demo.wav"))
let player = Player(waveformCacheDirectory:root,persistsMix:false)
defer { player.stop() }
player.autoFade = false
try player.load(Song(id:1,title:"Demo",audio:fixture.path,cdg:nil,rating:0,plays:0),startPlaying:false)
player.defineLoop(start:player.duration-0.2,end:player.duration)
for _ in 0..<100 where !player.nativeLoopActive { try await Task.sleep(nanoseconds:10_000_000) }
player.seek(player.duration-0.15);player.toggle()
for _ in 0..<500 {
let remaining = player.duration-player.displayTime
if remaining > 0,remaining < 0.015 { break }
try await Task.sleep(nanoseconds:1_000_000)
}
XCTAssertLessThan(player.duration-player.displayTime,0.02)
var finished = false;player.onFinished = { finished = true }
let restarts = player.audioScheduleRestartCount
player.loopEnabled = false
XCTAssertEqual(player.audioScheduleRestartCount,restarts)
for _ in 0..<200 where !finished { try await Task.sleep(nanoseconds:5_000_000) }
XCTAssertTrue(finished);XCTAssertFalse(player.playing)
}
}