From 6eb81fa959423ae5b9fb3ba078c80ac7c842c422 Mon Sep 17 00:00:00 2001 From: "Raybz@Raybz" Date: Thu, 13 Jun 2013 11:51:29 +0200 Subject: [PATCH] extracted first audio data and calc movement speed, replaced audioPlayer with vlc --- ShootingStars/lib/AudioProcessing-1.0.jar | Bin 32457 -> 29724 bytes .../audiodata/AudioDataManager.java | 95 ++++++++++++++++-- .../shootingstars/audiodata/AudioPlayer.java | 65 ------------ .../controls/GroundGlowControl.java | 2 +- .../controls/PlayerMoveControl.java | 21 +--- .../org/wyrez/shootingstars/game/Cinema.java | 52 ++-------- .../shootingstars/game/GameSettings.java | 79 +++++++++++++++ .../wyrez/shootingstars/states/GameState.java | 85 +++++++++------- .../shootingstars/states/LoadingState.java | 12 +-- .../states/util/LoadingProgress.java | 12 +-- 10 files changed, 240 insertions(+), 183 deletions(-) delete mode 100644 ShootingStars/src/org/wyrez/shootingstars/audiodata/AudioPlayer.java create mode 100644 ShootingStars/src/org/wyrez/shootingstars/game/GameSettings.java diff --git a/ShootingStars/lib/AudioProcessing-1.0.jar b/ShootingStars/lib/AudioProcessing-1.0.jar index 9f32196989feac0dca72b74d1ef7a69187277e86..3ade434be40c520ea2d4f53380c2f2306a890da0 100644 GIT binary patch delta 16413 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 delta 19131 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 Wg#M$uke5(}rpF~>0I=q?(CEK4x-t#` diff --git a/ShootingStars/src/org/wyrez/shootingstars/audiodata/AudioDataManager.java b/ShootingStars/src/org/wyrez/shootingstars/audiodata/AudioDataManager.java index 433d7c9..a2b4e78 100644 --- a/ShootingStars/src/org/wyrez/shootingstars/audiodata/AudioDataManager.java +++ b/ShootingStars/src/org/wyrez/shootingstars/audiodata/AudioDataManager.java @@ -21,6 +21,8 @@ import org.wyrez.audio.decoder.DecoderFactory; import org.wyrez.audio.util.Band; import org.wyrez.audio.util.SampleBuffer; import org.wyrez.audio.util.SampleHelper; +import org.wyrez.shootingstars.game.GameSettings; +import uk.co.caprica.vlcj.player.MediaPlayer; /** * @@ -36,7 +38,14 @@ public class AudioDataManager { private AudioProcessor audioProcessorLowBand; private AudioProcessor audioProcessorMidBand; private AudioProcessor audioProcessorHighBand; - private AudioPlayer player; + private MediaPlayer player; + private int bufferSize; + private float samplingRate; + private float[] speedData; + private float[] movementData; + private float[] flashData; + private float peakAverage; + private float indexFactor; private float bpm; private float currentTime; private float lastTimeSync; @@ -44,10 +53,12 @@ public class AudioDataManager { public void AudioDataManager() { } - public boolean initialize(String file, AudioPlayer player) { + public boolean initialize(GameSettings settings, MediaPlayer player) { try { this.player = player; - SampleBuffer samples = SampleHelper.createSampleBuffer(DecoderFactory.create(file)); + SampleBuffer samples = SampleHelper.createSampleBuffer( + DecoderFactory.create(settings.getAudioFile())); + this.samplingRate = samples.samplingRate; this.audioProcessorLowBand = new AudioProcessor(samples, LOW_BAND); this.audioProcessorMidBand = new AudioProcessor(samples, MID_BAND); this.audioProcessorHighBand = new AudioProcessor(samples, HIGH_BAND); @@ -58,42 +69,104 @@ public class AudioDataManager { } public void update(float tpf) { - if (lastTimeSync != player.getElapsedTime()) { - currentTime = player.getElapsedTime(); + if (lastTimeSync != player.getTime()) { + currentTime = player.getTime(); lastTimeSync = currentTime; } else { - currentTime += tpf; + currentTime += tpf * 1000f; } } public void analyseLowBand() { audioProcessorLowBand.calculate(); + bufferSize = audioProcessorLowBand.getBufferSize(); + indexFactor = (samplingRate / bufferSize) / 1000f; + + speedData = calcWave(audioProcessorLowBand.getSpectrum(), 4, 24, 3); + SampleHelper.normalize(speedData, 0f, 1f); + movementData = calcWave(audioProcessorLowBand.getPeaks(), 2, 4, 16); + SampleHelper.normalize(movementData, 0f, 1f); + audioProcessorLowBand.cutFastPeaks(MIN_PEAK_DIFF); + + flashData = audioProcessorLowBand.getPeaks(); + peakAverage = audioProcessorLowBand.getPeakAverage(); + bpm = audioProcessorLowBand.getBpm(); while (bpm > 200f) { bpm /= 2f; } + + audioProcessorLowBand.clean(); + audioProcessorLowBand = null; } public void analyseMidBand() { audioProcessorMidBand.calculate(); audioProcessorMidBand.cutFastPeaks(MIN_PEAK_DIFF); + + audioProcessorMidBand.clean(); + audioProcessorMidBand = null; } public void analyseHighBand() { audioProcessorHighBand.calculate(); + + audioProcessorHighBand.clean(); + audioProcessorHighBand = null; + } + + private float[] calcWave(float[] data, int actualWeight, int calcSize, int smooth) { + float[] result = new float[data.length]; + float average; + int count; + for (int s = 0; s < smooth; s++) { + for (int i = 0; i < data.length; i++) { + count = actualWeight; + average = data[i] * actualWeight; + + for (int j = 0; j < calcSize; j++) { + if (i > j) { + average += data[i - j]; + count++; + } + if (i < data.length - j - 1) { + average += data[i + j]; + count++; + } + } + average /= count; + result[i] = average; + } + } + return result; } public float getBPM() { return bpm; } - public boolean isLowPeak() { - int index = (int) (currentTime * (audioProcessorLowBand.getSamplingRate() / audioProcessorLowBand.getBufferSize())); - if (index > audioProcessorLowBand.getPeaks().length) { - index = audioProcessorLowBand.getPeaks().length - 1; + private int calcIndex() { + int index = (int) (currentTime * indexFactor); + if (index > flashData.length) { + index = flashData.length - 1; } - return audioProcessorLowBand.getPeaks()[index] > audioProcessorLowBand.getPeakAverage()*0.5f; + return index; + } + + public boolean isFlash() { + return flashData[calcIndex()] > peakAverage * 0.5f; + } + + public float getMovementData() { + return 0.5f; + //TODO argf + //System.out.println(currentTime + " * " + indexFactor + " = " + calcIndex() + " --> " + movementData[calcIndex()]); + //return movementData[calcIndex()]; + } + + public float getSpeedData() { + return speedData[calcIndex()]; } public float getMidData() { diff --git a/ShootingStars/src/org/wyrez/shootingstars/audiodata/AudioPlayer.java b/ShootingStars/src/org/wyrez/shootingstars/audiodata/AudioPlayer.java deleted file mode 100644 index aafe5a0..0000000 --- a/ShootingStars/src/org/wyrez/shootingstars/audiodata/AudioPlayer.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2013 Darth Affe and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.wyrez.shootingstars.audiodata; - -import org.wyrez.audio.AudioDevice; -import org.wyrez.audio.decoder.Decoder; - -/** - * - * @author Darth Affe - */ -public abstract class AudioPlayer extends Thread { - - private static final int BUFFER_SIZE = 128; - /**/ - private Decoder decoder; - private AudioDevice device; - private float elapsedTime; - private boolean cleanup = false; - - public AudioPlayer(Decoder decoder) throws Exception { - this.decoder = decoder; - device = new AudioDevice(decoder.getSamplingRate(), decoder.getChannelCount(), - BUFFER_SIZE * decoder.getChannelCount()); - } - - @Override - public void run() { - elapsedTime = 0; - float[] samples = new float[BUFFER_SIZE * decoder.getChannelCount()]; - long startTime = System.nanoTime(); - while (decoder.readSamplesStereo(samples) > 0) { - if (cleanup) { - break; - } - device.writeSamples(samples); - elapsedTime = (System.nanoTime() - startTime) / 1000000000.0f; - } - finished(cleanup); - } - - public float getElapsedTime() { - return elapsedTime; - } - - public void cleanup() { - this.cleanup = true; - } - - public abstract void finished(boolean cleanup); -} diff --git a/ShootingStars/src/org/wyrez/shootingstars/controls/GroundGlowControl.java b/ShootingStars/src/org/wyrez/shootingstars/controls/GroundGlowControl.java index 92b1ddf..04a0acb 100644 --- a/ShootingStars/src/org/wyrez/shootingstars/controls/GroundGlowControl.java +++ b/ShootingStars/src/org/wyrez/shootingstars/controls/GroundGlowControl.java @@ -48,7 +48,7 @@ public class GroundGlowControl extends BaseControl { @Override public void update(float tpf) { - if (audioDataManager.isLowPeak()) { + if (audioDataManager.isFlash()) { glowTimer = GLOW_DURATION; } diff --git a/ShootingStars/src/org/wyrez/shootingstars/controls/PlayerMoveControl.java b/ShootingStars/src/org/wyrez/shootingstars/controls/PlayerMoveControl.java index 7012b21..c7945be 100644 --- a/ShootingStars/src/org/wyrez/shootingstars/controls/PlayerMoveControl.java +++ b/ShootingStars/src/org/wyrez/shootingstars/controls/PlayerMoveControl.java @@ -30,15 +30,11 @@ import org.wyrez.shootingstars.helper.UserDataKeys; public class PlayerMoveControl extends BaseControl { private static final float BPM_TO_SPEED_FACTOR = 1f / 8f; - //private static final float DASH_MULTIPLIER = 4f; - //private static final float DASH_DURATION = 0.25f; /**/ private AudioDataManager audioDataManager; private float radius = 666f; private float angle = 0f; private float speed; - //TODO dashing isn't as nice at it should be -.- is it needed? -// private float dashTimer = 0f; public PlayerMoveControl(AudioDataManager audioDataManager) { this.audioDataManager = audioDataManager; @@ -61,20 +57,9 @@ public class PlayerMoveControl extends BaseControl { angle -= FastMath.TWO_PI; } -// if (audioDataManager.isLowPeak() && dashTimer <= 0f) { -// dashTimer = DASH_DURATION; -// System.out.println((System.nanoTime() - lastDash) / 1000000000.0); -// lastDash = System.nanoTime(); -// } - - spatial.setLocalTranslation(MathHelper.calcPointOnCircle(angle, radius, 250f)); //TODO set y-Position -// if (dashTimer > 0f) { -// angle += MathHelper.degreeToRadian(speed * (DASH_MULTIPLIER -// * (dashTimer / DASH_DURATION)) * tpf); -// dashTimer -= tpf; -// } else { - angle += MathHelper.degreeToRadian(speed * tpf); -// } + spatial.setLocalTranslation(MathHelper.calcPointOnCircle(angle, radius, + 200f + (600f * audioDataManager.getMovementData()))); + angle += MathHelper.degreeToRadian((speed / 2f + (speed * audioDataManager.getSpeedData())) * tpf); } } diff --git a/ShootingStars/src/org/wyrez/shootingstars/game/Cinema.java b/ShootingStars/src/org/wyrez/shootingstars/game/Cinema.java index 99c5eec..1d5f7e3 100644 --- a/ShootingStars/src/org/wyrez/shootingstars/game/Cinema.java +++ b/ShootingStars/src/org/wyrez/shootingstars/game/Cinema.java @@ -19,7 +19,6 @@ package org.wyrez.shootingstars.game; import com.jme3.material.Material; import com.jme3.math.FastMath; import com.jme3.math.Vector3f; -import com.jme3.renderer.RenderManager; import com.jme3.scene.Geometry; import com.jme3.texture.Image; import com.jme3.texture.Texture2D; @@ -27,7 +26,6 @@ import com.sun.jna.Memory; import java.nio.ByteBuffer; import org.wyrez.shootingstars.factories.Materials; import org.wyrez.shootingstars.mesh.CinemaHex; -import uk.co.caprica.vlcj.player.MediaPlayerFactory; import uk.co.caprica.vlcj.player.direct.BufferFormat; import uk.co.caprica.vlcj.player.direct.DirectMediaPlayer; import uk.co.caprica.vlcj.player.direct.RenderCallback; @@ -38,58 +36,30 @@ import uk.co.caprica.vlcj.player.direct.RenderCallback; */ public class Cinema extends Geometry implements RenderCallback { - private static final int WIDTH = 1280; - private static final int HEIGHT = 720; - private static final int DEPTH = 4; - private static final String VIDEO_FORMAT = "RGBA"; - private static final Image.Format TEXTURE_FORMAT = Image.Format.RGBA8; - private final MediaPlayerFactory mediaPlayerFactory; - private final DirectMediaPlayer mediaPlayer; private final Image videoImage; private final Texture2D videoTexture; private final Object bufferLock = new Object(); private ByteBuffer buffer; + private int videoBufferSize; - public Cinema(String file) { - this(file, 1000f); + public Cinema(GameSettings settings) { + this(settings, 1000f); } - public Cinema(String file, float radius) { - this(file, radius, Vector3f.ZERO); + public Cinema(GameSettings settings, float radius) { + this(settings, radius, Vector3f.ZERO); } - public Cinema(String file, float radius, Vector3f pos) { - super("Cinema: " + file, new CinemaHex(pos, radius, - radius * ((float) HEIGHT / (float) WIDTH))); - mediaPlayerFactory = new MediaPlayerFactory("--no-video-title-show", "--quiet"); - mediaPlayer = mediaPlayerFactory.newDirectMediaPlayer(VIDEO_FORMAT, WIDTH, HEIGHT, WIDTH * DEPTH, this); - videoImage = new Image(TEXTURE_FORMAT, WIDTH, HEIGHT, null); + public Cinema(GameSettings settings, float radius, Vector3f pos) { + super("Cinema: " + settings.getVideoFile(), new CinemaHex(pos, radius, + radius * ((float) settings.getVideoHeight() / (float) settings.getVideoWidth()))); + videoImage = new Image(settings.GetTextureFormat(), settings.getVideoWidth(), settings.getVideoHeight(), null); videoTexture = new Texture2D(videoImage); - + videoBufferSize = settings.getVideoWidth() * settings.getVideoHeight() * settings.getVideoDepth(); Material mat = Materials.UNSHADED.create(); mat.setTexture("ColorMap", videoTexture); this.setMaterial(mat); this.rotate(0f, FastMath.PI / 6f, 0f); - - mediaPlayer.prepareMedia(file); - } - - public void play() { - mediaPlayer.play(); - } - - public void pause() { - mediaPlayer.pause(); - } - - public void stop() { - mediaPlayer.stop(); - } - - public void cleanup() { - stop(); - mediaPlayer.release(); - mediaPlayerFactory.release(); } public void render() { @@ -101,7 +71,7 @@ public class Cinema extends Geometry implements RenderCallback { @Override public void display(DirectMediaPlayer mediaPlayer, Memory[] nativeBuffers, BufferFormat bufferFormat) { synchronized (bufferLock) { - buffer = nativeBuffers[0].getByteBuffer(0, WIDTH * HEIGHT * DEPTH); + buffer = nativeBuffers[0].getByteBuffer(0, videoBufferSize); } } } diff --git a/ShootingStars/src/org/wyrez/shootingstars/game/GameSettings.java b/ShootingStars/src/org/wyrez/shootingstars/game/GameSettings.java new file mode 100644 index 0000000..15b6aee --- /dev/null +++ b/ShootingStars/src/org/wyrez/shootingstars/game/GameSettings.java @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2013 Darth Affe and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.wyrez.shootingstars.game; + +import com.jme3.texture.Image; + +/** + * + * @author Darth Affe + */ +public class GameSettings { + + private static final int WIDTH = 1280; + private static final int HEIGHT = 720; + private static final int DEPTH = 4; + private static final String VIDEO_FORMAT = "RGBA"; + private static final Image.Format TEXTURE_FORMAT = Image.Format.RGBA8; + /**/ + private String audioFile; + private String videoFile; + private boolean useVideo; + + public GameSettings(String audioFile, String videoFile) { + this.audioFile = audioFile; + if (videoFile == null) { + videoFile = audioFile; + useVideo = false; + } else { + this.videoFile = videoFile; + useVideo = true; + } + } + + public String getAudioFile() { + return audioFile; + } + + public String getVideoFile() { + return videoFile; + } + + public boolean useVideo(){ + return useVideo; + } + + public int getVideoWidth() { + return WIDTH; + } + + public int getVideoHeight() { + return HEIGHT; + } + + public int getVideoDepth() { + return DEPTH; + } + + public String getVideoFormat() { + return VIDEO_FORMAT; + } + + public Image.Format GetTextureFormat() { + return TEXTURE_FORMAT; + } +} diff --git a/ShootingStars/src/org/wyrez/shootingstars/states/GameState.java b/ShootingStars/src/org/wyrez/shootingstars/states/GameState.java index 5a96946..80bbf40 100644 --- a/ShootingStars/src/org/wyrez/shootingstars/states/GameState.java +++ b/ShootingStars/src/org/wyrez/shootingstars/states/GameState.java @@ -30,9 +30,9 @@ import com.jme3.scene.Geometry; import com.jme3.scene.Node; import com.jme3.scene.Spatial; import com.jme3.scene.shape.Box; +import com.jme3.texture.Image; import org.wyrez.audio.decoder.DecoderFactory; import org.wyrez.shootingstars.audiodata.AudioDataManager; -import org.wyrez.shootingstars.audiodata.AudioPlayer; import org.wyrez.shootingstars.controls.GroundGlowControl; import org.wyrez.shootingstars.controls.PlayerCamControl; import org.wyrez.shootingstars.controls.PlayerMouseControl; @@ -40,32 +40,37 @@ import org.wyrez.shootingstars.controls.PlayerMoveControl; import org.wyrez.shootingstars.controls.PlayerShootControl; import org.wyrez.shootingstars.factories.Materials; import org.wyrez.shootingstars.game.Cinema; +import org.wyrez.shootingstars.game.GameSettings; import org.wyrez.shootingstars.game.Ground; import org.wyrez.shootingstars.gui.GameGUI; import org.wyrez.shootingstars.gui.listener.GameListener; import org.wyrez.shootingstars.helper.UserDataKeys; import tonegod.gui.core.Screen; +import uk.co.caprica.vlcj.player.MediaPlayerFactory; +import uk.co.caprica.vlcj.player.direct.DirectMediaPlayer; /** * * @author Darth Affe */ public class GameState extends AbstractAppState implements GameListener { - + private StateManager stateManager; private AssetManager assetManager; private InputManager inputManager; private ViewPort viewPort; private Camera camera; + private GameSettings settings; private AudioDataManager audioDataManager; - private AudioPlayer audioPlayer; + private final MediaPlayerFactory mediaPlayerFactory; + private DirectMediaPlayer mediaPlayer; private Node rootNode; private GameGUI gui; private Cinema cinema; private Ground ground; private Spatial player; private boolean isRunning = false; - + public GameState(Node rootNode, Screen screen, StateManager stateManager, AssetManager assetManager, ViewPort viewPort, InputManager inputManager, Camera camera, AudioDataManager audioDataManager) { @@ -77,39 +82,45 @@ public class GameState extends AbstractAppState implements GameListener { this.audioDataManager = audioDataManager; this.assetManager = assetManager; this.viewPort = viewPort; + + mediaPlayerFactory = new MediaPlayerFactory("--no-video-title-show", "--quiet"); + + this.settings = new GameSettings("Shades of AMV.mp3", "Shades of AMV.webm"); } - + + public void setSettings(GameSettings settings) { + this.settings = settings; + } + public void loadGround() { ground = new Ground(); - - for (Spatial s : ground.getChildren()) { - s.addControl(new GroundGlowControl(audioDataManager)); - } - + +// for (Spatial s : ground.getChildren()) { +// s.addControl(new GroundGlowControl(audioDataManager)); +// } + FilterPostProcessor fpp = new FilterPostProcessor(assetManager); fpp.addFilter(new BloomFilter(BloomFilter.GlowMode.Objects)); viewPort.addProcessor(fpp); } - - public boolean initAudioPlayer() { + + public boolean initMediaPlayer() { try { - this.audioPlayer = new AudioPlayer(DecoderFactory.create("Lost One no Goukoku.mp3")) {//TODO path - @Override - public void finished(boolean cleanup) { - System.out.println(">>> FINISHED!"); - } - }; + mediaPlayer = mediaPlayerFactory.newDirectMediaPlayer(settings.getVideoFormat(), + settings.getVideoWidth(), settings.getVideoHeight(), + settings.getVideoWidth() * settings.getVideoDepth(), cinema); + mediaPlayer.prepareMedia(settings.getVideoFile()); return true; } catch (Exception ex) { return false; } } - + public void loadCinema() { - cinema = new Cinema("Broken.mp4"); //TODO settings? + cinema = new Cinema(settings); cinema.move(0f, 160f, 0f); } - + public void loadPlayer() { player = new Geometry("player", new Box(Vector3f.ZERO, 1f, 1f, 1f)); //TODO start location? player.setMaterial(Materials.UNSHADED.create()); @@ -119,16 +130,15 @@ public class GameState extends AbstractAppState implements GameListener { player.addControl(new PlayerShootControl(inputManager)); player.addControl(new PlayerCamControl(camera)); } - + public void start() { gui.setStart(); inputManager.setCursorVisible(false); player.setUserData(UserDataKeys.RUNNING, true); - cinema.play(); - audioPlayer.start(); + mediaPlayer.play(); isRunning = true; } - + @Override public void stateAttached(AppStateManager stateManager) { // stateManager.attach(new FlyCamAppState()); //TODO debug @@ -138,7 +148,7 @@ public class GameState extends AbstractAppState implements GameListener { gui.setWait(); gui.attach(); } - + @Override public void stateDetached(AppStateManager stateManager) { // stateManager.detach(new FlyCamAppState()); //TODO debug @@ -146,28 +156,33 @@ public class GameState extends AbstractAppState implements GameListener { rootNode.detachChild(player); rootNode.detachChild(ground); rootNode.detachChild(cinema); - cinema.cleanup(); + mediaPlayer.release(); + mediaPlayerFactory.release(); inputManager.setCursorVisible(true); } - + @Override public void render(RenderManager rm) { cinema.render(); } - + @Override public void update(float tpf) { audioDataManager.update(tpf); } - + @Override public void cleanup() { super.cleanup(); - cinema.cleanup(); - audioPlayer.cleanup(); + mediaPlayer.release(); + mediaPlayerFactory.release(); } - - public AudioPlayer getAudioPlayer() { - return audioPlayer; + + public GameSettings getSettings() { + return settings; + } + + public DirectMediaPlayer getMediaPlayer() { + return mediaPlayer; } } diff --git a/ShootingStars/src/org/wyrez/shootingstars/states/LoadingState.java b/ShootingStars/src/org/wyrez/shootingstars/states/LoadingState.java index 62674a2..270023b 100644 --- a/ShootingStars/src/org/wyrez/shootingstars/states/LoadingState.java +++ b/ShootingStars/src/org/wyrez/shootingstars/states/LoadingState.java @@ -56,6 +56,10 @@ public class LoadingState extends AbstractAppState { public void update(float tpf) { switch (currentProgress) { case START: + currentProgress = LoadingProgress.LOADING_CINEMA; + break; + case LOADING_CINEMA: + loadingCinema(); currentProgress = LoadingProgress.INIT_AUDIO_PLAYER; break; case INIT_AUDIO_PLAYER: @@ -76,10 +80,6 @@ public class LoadingState extends AbstractAppState { break; case ANALYSE_HIGH_BAND: analyseHighBand(); - currentProgress = LoadingProgress.LOADING_CINEMA; - break; - case LOADING_CINEMA: - loadingCinema(); currentProgress = LoadingProgress.GENERATING_SCENE; break; case GENERATING_SCENE: @@ -99,7 +99,7 @@ public class LoadingState extends AbstractAppState { private void initAudioAnalysis() { GameState gs = stateManager.getState(State.GAME); - audioDataManager.initialize("Lost One no Goukoku.mp3", gs.getAudioPlayer()); //TODO path + audioDataManager.initialize(gs.getSettings(), gs.getMediaPlayer()); //TODO path } private void analyseLowBand() { @@ -116,7 +116,7 @@ public class LoadingState extends AbstractAppState { private void initAudioPlayer() { GameState gs = stateManager.getState(State.GAME); - gs.initAudioPlayer(); + gs.initMediaPlayer(); } private void loadingCinema() { diff --git a/ShootingStars/src/org/wyrez/shootingstars/states/util/LoadingProgress.java b/ShootingStars/src/org/wyrez/shootingstars/states/util/LoadingProgress.java index 34597f3..549b273 100644 --- a/ShootingStars/src/org/wyrez/shootingstars/states/util/LoadingProgress.java +++ b/ShootingStars/src/org/wyrez/shootingstars/states/util/LoadingProgress.java @@ -23,12 +23,12 @@ package org.wyrez.shootingstars.states.util; public enum LoadingProgress { START("Loading...", 0), - INIT_AUDIO_PLAYER("Loading Audio-Player...", 1), - INIT_AUDIO_ANALYSIS("Creating Samples...", 2), - ANALYSE_LOW_BAND("Analyse Low-Band...", 3), - ANALYSE_MID_BAND("Analyse Mid-Band...", 4), - ANALYSE_HIGH_BAND("Analyse High-Band...", 5), - LOADING_CINEMA("Loading Cinema", 6), + LOADING_CINEMA("Loading Cinema", 1), + INIT_AUDIO_PLAYER("Loading Audio-Player...", 2), + INIT_AUDIO_ANALYSIS("Creating Samples...", 3), + ANALYSE_LOW_BAND("Analyse Low-Band...", 4), + ANALYSE_MID_BAND("Analyse Mid-Band...", 5), + ANALYSE_HIGH_BAND("Analyse High-Band...", 6), GENERATING_SCENE("Generating Scene...", 7), LOADING_PLAYER("Loading Player...", 8), DONE("Done!", 8);