Normalize settings on save

This commit is contained in:
2026-01-22 22:44:21 +01:00
parent 54bb2e6c49
commit 33263b685c
3 changed files with 185 additions and 9 deletions

View File

@@ -2,9 +2,15 @@ package dev.kruhlmann.imgfloat.service;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import dev.kruhlmann.imgfloat.model.AudioAsset;
import dev.kruhlmann.imgfloat.model.Settings;
import dev.kruhlmann.imgfloat.model.VisualAsset;
import dev.kruhlmann.imgfloat.repository.AudioAssetRepository;
import dev.kruhlmann.imgfloat.repository.SettingsRepository;
import dev.kruhlmann.imgfloat.repository.VisualAssetRepository;
import jakarta.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
@@ -15,10 +21,19 @@ public class SettingsService {
private static final Logger logger = LoggerFactory.getLogger(SettingsService.class);
private final SettingsRepository repo;
private final VisualAssetRepository visualAssetRepository;
private final AudioAssetRepository audioAssetRepository;
private final ObjectMapper objectMapper;
public SettingsService(SettingsRepository repo, ObjectMapper objectMapper) {
public SettingsService(
SettingsRepository repo,
VisualAssetRepository visualAssetRepository,
AudioAssetRepository audioAssetRepository,
ObjectMapper objectMapper
) {
this.repo = repo;
this.visualAssetRepository = visualAssetRepository;
this.audioAssetRepository = audioAssetRepository;
this.objectMapper = objectMapper;
}
@@ -39,7 +54,9 @@ public class SettingsService {
public Settings save(Settings settings) {
settings.setId(1);
logSettings("Saving settings", settings);
return repo.save(settings);
Settings savedSettings = repo.save(settings);
clampAssetsToSettings(savedSettings);
return savedSettings;
}
public void logSettings(String msg, Settings settings) {
@@ -49,4 +66,78 @@ public class SettingsService {
logger.error("Failed to serialize settings", e);
}
}
private void clampAssetsToSettings(Settings settings) {
double minSpeed = settings.getMinAssetPlaybackSpeedFraction();
double maxSpeed = settings.getMaxAssetPlaybackSpeedFraction();
double minPitch = settings.getMinAssetAudioPitchFraction();
double maxPitch = settings.getMaxAssetAudioPitchFraction();
double minVolume = settings.getMinAssetVolumeFraction();
double maxVolume = settings.getMaxAssetVolumeFraction();
List<VisualAsset> visualsToUpdate = new ArrayList<>();
for (VisualAsset visual : visualAssetRepository.findAll()) {
boolean changed = false;
double speed = visual.getSpeed();
double clampedSpeed = clamp(speed, minSpeed, maxSpeed);
if (Double.compare(speed, clampedSpeed) != 0) {
visual.setSpeed(clampedSpeed);
changed = true;
}
double volume = visual.getAudioVolume();
double clampedVolume = clamp(volume, minVolume, maxVolume);
if (Double.compare(volume, clampedVolume) != 0) {
visual.setAudioVolume(clampedVolume);
changed = true;
}
if (changed) {
visualsToUpdate.add(visual);
}
}
List<AudioAsset> audioToUpdate = new ArrayList<>();
for (AudioAsset audio : audioAssetRepository.findAll()) {
boolean changed = false;
double speed = audio.getAudioSpeed();
double clampedSpeed = clamp(speed, minSpeed, maxSpeed);
if (Double.compare(speed, clampedSpeed) != 0) {
audio.setAudioSpeed(clampedSpeed);
changed = true;
}
double pitch = audio.getAudioPitch();
double clampedPitch = clamp(pitch, minPitch, maxPitch);
if (Double.compare(pitch, clampedPitch) != 0) {
audio.setAudioPitch(clampedPitch);
changed = true;
}
double volume = audio.getAudioVolume();
double clampedVolume = clamp(volume, minVolume, maxVolume);
if (Double.compare(volume, clampedVolume) != 0) {
audio.setAudioVolume(clampedVolume);
changed = true;
}
if (changed) {
audioToUpdate.add(audio);
}
}
if (!visualsToUpdate.isEmpty()) {
visualAssetRepository.saveAll(visualsToUpdate);
}
if (!audioToUpdate.isEmpty()) {
audioAssetRepository.saveAll(audioToUpdate);
}
if (!visualsToUpdate.isEmpty() || !audioToUpdate.isEmpty()) {
logger.info(
"Normalized {} visual assets and {} audio assets to new settings ranges",
visualsToUpdate.size(),
audioToUpdate.size()
);
}
}
private double clamp(double value, double min, double max) {
return Math.max(min, Math.min(max, value));
}
}