diff --git a/Audio/Visualization/VisualizationController.h b/Audio/Visualization/VisualizationController.h index c52e291c3..8434f4ec8 100644 --- a/Audio/Visualization/VisualizationController.h +++ b/Audio/Visualization/VisualizationController.h @@ -15,12 +15,15 @@ NS_ASSUME_NONNULL_BEGIN float *visAudio; int visAudioCursor, visAudioSize; float *visAudioTemp; + uint64_t visSamplesPosted; } + (VisualizationController *)sharedController; - (void)postLatency:(double)latency; +- (UInt64)samplesPosted; + - (void)postSampleRate:(double)sampleRate; - (void)postVisPCM:(const float *)inPCM amount:(int)amount; - (double)readSampleRate; diff --git a/Audio/Visualization/VisualizationController.swift b/Audio/Visualization/VisualizationController.swift index 6e22eb0e3..b5133ddf7 100644 --- a/Audio/Visualization/VisualizationController.swift +++ b/Audio/Visualization/VisualizationController.swift @@ -15,6 +15,7 @@ class VisualizationController : NSObject { var visAudio: [Float] = Array(repeating: 0.0, count: 44100 * 45) var visAudioCursor = 0 var visAudioSize = 0 + var visSamplesPosted: UInt64 = 0 private static var sharedVisualizationController: VisualizationController = { let visualizationController = VisualizationController() @@ -34,6 +35,7 @@ class VisualizationController : NSObject { for i in 0.. UInt64 { + return self.visSamplesPosted + } @objc func postSampleRate(_ sampleRate: Double) { @@ -67,6 +74,7 @@ class VisualizationController : NSObject { } self.visAudioCursor = j self.latency += Double(amount) / self.sampleRate + self.visSamplesPosted += UInt64(amount); } } @@ -101,6 +109,9 @@ class VisualizationController : NSObject { // Offset latency so the target sample is in the center of the window let latencySamples = (Int)((self.latency + latencyOffset) * self.sampleRate) + 2048 var samplesToDo = 4096; + if(latencySamples < 0) { + return; + } if(latencySamples < 4096) { // Latency can sometimes dip below this threshold samplesToDo = latencySamples; diff --git a/SpectrumViewCG.m b/SpectrumViewCG.m index d84192d36..3b42ccb75 100644 --- a/SpectrumViewCG.m +++ b/SpectrumViewCG.m @@ -42,6 +42,9 @@ extern NSString *CogPlaybackDidStopNotificiation; ddb_analyzer_draw_data_t _draw_data; float visAudio[4096], visFFT[2048]; + + UInt64 visSamplesLastPosted; + double visLatencyOffset; } @end @@ -234,6 +237,7 @@ extern NSString *CogPlaybackDidStopNotificiation; - (void)timerRun:(NSTimer *)timer { [self repaint]; + visLatencyOffset -= 1.0 / 60.0; } - (void)colorsDidChange:(NSNotification *)notification { @@ -403,7 +407,13 @@ extern NSString *CogPlaybackDidStopNotificiation; _analyzer.view_width = self.bounds.size.width; } - [self->visController copyVisPCM:&visAudio[0] visFFT:&visFFT[0] latencyOffset:0]; + UInt64 samplesPosted = [self->visController samplesPosted]; + if (samplesPosted != visSamplesLastPosted) { + visSamplesLastPosted = samplesPosted; + visLatencyOffset = 0.0; + } + + [self->visController copyVisPCM:&visAudio[0] visFFT:&visFFT[0] latencyOffset:visLatencyOffset]; ddb_analyzer_process(&_analyzer, [self->visController readSampleRate] / 2.0, 1, visFFT, 2048); ddb_analyzer_tick(&_analyzer); diff --git a/Visualization/SpectrumViewSK.m b/Visualization/SpectrumViewSK.m index 2261390d4..3542ec914 100644 --- a/Visualization/SpectrumViewSK.m +++ b/Visualization/SpectrumViewSK.m @@ -45,6 +45,9 @@ extern NSString *CogPlaybackDidStopNotificiation; SCNVector3 cameraEulerAngles3d; float visAudio[4096], visFFT[2048]; + + UInt64 visSamplesLastPosted; + double visLatencyOffset; } @end @@ -307,7 +310,13 @@ extern NSString *CogPlaybackDidStopNotificiation; return; } - [self->visController copyVisPCM:&visAudio[0] visFFT:&visFFT[0] latencyOffset:0]; + UInt64 samplesPosted = [self->visController samplesPosted]; + if (samplesPosted != visSamplesLastPosted) { + visSamplesLastPosted = samplesPosted; + visLatencyOffset = 0.0; + } + + [self->visController copyVisPCM:&visAudio[0] visFFT:&visFFT[0] latencyOffset:visLatencyOffset]; ddb_analyzer_process(&_analyzer, [self->visController readSampleRate] / 2.0, 1, visFFT, 2048); ddb_analyzer_tick(&_analyzer); @@ -333,6 +342,7 @@ extern NSString *CogPlaybackDidStopNotificiation; - (void)timerRun:(NSTimer *)timer { [self repaint]; + visLatencyOffset -= 1.0 / 60.0; } - (void)startPlayback {