2016-05-22 8 views
0

Ab sofort benutze ich AudioPlayer, um Soundeffekte für mein Spiel zu erstellen, und ich habe Mühe, eine einfache Möglichkeit zu finden, das Audio zurückzusetzen, bevor ich es wieder spiele. Ab sofort lade ich den AudioStream komplett neu, hier ist mein Code, Anregungen sind willkommen.Bessere Methode zum Zurücksetzen von 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; 
    } 
} 

Die Linie Ich mag würde ersetzen ist:

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

'sun.audio. *' Klassen sind nicht Teil der offiziellen API und sollten nicht verwendet werden. Betrachten Sie etwas wie "Clip", sehen Sie sich die Informationen im Tag [javasound] (https://stackoverflow.com/tags/javasound/info) für Details an. –

+0

@ greg-449 Wenn Sie dies als eine Lösung postet, werde ich es als die richtige Lösung markieren, wenn Sie überhaupt Rep zu wollen, wenn nicht, dann danke für die Antwort. Es funktioniert jetzt und hilft sehr! – Kore

Antwort

0

Sie JLayer verwenden können, welche .mp3

Ein Beispiel unterstützt, wie Ton spielen mit 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(); 

Hinweis:

Beachten Sie, dass ich einen separaten Thread verwenden, wenn nicht die App gestapelt wird.

Verwandte Themen