2016-05-22 3 views
0

На данный момент я использую AudioPlayer для создания звуковых эффектов для своей игры, и я изо всех сил пытаюсь найти простой способ сбросить звук, прежде чем снова начну воспроизводить его. На данный момент я просто перезагружаю AudioStream полностью, heres мой код, любые предложения приветствуются.Лучший способ сброса java AudioStream

package resources; 

import java.io.File; 
import java.io.FileInputStream; 
import java.util.HashMap; 

import javax.sound.sampled.Clip; 

import sun.audio.AudioPlayer; 
import sun.audio.AudioStream; 

public class Audio { 

    private static HashMap<String, AudioStream> sounds = new HashMap<String, AudioStream>(); 
    private static HashMap<String, Long> times = new HashMap<String, Long>(); 

    Clip c; 

    public static AudioStream getAudio(String s){ 
     if(sounds.containsKey(s)) 
      return sounds.get(s); 
     return null; 
    } 

    public static void loadAllAudio(){ 
     File f = new File("res/sounds"); 
     String[] files = f.list(); 
     for(String s:files){ 
      if(s.endsWith(".wav")){ 
       loadAudio(s); 
       System.out.println("Loaded Audio: "+s); 
      } 
     } 
    } 

    public static double getSoundLength(String sound){ 
     return getAudio(sound).getLength()/192000.0; 
    } 

    public static void playSound(String name){ 
     resetSound(name); 
     times.put(name, System.nanoTime()); 
     AudioPlayer.player.start(sounds.get(name)); 
    } 

    public static void resetSound(String name){ 
     loadAudio(name); 
    } 

    public static void stopSound(String sound){ 
     AudioPlayer.player.stop(sounds.get(sound)); 
     times.put(sound, System.nanoTime()); 
    } 

    private static void loadAudio(String name){ 
     try { 
      File f = new File("res/sounds/"+name); 
      sounds.put(name, new AudioStream(new FileInputStream(f))); 
      times.put(name, 0L); 
     } catch (Exception e) {} 
    } 

    public static double getTime(String sound) { 
     long time = times.get(sound); 
     if(time==0) 
      return 0; 
     return (System.nanoTime()-time)/1E9; 
    } 
} 

Линия Я хотел бы заменить это:

public static void playSound(String name){ 
    ---------resetSound(name);--------- THIS LINE 
    times.put(name, System.nanoTime()); 
    AudioPlayer.player.start(sounds.get(name)); 
} 
+1

'sun.audio. *' Классы не являются частью официального API и не должны использоваться. Посмотрите на использование чего-то типа 'Clip', посмотрите информацию в теге [javasound] (https://stackoverflow.com/tags/javasound/info) для получения более подробной информации. –

+0

@ greg-449, если вы опубликуете это как решение, я помечаю его как правильное решение, если вы вообще не хотите репутации, если нет, то спасибо за ответ. Он работает сейчас и помогает много! – Kore

ответ

0

Вы можете использовать JLayer, который поддерживает .mp3

пример того, как для воспроизведения звука с JLayer:

new Thread(()->{ 
    try { 
     FileInputStream file = new FileInputStream("path ..../audio.mp3"); //initialize the FileInputStream 
     Player player= new Player(file); //initialize the player 
     player.play(); //start the player 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

}).start(); 

Примечание:

Обратите внимание, что я использую отдельную причину Thread, если приложение не будет складываться.

Смежные вопросы