From f423ab29c32cfb3713dadf74e1e9510a9b7001a7 Mon Sep 17 00:00:00 2001 From: Navoei Date: Thu, 30 Jan 2025 16:12:54 -0600 Subject: [PATCH] Recoding PlayerManager --- build.gradle | 3 +- .../customdiscsplugin/PlayerManager.java | 62 ++++++++++++------- 2 files changed, 43 insertions(+), 22 deletions(-) diff --git a/build.gradle b/build.gradle index 362c264..6117cd3 100644 --- a/build.gradle +++ b/build.gradle @@ -52,7 +52,8 @@ repositories { } // You need this maven repository if you want to use the paper dependency maven { - url = uri("https://papermc.io/repo/repository/maven-public/") + name = "papermc" + url = uri("https://repo.papermc.io/repository/maven-public/") } maven { url "https://repo.dmulloy2.net/repository/public/" } maven { url = "https://repo.codemc.org/repository/maven-public/" } diff --git a/src/main/java/me/Navoei/customdiscsplugin/PlayerManager.java b/src/main/java/me/Navoei/customdiscsplugin/PlayerManager.java index 8f35b97..aeb2597 100644 --- a/src/main/java/me/Navoei/customdiscsplugin/PlayerManager.java +++ b/src/main/java/me/Navoei/customdiscsplugin/PlayerManager.java @@ -21,6 +21,7 @@ import javax.annotation.Nullable; import javax.sound.sampled.*; import java.io.IOException; import java.nio.file.Path; +import java.util.Arrays; import java.util.Collection; import java.util.Map; import java.util.UUID; @@ -65,8 +66,7 @@ public class PlayerManager { AtomicBoolean stopped = new AtomicBoolean(); AtomicReference player = new AtomicReference<>(); - - playerMap.put(id, new PlayerReference(() -> { + PlayerReference playerReference = new PlayerReference(() -> { synchronized (stopped) { stopped.set(true); de.maxhenkel.voicechat.api.audiochannel.AudioPlayer audioPlayer = player.get(); @@ -74,7 +74,9 @@ public class PlayerManager { audioPlayer.stopPlaying(); } } - }, player, soundFilePath)); + }, player, soundFilePath); + + playerMap.put(id, playerReference); executorService.execute(() -> { de.maxhenkel.voicechat.api.audiochannel.AudioPlayer audioPlayer = playChannel(api, audioChannel, block, soundFilePath, playersInRange); @@ -83,8 +85,10 @@ public class PlayerManager { return; } audioPlayer.setOnStopped(() -> { - plugin.getServer().getRegionScheduler().run(plugin, block.getLocation(), scheduledTask -> HopperManager.instance().discToHopper(block)); - playerMap.remove(id); + //plugin.getServer().getRegionScheduler().run(plugin, block.getLocation(), scheduledTask -> HopperManager.instance().discToHopper(block)); + if (playerMap.containsValue(playerReference)) { + playerMap.remove(id); + } }); synchronized (stopped) { if (!stopped.get()) { @@ -99,21 +103,22 @@ public class PlayerManager { @Nullable private de.maxhenkel.voicechat.api.audiochannel.AudioPlayer playChannel(VoicechatServerApi api, AudioChannel audioChannel, Block block, Path soundFilePath, Collection playersInRange) { - try { - short[] audio = readSoundFile(soundFilePath); - AudioPlayer audioPlayer = api.createAudioPlayer(audioChannel, api.createEncoder(), audio); - audioPlayer.startPlaying(); - return audioPlayer; - } catch (Exception e) { - e.printStackTrace(); - plugin.getLogger().info("Error Occurred At: " + block.getLocation()); - for (ServerPlayer serverPlayer : playersInRange) { - Player bukkitPlayer = (Player) serverPlayer.getPlayer(); - TextComponent textComponent = Component.text("An error has occurred while trying to play this disc.").color(NamedTextColor.RED); - bukkitPlayer.sendMessage(textComponent); + //short[] audio = readSoundFile(soundFilePath); + AudioPlayer audioPlayer = api.createAudioPlayer(audioChannel, api.createEncoder(), () -> { + try { + return readSoundFile(soundFilePath); + } catch (Exception e) { + plugin.getLogger().info("Error Occurred At: " + block.getLocation()); + for (ServerPlayer serverPlayer : playersInRange) { + Player bukkitPlayer = (Player) serverPlayer.getPlayer(); + TextComponent textComponent = Component.text("An error has occurred while trying to play this disc.").color(NamedTextColor.RED); + bukkitPlayer.sendMessage(textComponent); + } + return null; } - return null; - } + }); + audioPlayer.startPlaying(); + return audioPlayer; } private static short[] readSoundFile(Path file) throws UnsupportedAudioFileException, IOException { @@ -144,7 +149,23 @@ public class PlayerManager { assert finalInputStream != null; - return adjustVolume(finalInputStream.readAllBytes(), CustomDiscs.getInstance().musicDiscVolume); + //byte[] audioPacket = inputStreamToPackets(finalInputStream); + + return adjustVolume(finalInputStream.readNBytes(1920), CustomDiscs.getInstance().musicDiscVolume); + } + + private static byte[] inputStreamToPackets(AudioInputStream inputStream) throws IOException { + int FRAME_SIZE_BYTES = 1920; + byte[] buffer = new byte[FRAME_SIZE_BYTES]; // Buffer to hold 960 bytes of audio data + int bytesRead = inputStream.read(buffer); + // If fewer than 960 bytes are read, pad with zeros + if (bytesRead < FRAME_SIZE_BYTES) { + for (int i = bytesRead; i < FRAME_SIZE_BYTES; i++) { + buffer[i] = 0; // Pad with zero + } + } + System.out.println(Arrays.toString(buffer)); + return buffer; } private static byte[] adjustVolume(byte[] audioSamples, double volume) { @@ -181,7 +202,6 @@ public class PlayerManager { if (player != null) { player.onStop.stop(); } - playerMap.remove(id); } public static float getLengthSeconds(Path file) throws UnsupportedAudioFileException, IOException {