From 3eef0b1080514e61228b4a93fa66f89c933c1f51 Mon Sep 17 00:00:00 2001 From: Li REN Date: Wed, 12 Jun 2013 22:18:49 -0400 Subject: [PATCH] Add a background music player to Mage Client. Music support .mp3 or .wav files. Put the audio files under plugins\sounds\music, random song will be played sequentially when GamePane is activited. the UI to adjust background music is add to preference dialog as well. --- .../java/mage/client/util/MusicPlayer.java | 170 ++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 Mage.Client/src/main/java/mage/client/util/MusicPlayer.java diff --git a/Mage.Client/src/main/java/mage/client/util/MusicPlayer.java b/Mage.Client/src/main/java/mage/client/util/MusicPlayer.java new file mode 100644 index 00000000000..c535b59640f --- /dev/null +++ b/Mage.Client/src/main/java/mage/client/util/MusicPlayer.java @@ -0,0 +1,170 @@ +package mage.client.util; +import java.io.File; +import java.awt.List; +import javax.sound.sampled.*; + +/** + * + * @author renli + */ + +public class MusicPlayer { + + String filepath; + String filename; + List filelist = new List(); + static MusicPlayer player = null; + + public static String BASE_BGM_PATH = "G:\\mp3\\东方\\TH13_-_东方神灵庙BGM\\"; + + public MusicPlayer(){ + open(); + } + + //open file and add list + private void open(){ + filepath = BASE_BGM_PATH; + filelist.removeAll(); + File filedir = new File(filepath); + File[] fileread = filedir.listFiles(); + if(fileread.length == 0){System.out.println("No file readed.");} + String filename; + for(File f:fileread){ + filename = f.getName().toLowerCase(); + if(filename.endsWith(".mp3") || filename.endsWith(".wav")){ + filelist.add(filename); + } + } + } + + public static void playBGM(){ + if(player == null){ + player = new MusicPlayer(); + } + player.play(); + } + + public void play(){ + player.stopped = false; + player.breaked_out = false; + player.breaked = false; + Thread player = new Thread(new playerThread()); + player.start(); + } + + public static void stopBGM(){ + if(player != null){ + player.stopped = true; + player.breaked_out = true; + player.breaked = true; + try { + Thread.sleep(100); + } catch (Exception e) { + } + } + System.out.println("stoped"); + } + + /* maximum value 6.0206 */ + public static void addVolume(){ + try{ + float v = player.volume.getValue(); + player.volume.setValue(++v); + System.out.println("Volume: " + v); + }catch(IllegalArgumentException e){ + e.printStackTrace(); + } + } + /* minimum value -80 */ + public static void abstructVolume(){ + try{ + float v = player.volume.getValue(); + player.volume.setValue(--v); + System.out.println("Volume: " + v); + }catch(IllegalArgumentException e){ + e.printStackTrace(); + } + } + + public volatile boolean breaked = false; + public volatile boolean breaked_out = false; + public volatile boolean stopped = false; + public volatile FloatControl volume; + AudioInputStream audioInputStream; + AudioFormat audioFormat; + SourceDataLine sourceDataLine; + + + class playerThread extends Thread{ + private void load(File file){ + try{ + audioInputStream = AudioSystem.getAudioInputStream(file); + audioFormat = audioInputStream.getFormat(); + // mp3 decode + if (audioFormat.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) { + audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, + audioFormat.getSampleRate(), 16, audioFormat.getChannels(), audioFormat.getChannels() * 2, + audioFormat.getSampleRate(), false); + audioInputStream = AudioSystem.getAudioInputStream(audioFormat, audioInputStream); + } + //output + DataLine.Info dataLineInfo = new DataLine.Info( + SourceDataLine.class, audioFormat, + AudioSystem.NOT_SPECIFIED); + sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo); + sourceDataLine.open(audioFormat); + volume = (FloatControl)sourceDataLine.getControl(FloatControl.Type.MASTER_GAIN); + sourceDataLine.start(); + }catch(Exception e){ + e.printStackTrace(); + System.exit(0); + } + + } + + public void run(){ + try { + Thread.sleep(100); + } catch (Exception e) { + } + while(!stopped){ + int it = (int)Math.abs(Math.random()*(filelist.getItemCount())); + File file = new File(filepath + filelist.getItem(it)); + System.out.println(filepath + filelist.getItem(it)); + load(file); + Thread PlayThread = new Thread(new PlayThread()); + PlayThread.start(); + System.out.println("playing: " + filelist.getItem(it)); + while (!(breaked || breaked_out)) { + try { + Thread.sleep(10); + } catch (Exception e) { + } + } + breaked = false; + } + } + }; + + class PlayThread extends Thread{ + byte tempBuffer[] = new byte[320]; + public void run(){ + try{ + int len; + while ((len = audioInputStream.read(tempBuffer, 0, + tempBuffer.length)) != -1){ + if(breaked_out) break; + if(len > 0) sourceDataLine.write(tempBuffer, 0, len); + } + //breaked or stopped + sourceDataLine.drain(); + sourceDataLine.close(); + breaked = true; + }catch(Exception e){ + e.printStackTrace(); + System.exit(0); + } + } + }; +} +