From 820d0c42827e255c9cf1455de5e7541b93906711 Mon Sep 17 00:00:00 2001 From: grog Date: Sun, 12 Nov 2023 18:50:16 -0800 Subject: [PATCH] Implemented peakDelayMs in AudioFile --- .../org/myrobotlab/audio/AudioProcessor.java | 22 ++++++++++++++++++- .../service/config/AudioFileConfig.java | 11 ++++++++-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/myrobotlab/audio/AudioProcessor.java b/src/main/java/org/myrobotlab/audio/AudioProcessor.java index 2ca8f7aa28..46bc11d136 100644 --- a/src/main/java/org/myrobotlab/audio/AudioProcessor.java +++ b/src/main/java/org/myrobotlab/audio/AudioProcessor.java @@ -5,6 +5,10 @@ import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; @@ -32,6 +36,8 @@ public class AudioProcessor extends Thread { // it seems to make sense - some how the file gets decoded enough - so that // a audio decoder can be slected from some // internal registry ... i think + + private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); transient private final ScheduledExecutorService delayScheduler = Executors.newScheduledThreadPool(1); protected int currentTrackCount = 0; @@ -231,7 +237,14 @@ public AudioData play(AudioData data) { peak = abs; } } - audioFile.invoke("publishPeak", peak * (double) audioFile.getPeakMultiplier()); + + final double value = peak * (double) audioFile.getPeakMultiplier(); + + if (audioFile.getConfig().peakDelayMs == null) { + audioFile.invoke("publishPeak", value); + } else { + delayScheduler.schedule(() -> audioFile.invoke("publishPeak", value), audioFile.getConfig().peakDelayMs, TimeUnit.MILLISECONDS); + } } } // Stop @@ -247,6 +260,12 @@ public AudioData play(AudioData data) { // System.gc(); + if (audioFile.getConfig().peakDelayMs == null) { + audioFile.invoke("publishPeak", 0); + } else { + delayScheduler.schedule(() -> audioFile.invoke("publishPeak", 0), audioFile.getConfig().peakDelayMs, TimeUnit.MILLISECONDS); + } + audioFile.invoke("publishPeak", 0); audioFile.invoke("publishAudioEnd", data); @@ -313,6 +332,7 @@ public void run() { } // default waits on queued audio requests log.info("audio processor {} exiting", getName()); + delayScheduler.shutdown(); } public void setVolume(Double volume) { diff --git a/src/main/java/org/myrobotlab/service/config/AudioFileConfig.java b/src/main/java/org/myrobotlab/service/config/AudioFileConfig.java index caabbdb72b..391d175d55 100644 --- a/src/main/java/org/myrobotlab/service/config/AudioFileConfig.java +++ b/src/main/java/org/myrobotlab/service/config/AudioFileConfig.java @@ -10,13 +10,20 @@ public class AudioFileConfig extends ServiceConfig { public double volume = 1.0; public String currentPlaylist = "default"; public Map> playlists; - public double peakMultiplier = 100.0; + + @Deprecated /* use regular "listeners" from ServiceConfig parent */ public String[] audioListeners; - + + /** + * a multiplier to scale amplitude of output waveform + */ + public double peakMultiplier = 100.0; + /** * sample interval for peak */ public double peakSampleInterval = 15; + /** * delay to synchronize publishing of peak with actual sound in milliseconds */