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); + } + } + }; +} +