From 7e60e2737d93ec37abffb2517afa8c01f35f0553 Mon Sep 17 00:00:00 2001 From: jg175 <jg175@hdm-stuttgart.de> Date: Wed, 17 Jan 2024 21:00:01 +0100 Subject: [PATCH] Update:Play Music with Media Player for Better functionality --- .idea/misc.xml | 1 - .../hdm_stuttgart/battlearena/Main/Main.java | 17 ++- .../Model/Sound/ISoundManager.java | 6 +- .../battlearena/Model/Sound/MusicType.java | 16 +++ .../battlearena/Model/Sound/SFX.java | 15 +- .../battlearena/Model/Sound/SoundManager.java | 129 +++++------------- ...ps, Human, Dirty Ground, Walk SND62078.wav | Bin .../music/{ => game}/musicPlaceholder.mp3 | Bin .../music/{ => menu}/musicPlaceholder.wav | Bin .../sfx/steps/{ => grass}/steps - Track 1.wav | Bin .../steps/{ => grass}/steps - Track 10.wav | Bin .../steps/{ => grass}/steps - Track 11.wav | Bin .../steps/{ => grass}/steps - Track 12.wav | Bin .../steps/{ => grass}/steps - Track 13.wav | Bin .../steps/{ => grass}/steps - Track 14.wav | Bin .../steps/{ => grass}/steps - Track 15.wav | Bin .../steps/{ => grass}/steps - Track 16.wav | Bin .../steps/{ => grass}/steps - Track 17.wav | Bin .../steps/{ => grass}/steps - Track 18.wav | Bin .../steps/{ => grass}/steps - Track 19.wav | Bin .../sfx/steps/{ => grass}/steps - Track 2.wav | Bin .../steps/{ => grass}/steps - Track 20.wav | Bin .../sfx/steps/{ => grass}/steps - Track 3.wav | Bin .../sfx/steps/{ => grass}/steps - Track 4.wav | Bin .../sfx/steps/{ => grass}/steps - Track 5.wav | Bin .../sfx/steps/{ => grass}/steps - Track 6.wav | Bin .../sfx/steps/{ => grass}/steps - Track 7.wav | Bin .../sfx/steps/{ => grass}/steps - Track 8.wav | Bin .../sfx/steps/{ => grass}/steps - Track 9.wav | Bin 29 files changed, 79 insertions(+), 105 deletions(-) create mode 100644 src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/MusicType.java rename src/main/resources/{sound/sfx => }/Footsteps, Human, Dirty Ground, Walk SND62078.wav (100%) rename src/main/resources/sound/music/{ => game}/musicPlaceholder.mp3 (100%) rename src/main/resources/sound/music/{ => menu}/musicPlaceholder.wav (100%) rename src/main/resources/sound/sfx/steps/{ => grass}/steps - Track 1.wav (100%) rename src/main/resources/sound/sfx/steps/{ => grass}/steps - Track 10.wav (100%) rename src/main/resources/sound/sfx/steps/{ => grass}/steps - Track 11.wav (100%) rename src/main/resources/sound/sfx/steps/{ => grass}/steps - Track 12.wav (100%) rename src/main/resources/sound/sfx/steps/{ => grass}/steps - Track 13.wav (100%) rename src/main/resources/sound/sfx/steps/{ => grass}/steps - Track 14.wav (100%) rename src/main/resources/sound/sfx/steps/{ => grass}/steps - Track 15.wav (100%) rename src/main/resources/sound/sfx/steps/{ => grass}/steps - Track 16.wav (100%) rename src/main/resources/sound/sfx/steps/{ => grass}/steps - Track 17.wav (100%) rename src/main/resources/sound/sfx/steps/{ => grass}/steps - Track 18.wav (100%) rename src/main/resources/sound/sfx/steps/{ => grass}/steps - Track 19.wav (100%) rename src/main/resources/sound/sfx/steps/{ => grass}/steps - Track 2.wav (100%) rename src/main/resources/sound/sfx/steps/{ => grass}/steps - Track 20.wav (100%) rename src/main/resources/sound/sfx/steps/{ => grass}/steps - Track 3.wav (100%) rename src/main/resources/sound/sfx/steps/{ => grass}/steps - Track 4.wav (100%) rename src/main/resources/sound/sfx/steps/{ => grass}/steps - Track 5.wav (100%) rename src/main/resources/sound/sfx/steps/{ => grass}/steps - Track 6.wav (100%) rename src/main/resources/sound/sfx/steps/{ => grass}/steps - Track 7.wav (100%) rename src/main/resources/sound/sfx/steps/{ => grass}/steps - Track 8.wav (100%) rename src/main/resources/sound/sfx/steps/{ => grass}/steps - Track 9.wav (100%) diff --git a/.idea/misc.xml b/.idea/misc.xml index bada8b5d..f33e38f0 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,3 @@ -<?xml version="1.0" encoding="UTF-8"?> <project version="4"> <component name="ExternalStorageConfigurationManager" enabled="true" /> <component name="MavenProjectsManager"> diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Main/Main.java b/src/main/java/de/hdm_stuttgart/battlearena/Main/Main.java index d3551b39..c0b72d22 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Main/Main.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Main/Main.java @@ -1,5 +1,6 @@ package de.hdm_stuttgart.battlearena.Main; +import de.hdm_stuttgart.battlearena.Model.Sound.MusicType; import de.hdm_stuttgart.battlearena.Model.Sound.SFX; import de.hdm_stuttgart.battlearena.Model.Sound.SoundManager; import javafx.application.Application; @@ -23,19 +24,27 @@ public class Main extends Application { @Override public void start(Stage stage) throws Exception { - Parent root = FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/MainMenu.fxml"))); + final FXMLLoader loader = new FXMLLoader(); + Parent root = loader.load(getClass().getResourceAsStream("/fxml/MainMenu.fxml")); Scene scene = new Scene(root); stage.setTitle("BattleArena"); stage.setScene(scene); + + SoundManager soundManager = new SoundManager(); + stage.setOnCloseRequest(event -> { + // Add logic here to stop media playback gracefully when the stage closes + if (soundManager != null) { + soundManager.stopMusic(); + } + // Other cleanup tasks if needed + }); + soundManager.playMusic(MusicType.GAME); - soundManager.playSound("/sound/music/musicPlaceholder.wav", SFX.WALKING, true); - //soundManager.playMusic("/sound/music/musicPlaceholder.mp3"); - //soundManager.playSoundEffect(SFX.WALKING, false); stage.show(); log.debug("Project started successfully!"); } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/ISoundManager.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/ISoundManager.java index 45336b09..7f31c780 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/ISoundManager.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/ISoundManager.java @@ -7,12 +7,10 @@ import java.util.List; public interface ISoundManager { - void playSound(String path, SFX soundEffect, boolean playLoop) throws InterruptedException, MalformedURLException; - void playMusic (String musicPath); - void playSoundEffect(SFX effects, boolean playLoop) throws InterruptedException, MalformedURLException; + void playSoundEffect() throws InterruptedException, MalformedURLException; //plays sound effects only - List<Path> getFilePathsFromResources(Path folderPath) throws IOException; + List<Path> getFilePathsFromResources(Path folderPath) throws IOException; // gets file-paths in a Folder as a list } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/MusicType.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/MusicType.java new file mode 100644 index 00000000..b7d5924e --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/MusicType.java @@ -0,0 +1,16 @@ +package de.hdm_stuttgart.battlearena.Model.Sound; + +public enum MusicType { + MENU("src/main/resources/sound/music/menu"), + OPTIONS("src/main/resources/sound/music/options"), + GAME("src/main/resources/sound/music/game"); + + private String path; + MusicType(String path){ + this.path = path; + } + + public String getPath(){ + return path; + } +} diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SFX.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SFX.java index dd7e6e7c..4c4dae81 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SFX.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SFX.java @@ -1,8 +1,17 @@ package de.hdm_stuttgart.battlearena.Model.Sound; public enum SFX { - WALKING, + GRASS("/sound/sfx/steps/grass"), + STONE("/sound/sfx/steps/stone"), + COLLISION("/sound/sfx/collision"), + ATTACK("/sound/sfx/attack"); - COLLISION, - METALLPIPEFALLING //:) + private String path; + SFX(String path){ + this.path = path; + } + + public String getPath(){ + return path; + } } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SoundManager.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SoundManager.java index ffe950c8..41af9877 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SoundManager.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SoundManager.java @@ -1,26 +1,27 @@ package de.hdm_stuttgart.battlearena.Model.Sound; -import javafx.application.Platform; + +import javafx.scene.media.Media; +import javafx.scene.media.MediaPlayer; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; import javafx.scene.media.AudioClip; -import javafx.scene.media.Media; -import javafx.scene.media.MediaPlayer; -import javafx.util.Duration; -import javax.sound.sampled.*; -import java.io.File; + import java.io.IOException; import java.net.MalformedURLException; +import java.net.URI; +import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.Random; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -28,103 +29,45 @@ public class SoundManager implements ISoundManager { private static final Logger log = LogManager.getLogger(SoundManager.class); - private ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(5); + private final ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(5); + private final List<SFX> soundEffectsRunning = new ArrayList<>(); + private MediaPlayer mediaPlayer; - private ThreadPoolExecutor musicexecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(5); - private volatile boolean stopLoop = false; + private final boolean stopLoop = false; private List<Path> walkingSFXPaths; + //Todo Make music play + public void playMusic(MusicType musicType) throws IOException { + Path pathTypeOfMusic = Paths.get(musicType.getPath()); + List<Path> musicPaths = getFilePathsFromResources(pathTypeOfMusic); + Random random = new Random(); + int min = 0; + int max = musicPaths.size() - 1; + int randomIndex = random.nextInt(max - min + 1 ) + min; + String randomMusic = musicPaths.get(randomIndex).toString(); + String normalizedPath = Paths.get(randomMusic).toString().replace('\\', '/'); + String resource = normalizedPath.substring(18); + log.info(resource); + Thread thread = new Thread(() -> { + Media media = new Media(getClass().getResource(resource).toExternalForm()); + mediaPlayer = new MediaPlayer(media); + mediaPlayer.setCycleCount(MediaPlayer.INDEFINITE); + mediaPlayer.play(); + log.info("Music is playing"); - - @Override - public void playSound(String path, SFX soundEffect, boolean playLoop) { - musicexecutor.execute(()->{ - playMusic(path); - - try { - playSoundEffect(soundEffect, playLoop); - } catch (InterruptedException | MalformedURLException e) { - throw new RuntimeException(e); - } }); - - + thread.setDaemon(true); + thread.start(); } - @Override - public void playMusic(String musicPath) { - File file = new File("src/main/resources/sound/music/musicPlaceholder.wav" ); - if(file.exists()){ - AudioInputStream audioInputStream = null; - try { - audioInputStream = AudioSystem.getAudioInputStream(file); - } catch (UnsupportedAudioFileException | IOException e) { - throw new RuntimeException(e); - } - Clip clip = null; - try { - clip = AudioSystem.getClip(); - } catch (LineUnavailableException e) { - throw new RuntimeException(e); - } - try { - clip.open(audioInputStream); - } catch (LineUnavailableException | IOException e) { - throw new RuntimeException(e); - } - clip.start(); - }else { - System.out.println("File does not exist..."); + public void stopMusic(){ + if (mediaPlayer != null) { + mediaPlayer.dispose(); // Dispose of the MediaPlayer instance } } @Override - public void playSoundEffect(SFX effects, boolean playLoop) throws InterruptedException, MalformedURLException { - switch (effects){ - case WALKING: - Path path = Paths.get("src/main/resources/sound/sfx/steps"); - try { - walkingSFXPaths = getFilePathsFromResources(path); - } catch (IOException e) { - throw new RuntimeException(e); - } - if (playLoop) { - stopLoop = false; // Reset flag for new loop - executor.execute(() -> { - while (!stopLoop) { // Continue playing until the flag is set to true - Random random = new Random(); - int min = 0; - int max = walkingSFXPaths.size() - 1; - int positiveRandomInRange = random.nextInt(max - min + 1) + min; - Path walkSound = walkingSFXPaths.get(positiveRandomInRange); - - System.out.println(walkSound); - AudioClip audioClip = null; - try { - audioClip = new AudioClip(walkSound.toUri().toURL().toExternalForm()); - } catch (MalformedURLException e) { - throw new RuntimeException(e); - } - audioClip.setVolume(1.0); - audioClip.play(); - - try { - Thread.sleep(650); // Wait before playing the next clip - } catch (InterruptedException e) { - // Handle interruption if needed - break; - } - } - }); - } else { - stopLoop = true; // Set flag to stop the loop - } - break; - - case COLLISION: - - break; - } + public void playSoundEffect() throws InterruptedException, MalformedURLException { } diff --git a/src/main/resources/sound/sfx/Footsteps, Human, Dirty Ground, Walk SND62078.wav b/src/main/resources/Footsteps, Human, Dirty Ground, Walk SND62078.wav similarity index 100% rename from src/main/resources/sound/sfx/Footsteps, Human, Dirty Ground, Walk SND62078.wav rename to src/main/resources/Footsteps, Human, Dirty Ground, Walk SND62078.wav diff --git a/src/main/resources/sound/music/musicPlaceholder.mp3 b/src/main/resources/sound/music/game/musicPlaceholder.mp3 similarity index 100% rename from src/main/resources/sound/music/musicPlaceholder.mp3 rename to src/main/resources/sound/music/game/musicPlaceholder.mp3 diff --git a/src/main/resources/sound/music/musicPlaceholder.wav b/src/main/resources/sound/music/menu/musicPlaceholder.wav similarity index 100% rename from src/main/resources/sound/music/musicPlaceholder.wav rename to src/main/resources/sound/music/menu/musicPlaceholder.wav diff --git a/src/main/resources/sound/sfx/steps/steps - Track 1.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 1.wav similarity index 100% rename from src/main/resources/sound/sfx/steps/steps - Track 1.wav rename to src/main/resources/sound/sfx/steps/grass/steps - Track 1.wav diff --git a/src/main/resources/sound/sfx/steps/steps - Track 10.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 10.wav similarity index 100% rename from src/main/resources/sound/sfx/steps/steps - Track 10.wav rename to src/main/resources/sound/sfx/steps/grass/steps - Track 10.wav diff --git a/src/main/resources/sound/sfx/steps/steps - Track 11.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 11.wav similarity index 100% rename from src/main/resources/sound/sfx/steps/steps - Track 11.wav rename to src/main/resources/sound/sfx/steps/grass/steps - Track 11.wav diff --git a/src/main/resources/sound/sfx/steps/steps - Track 12.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 12.wav similarity index 100% rename from src/main/resources/sound/sfx/steps/steps - Track 12.wav rename to src/main/resources/sound/sfx/steps/grass/steps - Track 12.wav diff --git a/src/main/resources/sound/sfx/steps/steps - Track 13.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 13.wav similarity index 100% rename from src/main/resources/sound/sfx/steps/steps - Track 13.wav rename to src/main/resources/sound/sfx/steps/grass/steps - Track 13.wav diff --git a/src/main/resources/sound/sfx/steps/steps - Track 14.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 14.wav similarity index 100% rename from src/main/resources/sound/sfx/steps/steps - Track 14.wav rename to src/main/resources/sound/sfx/steps/grass/steps - Track 14.wav diff --git a/src/main/resources/sound/sfx/steps/steps - Track 15.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 15.wav similarity index 100% rename from src/main/resources/sound/sfx/steps/steps - Track 15.wav rename to src/main/resources/sound/sfx/steps/grass/steps - Track 15.wav diff --git a/src/main/resources/sound/sfx/steps/steps - Track 16.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 16.wav similarity index 100% rename from src/main/resources/sound/sfx/steps/steps - Track 16.wav rename to src/main/resources/sound/sfx/steps/grass/steps - Track 16.wav diff --git a/src/main/resources/sound/sfx/steps/steps - Track 17.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 17.wav similarity index 100% rename from src/main/resources/sound/sfx/steps/steps - Track 17.wav rename to src/main/resources/sound/sfx/steps/grass/steps - Track 17.wav diff --git a/src/main/resources/sound/sfx/steps/steps - Track 18.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 18.wav similarity index 100% rename from src/main/resources/sound/sfx/steps/steps - Track 18.wav rename to src/main/resources/sound/sfx/steps/grass/steps - Track 18.wav diff --git a/src/main/resources/sound/sfx/steps/steps - Track 19.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 19.wav similarity index 100% rename from src/main/resources/sound/sfx/steps/steps - Track 19.wav rename to src/main/resources/sound/sfx/steps/grass/steps - Track 19.wav diff --git a/src/main/resources/sound/sfx/steps/steps - Track 2.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 2.wav similarity index 100% rename from src/main/resources/sound/sfx/steps/steps - Track 2.wav rename to src/main/resources/sound/sfx/steps/grass/steps - Track 2.wav diff --git a/src/main/resources/sound/sfx/steps/steps - Track 20.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 20.wav similarity index 100% rename from src/main/resources/sound/sfx/steps/steps - Track 20.wav rename to src/main/resources/sound/sfx/steps/grass/steps - Track 20.wav diff --git a/src/main/resources/sound/sfx/steps/steps - Track 3.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 3.wav similarity index 100% rename from src/main/resources/sound/sfx/steps/steps - Track 3.wav rename to src/main/resources/sound/sfx/steps/grass/steps - Track 3.wav diff --git a/src/main/resources/sound/sfx/steps/steps - Track 4.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 4.wav similarity index 100% rename from src/main/resources/sound/sfx/steps/steps - Track 4.wav rename to src/main/resources/sound/sfx/steps/grass/steps - Track 4.wav diff --git a/src/main/resources/sound/sfx/steps/steps - Track 5.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 5.wav similarity index 100% rename from src/main/resources/sound/sfx/steps/steps - Track 5.wav rename to src/main/resources/sound/sfx/steps/grass/steps - Track 5.wav diff --git a/src/main/resources/sound/sfx/steps/steps - Track 6.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 6.wav similarity index 100% rename from src/main/resources/sound/sfx/steps/steps - Track 6.wav rename to src/main/resources/sound/sfx/steps/grass/steps - Track 6.wav diff --git a/src/main/resources/sound/sfx/steps/steps - Track 7.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 7.wav similarity index 100% rename from src/main/resources/sound/sfx/steps/steps - Track 7.wav rename to src/main/resources/sound/sfx/steps/grass/steps - Track 7.wav diff --git a/src/main/resources/sound/sfx/steps/steps - Track 8.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 8.wav similarity index 100% rename from src/main/resources/sound/sfx/steps/steps - Track 8.wav rename to src/main/resources/sound/sfx/steps/grass/steps - Track 8.wav diff --git a/src/main/resources/sound/sfx/steps/steps - Track 9.wav b/src/main/resources/sound/sfx/steps/grass/steps - Track 9.wav similarity index 100% rename from src/main/resources/sound/sfx/steps/steps - Track 9.wav rename to src/main/resources/sound/sfx/steps/grass/steps - Track 9.wav -- GitLab