package com.mygdx.game; import com.badlogic.gdx.Game; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Screen; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.glutils.ShapeRenderer; import com.badlogic.gdx.graphics.Color; import javafx.embed.swing.JFXPanel; import javafx.scene.media.Media; import javafx.scene.media.MediaPlayer; import javax.sound.sampled.*; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.FileReader; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; import java.nio.file.Paths; public class PlayerScreen implements Screen{ SpriteBatch batch; private BitmapFont artist; private BitmapFont name; private BitmapFont album; private Texture album_art; private Texture back_button; private BitmapFont songName; private BitmapFont lyric_text; private BitmapFont timer_text; private ShapeRenderer shapeRenderer; private String songName_str = ""; private String album_str = ""; private String artist_str = ""; private String album_art_str = ""; private String lyrics_str = ""; private String mp3_str = ""; private String background = "background.jpg"; static AudioInputStream ais; static AudioFormat format; static boolean status = true; static int port = 50005; static int sampleRate = 16000;//16000 static DataLine.Info dataLineInfo; static SourceDataLine sourceDataLine; private boolean hasEnded = false; private LyricFile[] lyrics = new LyricFile[100]; private String lyric = ""; private String timer = ""; private int progress = 0; Game g; public PlayerScreen(Game g, String songId){ this.g = g; getSongDetails(songId); create(); Thread thread = new Thread(){ public void run() { play_music(); } }; thread.start(); } private void create(){ System.out.println("I am here motherfucker, in the other fucking class."); batch = new SpriteBatch(); album_art = new Texture(album_art_str); back_button = new Texture("back_button.png"); artist = new BitmapFont(); name = new BitmapFont(); album = new BitmapFont(); lyric_text = new BitmapFont(); lyric_text.setColor(Color.WHITE); lyric_text.getData().setScale(2); timer_text = new BitmapFont(); timer_text.setColor(Color.WHITE); timer_text.getData().setScale(7); timer_text.getRegion().getTexture().setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear); songName = new BitmapFont(); songName.setColor(Color.WHITE); songName.getData().setScale(2); artist = new BitmapFont(); artist.setColor(Color.WHITE); shapeRenderer = new ShapeRenderer(); } @Override public void render(float delta){ Gdx.gl.glClearColor(0.2f, 0.2f, 0.2f, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); batch.begin(); batch.draw(new Texture(background), 0, 0); batch.draw(album_art, 600, 400, 300, 300); batch.draw(back_button, 50, 650 ); name.draw(batch, songName_str, 600, 370); artist.draw(batch, artist_str, 600, 350); album.draw(batch, album_str, 600, 330); lyric_text.draw(batch, lyric, 300, 300); timer_text.draw(batch, timer, 550, 150); shapeRenderer.begin(ShapeRenderer.ShapeType.Filled); shapeRenderer.setColor(Color.WHITE); shapeRenderer.rect(250, 50, progress, 5); shapeRenderer.end(); if (hasEnded){ g.setScreen( new SelectionScreen(g)); } batch.end(); } @Override public void resize(int width, int height){ } @Override public void show(){ } @Override public void hide(){ } @Override public void dispose(){ } @Override public void pause(){ } @Override public void resume(){ } private void getSongDetails(String songId){ boolean found = false; for (int i=0; i<10 && !found; i++){ if (songId.equals(MyGdxGame.tracks[i].getIdentifier() + "")){ songName_str = MyGdxGame.tracks[i].getSongName(); album_art_str = MyGdxGame.tracks[i].getAlbum_art(); artist_str = MyGdxGame.tracks[i].getArtist(); album_str = MyGdxGame.tracks[i].getAlbum(); lyrics_str = MyGdxGame.tracks[i].getLyrics(); mp3_str = MyGdxGame.tracks[i].getMp3(); background = MyGdxGame.tracks[i].getBackground(); found = true; } } } private void getLyricsFromFile(){ BufferedReader br = null; int i = 0; try { String sCurrentLine; br = new BufferedReader(new FileReader(lyrics_str)); while ((sCurrentLine = br.readLine()) != null) { //System.out.println(sCurrentLine); lyrics[i] = new LyricFile(sCurrentLine.substring(0, 3), sCurrentLine.substring(4)); //System.out.println(lyrics[i].getTime() + " " + lyrics[i].getLyric()); i++; } } catch (IOException e) { e.printStackTrace(); } finally { try { if (br != null)br.close(); } catch (IOException ex) { ex.printStackTrace(); } } } private void updateLyric(double duration){ int seconds = 0; int pos = 0; while (seconds < duration ){ //System.out.println(lyrics[pos].getTime() + " " + seconds + " " + duration); if (lyrics[pos].getTime().startsWith("0")) lyrics[pos].setTime(lyrics[pos].getTime().substring(1)); if (lyrics[pos] != null && lyrics[pos].getTime().equals(seconds + "")){ lyric = lyrics[pos].getLyric(); //System.out.println(lyric); pos++; } try { //Thread.currentThread().wait(1000); Thread.sleep(1000); } catch (InterruptedException e){ e.printStackTrace(); } timer = seconds + ""; seconds++; progress = (int) (300 * (seconds/duration)); //System.out.println(progress); } hasEnded = true; } private void play_music(){ DatagramSocket serverSocket = null; try { serverSocket = new DatagramSocket(port); } catch (SocketException e){ e.printStackTrace(); } //System.out.println("Server Running"); /** * Formula for lag = (byte_size/sample_rate)*2] * Byte size 9728 will produce ~ 0.45 seconds of lag. Voice slightly broken. * Byte size 1400 will produce ~ 0.06 seconds of lag. Voice extremely broken. * Byte size 4000 will produce ~ 0.18 seconds of lag. Voice slightly more broken then 9728. */ Thread lyricThread = new Thread(){ public void run(){ getLyricsFromFile(); } }; lyricThread.start(); //System.out.println("Run motherfucker"); Thread thread = new Thread(){ public void run() { JFXPanel fxPanel = new JFXPanel(); //System.out.println("Thread Running"); final Media hit = new Media(Paths.get(mp3_str).toUri().toString()); MediaPlayer mediaPlayer = new MediaPlayer(hit); mediaPlayer.play(); mediaPlayer.setOnReady(new Runnable() { @Override public void run() { //System.out.println("Seconds = " + hit.getDuration().toSeconds()); updateLyric(hit.getDuration().toSeconds()); } }); } }; thread.start(); byte[] receiveData = new byte[1100];//1280 try { format = new AudioFormat(sampleRate, 16, 1, true, false); dataLineInfo = new DataLine.Info(SourceDataLine.class, format); sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo); sourceDataLine.open(format); sourceDataLine.start(); } catch (LineUnavailableException e){ e.printStackTrace(); } FloatControl volumeControl = (FloatControl) sourceDataLine.getControl(FloatControl.Type.MASTER_GAIN); volumeControl.setValue(1.00f); DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); ByteArrayInputStream bias = new ByteArrayInputStream(receivePacket.getData()); //Reducing the volume of the stream //FloatControl volume = (FloatControl) sourceDataLine.getControl(FloatControl.Type.MASTER_GAIN); //volume.setValue(-10.0F); while (status) { try { serverSocket.receive(receivePacket); } catch (IOException e){ e.printStackTrace(); } ais = new AudioInputStream(bias, format, receivePacket.getLength()); toSpeaker(receivePacket.getData()); } sourceDataLine.drain(); sourceDataLine.close(); } public static void toSpeaker(byte soundbytes[]) { try { sourceDataLine.write(soundbytes, 0, soundbytes.length); } catch (Exception e) { System.out.println("Not working in speakers..."); e.printStackTrace(); } finally { //System.out.println("Receiving Byte."); } } }