diff --git a/Shared/Audio/AudioPlayer.swift b/Shared/Audio/AudioPlayer.swift index 16b825b..e32faae 100644 --- a/Shared/Audio/AudioPlayer.swift +++ b/Shared/Audio/AudioPlayer.swift @@ -293,9 +293,10 @@ class AudioPlayer: NSObject, ObservableObject { if isUsingOfflineVis { startOfflineVisSync() - } else if !isUsingCrossfade { + } else if !isUsingCrossfade && !VisualizerSettings.shared.realAudioAnalysis { startLevelSimulation() } + // When realAudioAnalysis is on but vis data hasn't loaded yet: stay at 0. alog("Foreground: session reactivated, observers + vis timers resumed (crossfade=\(isUsingCrossfade) offlineVis=\(isUsingOfflineVis))") } @@ -475,7 +476,9 @@ class AudioPlayer: NSObject, ObservableObject { updateNowPlayingInfo() fetchAndSetArtwork(coverArtId: song.coverArt) - startLevelSimulation() + if !VisualizerSettings.shared.realAudioAnalysis { + startLevelSimulation() + } // Load offline visualizer for crossfade path too if VisualizerSettings.shared.realAudioAnalysis { @@ -867,9 +870,12 @@ class AudioPlayer: NSObject, ObservableObject { #if os(iOS) if isRadioStream { startRadioSimulation() - } else { + } else if !VisualizerSettings.shared.realAudioAnalysis { + // Simulation mode only — real analysis waits for offline vis data startLevelSimulation() } + // When realAudioAnalysis is on: levels stay at 0 until + // loadOfflineVisualizer → startOfflineVisSync fills them. #else startLevelSimulation() #endif @@ -1090,7 +1096,7 @@ class AudioPlayer: NSObject, ObservableObject { guard let self = self else { return } self.setLevels(self.rawFFTLevels) } - } else { + } else if !VisualizerSettings.shared.realAudioAnalysis { DebugLogger.shared.log("resume: simulation path — levelTimer nil=\(levelTimer == nil)", category: "VisDebug") // Simulation path: seed internalLevels from a fresh random target // so the wave has height immediately rather than starting from floor. @@ -1100,6 +1106,7 @@ class AudioPlayer: NSObject, ObservableObject { setLevels(internalLevels) if levelTimer == nil { startLevelSimulation() } } + // else: realAudioAnalysis on, vis data loading — stay at 0 pushWidgetState() #endif updateNowPlayingInfo() @@ -1626,7 +1633,7 @@ class AudioPlayer: NSObject, ObservableObject { } } catch { alog("Offline vis: analysis failed: \(error.localizedDescription)") - await MainActor.run { self.startLevelSimulation() } + // Don't fall back to simulation — levels stay at 0 } } // end if !fetched }