diff --git a/.idea/misc.xml b/.idea/misc.xml index 64c32f6..72be14a 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -13,7 +13,7 @@ - + \ No newline at end of file diff --git a/app/src/main/java/org/toop/Main.java b/app/src/main/java/org/toop/Main.java index 858ab1a..51cdcd4 100644 --- a/app/src/main/java/org/toop/Main.java +++ b/app/src/main/java/org/toop/Main.java @@ -1,7 +1,8 @@ package org.toop; import org.toop.app.gui.LocalServerSelector; -import org.toop.framework.assets.AssetManager; +import org.toop.framework.asset.AssetLoader; +import org.toop.framework.asset.AssetManager; import org.toop.framework.audio.SoundManager; import org.toop.framework.audio.events.AudioEvents; import org.toop.framework.eventbus.EventFlow; @@ -15,9 +16,10 @@ import java.nio.file.NotDirectoryException; public class Main { static void main(String[] args) throws IOException, UnsupportedAudioFileException, LineUnavailableException, InterruptedException { - var a = new AssetManager(new File("app/src/main/resources/assets")); + + AssetManager.initializeLoader(new File("app/src/main/resources/assets")); var b = new NetworkingClientManager(); - var c = new SoundManager(a); + var c = new SoundManager(); new EventFlow().addPostEvent(new AudioEvents.PlayAudio("mainmenu.wav", true)).asyncPostEvent(); new EventFlow().addPostEvent(new AudioEvents.PlayAudio("sadtrombone.wav", true)).asyncPostEvent(); @@ -31,5 +33,6 @@ public class Main { javax.swing.SwingUtilities.invokeLater(LocalServerSelector::new); } - private static void initSystems() throws NetworkingInitializationException, NotDirectoryException {} + private static void initSystems() throws NetworkingInitializationException, NotDirectoryException { + } } diff --git a/framework/src/main/java/org/toop/framework/assets/Asset.java b/framework/src/main/java/org/toop/framework/asset/Asset.java similarity index 85% rename from framework/src/main/java/org/toop/framework/assets/Asset.java rename to framework/src/main/java/org/toop/framework/asset/Asset.java index 51bb675..9f1f488 100644 --- a/framework/src/main/java/org/toop/framework/assets/Asset.java +++ b/framework/src/main/java/org/toop/framework/asset/Asset.java @@ -1,7 +1,7 @@ -package org.toop.framework.assets; +package org.toop.framework.asset; import org.toop.framework.SnowflakeGenerator; -import org.toop.framework.assets.resources.BaseResource; +import org.toop.framework.asset.resources.BaseResource; public class Asset { private final Long id; diff --git a/framework/src/main/java/org/toop/framework/assets/AssetLoader.java b/framework/src/main/java/org/toop/framework/asset/AssetLoader.java similarity index 90% rename from framework/src/main/java/org/toop/framework/assets/AssetLoader.java rename to framework/src/main/java/org/toop/framework/asset/AssetLoader.java index db25a17..cb46506 100644 --- a/framework/src/main/java/org/toop/framework/assets/AssetLoader.java +++ b/framework/src/main/java/org/toop/framework/asset/AssetLoader.java @@ -1,8 +1,8 @@ -package org.toop.framework.assets; +package org.toop.framework.asset; -import org.toop.framework.assets.resources.AudioAsset; -import org.toop.framework.assets.resources.BaseResource; -import org.toop.framework.assets.resources.ImageAsset; +import org.toop.framework.asset.resources.AudioAsset; +import org.toop.framework.asset.resources.BaseResource; +import org.toop.framework.asset.resources.ImageAsset; import java.io.File; import java.io.FileNotFoundException; diff --git a/framework/src/main/java/org/toop/framework/assets/AssetManager.java b/framework/src/main/java/org/toop/framework/asset/AssetManager.java similarity index 78% rename from framework/src/main/java/org/toop/framework/assets/AssetManager.java rename to framework/src/main/java/org/toop/framework/asset/AssetManager.java index eddf14b..1b431eb 100644 --- a/framework/src/main/java/org/toop/framework/assets/AssetManager.java +++ b/framework/src/main/java/org/toop/framework/asset/AssetManager.java @@ -1,10 +1,12 @@ -package org.toop.framework.assets; +package org.toop.framework.asset; -import org.toop.framework.assets.resources.*; +import org.toop.framework.asset.resources.*; +import java.io.File; import java.util.*; public class AssetManager { + private static AssetLoader loader = null; private static final AssetManager INSTANCE = new AssetManager(); private static final Map> assets = new HashMap<>(); @@ -14,6 +16,12 @@ public class AssetManager { return INSTANCE; } + public static void initializeLoader(File rootFolder) { + if (loader == null) { + loader = new AssetLoader(rootFolder); + } + } + public ArrayList> getAllOfType(Class type) { ArrayList> list = new ArrayList<>(); for (Asset asset : assets.values()) { // <-- use .values() diff --git a/framework/src/main/java/org/toop/framework/assets/resources/AudioAsset.java b/framework/src/main/java/org/toop/framework/asset/resources/AudioAsset.java similarity index 96% rename from framework/src/main/java/org/toop/framework/assets/resources/AudioAsset.java rename to framework/src/main/java/org/toop/framework/asset/resources/AudioAsset.java index 9483059..e6fbaf8 100644 --- a/framework/src/main/java/org/toop/framework/assets/resources/AudioAsset.java +++ b/framework/src/main/java/org/toop/framework/asset/resources/AudioAsset.java @@ -1,4 +1,4 @@ -package org.toop.framework.assets.resources; +package org.toop.framework.asset.resources; import javax.sound.sampled.*; import java.io.*; diff --git a/framework/src/main/java/org/toop/framework/asset/resources/BaseResource.java b/framework/src/main/java/org/toop/framework/asset/resources/BaseResource.java new file mode 100644 index 0000000..860cbf8 --- /dev/null +++ b/framework/src/main/java/org/toop/framework/asset/resources/BaseResource.java @@ -0,0 +1,27 @@ +package org.toop.framework.asset.resources; + +import java.io.*; + +public abstract class BaseResource { + + final InputStream stream; + final File file; + + BaseResource(final File file) { + this.file = file; + try { + this.stream = new BufferedInputStream(new FileInputStream(file)); + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } + } + + public InputStream getInputStream() { + return this.stream; + } + + public File getFile() { + return this.file; + } + +} diff --git a/framework/src/main/java/org/toop/framework/assets/resources/FontAsset.java b/framework/src/main/java/org/toop/framework/asset/resources/FontAsset.java similarity index 90% rename from framework/src/main/java/org/toop/framework/assets/resources/FontAsset.java rename to framework/src/main/java/org/toop/framework/asset/resources/FontAsset.java index 3d38f5b..b4f3d06 100644 --- a/framework/src/main/java/org/toop/framework/assets/resources/FontAsset.java +++ b/framework/src/main/java/org/toop/framework/asset/resources/FontAsset.java @@ -1,4 +1,4 @@ -package org.toop.framework.assets.resources; +package org.toop.framework.asset.resources; import java.io.File; import java.io.FileNotFoundException; diff --git a/framework/src/main/java/org/toop/framework/assets/resources/ImageAsset.java b/framework/src/main/java/org/toop/framework/asset/resources/ImageAsset.java similarity index 94% rename from framework/src/main/java/org/toop/framework/assets/resources/ImageAsset.java rename to framework/src/main/java/org/toop/framework/asset/resources/ImageAsset.java index 731b0ba..4670600 100644 --- a/framework/src/main/java/org/toop/framework/assets/resources/ImageAsset.java +++ b/framework/src/main/java/org/toop/framework/asset/resources/ImageAsset.java @@ -1,4 +1,4 @@ -package org.toop.framework.assets.resources; +package org.toop.framework.asset.resources; import javafx.scene.image.Image; import java.io.File; diff --git a/framework/src/main/java/org/toop/framework/assets/resources/LoadableResource.java b/framework/src/main/java/org/toop/framework/asset/resources/LoadableResource.java similarity index 78% rename from framework/src/main/java/org/toop/framework/assets/resources/LoadableResource.java rename to framework/src/main/java/org/toop/framework/asset/resources/LoadableResource.java index 5d97257..fe14ab6 100644 --- a/framework/src/main/java/org/toop/framework/assets/resources/LoadableResource.java +++ b/framework/src/main/java/org/toop/framework/asset/resources/LoadableResource.java @@ -1,4 +1,4 @@ -package org.toop.framework.assets.resources; +package org.toop.framework.asset.resources; import java.io.FileNotFoundException; diff --git a/framework/src/main/java/org/toop/framework/assets/resources/TextAsset.java b/framework/src/main/java/org/toop/framework/asset/resources/TextAsset.java similarity index 58% rename from framework/src/main/java/org/toop/framework/assets/resources/TextAsset.java rename to framework/src/main/java/org/toop/framework/asset/resources/TextAsset.java index db890a0..5231513 100644 --- a/framework/src/main/java/org/toop/framework/assets/resources/TextAsset.java +++ b/framework/src/main/java/org/toop/framework/asset/resources/TextAsset.java @@ -1,14 +1,7 @@ -package org.toop.framework.assets.resources; +package org.toop.framework.asset.resources; -import org.w3c.dom.Text; - -import javax.sound.sampled.AudioSystem; -import javax.sound.sampled.Clip; -import javax.sound.sampled.LineUnavailableException; -import javax.sound.sampled.UnsupportedAudioFileException; import java.io.File; import java.io.FileNotFoundException; -import java.io.IOException; public class TextAsset extends BaseResource implements LoadableResource { diff --git a/framework/src/main/java/org/toop/framework/assets/resources/BaseResource.java b/framework/src/main/java/org/toop/framework/assets/resources/BaseResource.java deleted file mode 100644 index 07469f8..0000000 --- a/framework/src/main/java/org/toop/framework/assets/resources/BaseResource.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.toop.framework.assets.resources; - -import java.io.*; -import java.nio.file.Files; - -public abstract class BaseResource { - - final InputStream stream; - final File file; -public abstract class Resource { - final private byte[] rawData; - final private File file; - - BaseResource(final File file) { - Resource(final File file) throws RuntimeException { - this.file = file; - try { - this.rawData = Files.readAllBytes(file.toPath()); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public InputStream getInputStream() { - return this.stream; - public Resource load() { - return this; - } - - public InputStream getStream() { - return new BufferedInputStream(new ByteArrayInputStream(this.rawData)); - } - - public File getFile() { - return this.file; - } - -} diff --git a/framework/src/main/java/org/toop/framework/assets/resources/ImageResource.java b/framework/src/main/java/org/toop/framework/assets/resources/ImageResource.java deleted file mode 100644 index bab44bf..0000000 --- a/framework/src/main/java/org/toop/framework/assets/resources/ImageResource.java +++ /dev/null @@ -1,27 +0,0 @@ - -package org.toop.framework.assets.resources; - -import javafx.scene.image.Image; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.InputStream; - -public class ImageResource extends Resource { - - private Image image = null; - - public ImageResource(File imageFile) { - super(imageFile); - } - - public Image getImage() { - return this.image; - } - - @Override - public Resource load() { - this.image = new Image(this.getStream()); - return this; - } -} \ No newline at end of file diff --git a/framework/src/main/java/org/toop/framework/audio/SoundManager.java b/framework/src/main/java/org/toop/framework/audio/SoundManager.java index faa8770..b0304a6 100644 --- a/framework/src/main/java/org/toop/framework/audio/SoundManager.java +++ b/framework/src/main/java/org/toop/framework/audio/SoundManager.java @@ -1,9 +1,9 @@ package org.toop.framework.audio; import org.toop.framework.SnowflakeGenerator; -import org.toop.framework.assets.Asset; -import org.toop.framework.assets.AssetManager; -import org.toop.framework.assets.resources.AudioResource; +import org.toop.framework.asset.Asset; +import org.toop.framework.asset.AssetManager; +import org.toop.framework.asset.resources.AudioAsset; import org.toop.framework.audio.events.AudioEvents; import org.toop.framework.eventbus.EventFlow; @@ -12,15 +12,16 @@ import java.util.*; import javax.sound.sampled.*; public class SoundManager { + private final AssetManager asm = AssetManager.getInstance(); private final Map activeClips = new HashMap<>(); - private final HashMap audioResources = new HashMap<>(); + private final HashMap audioResources = new HashMap<>(); private final SnowflakeGenerator idGenerator = new SnowflakeGenerator(); // TODO: Don't create a new generator - public SoundManager(AssetManager asm) { + public SoundManager() { // Get all Audio Resources and add them to a list. - for (Asset resource : asm.getAllResourceOfType(AudioResource.class).values()) { + for (Asset asset : asm.getAllOfType(AudioAsset.class)) { try { - this.addAudioResource(resource); + this.addAudioResource(asset); } catch (IOException | LineUnavailableException | UnsupportedAudioFileException e) { throw new RuntimeException(e); } @@ -38,52 +39,47 @@ public class SoundManager { this.stopSound(event.clipId()); } - private void addAudioResource(Asset audioAsset) + private void addAudioResource(Asset audioAsset) throws IOException, UnsupportedAudioFileException, LineUnavailableException { - AudioResource audioResource = audioAsset.getResource(); - this.audioResources.put(audioAsset.getName(), audioResource); + this.audioResources.put(audioAsset.getName(), audioAsset.getResource()); } private long playSound(String audioFileName, boolean loop) { - try { - AudioResource resource = audioResources.get(audioFileName); + AudioAsset asset = audioResources.get(audioFileName); - // Return -1 which indicates resource wasn't available - if (resource == null){ - return -1; - } - - // Get a new clip from resource - Clip clip = resource.getNewClip(); - - // If supposed to loop make it loop, else just start it once - if (loop){ - clip.loop(Clip.LOOP_CONTINUOUSLY); - } - else { - clip.start(); - } - - // Generate id for clip - long clipId = idGenerator.nextId(); - - // store it so we can stop it later - activeClips.put(clipId, clip); // TODO: Do on snowflake for specific sound to stop - - // remove when finished (only for non-looping sounds) - clip.addLineListener(event -> { - if (event.getType() == LineEvent.Type.STOP && !clip.isRunning()) { - activeClips.remove(clipId); - clip.close(); - } - }); - - // Return id so it can be stopped - return clipId; - } catch (LineUnavailableException | IOException | UnsupportedAudioFileException e) { - throw new RuntimeException(e); + // Return -1 which indicates resource wasn't available + if (asset == null){ + return -1; } + + // Get a new clip from resource + Clip clip = asset.getClip(); + + // If supposed to loop make it loop, else just start it once + if (loop) { + clip.loop(Clip.LOOP_CONTINUOUSLY); + } + else { + clip.start(); + } + + // Generate id for clip + long clipId = idGenerator.nextId(); + + // store it so we can stop it later + activeClips.put(clipId, clip); // TODO: Do on snowflake for specific sound to stop + + // remove when finished (only for non-looping sounds) + clip.addLineListener(event -> { + if (event.getType() == LineEvent.Type.STOP && !clip.isRunning()) { + activeClips.remove(clipId); + clip.close(); + } + }); + + // Return id so it can be stopped + return clipId; } public void stopSound(long clipId) {