Dlaczego Java Sound zachowuje się inaczej, gdy uruchamiam z pliku .jar?
Theplay
Poniższa metoda pochodzi z klasy, która po utworzeniu instancji odczytuje plik .wav do tablicy bajtów o nazwiedata
i zapisuje format dźwięku wAudioFormat
obiekt wywołanyformat
.
Mam program, który dzwoniplay
odjava.util.Timer
. Kiedy wchodzę do folderu ze wszystkimi odpowiednimi plikami .class i uruchamiam program za pomocą poleceniajava MainClass
, wszystko działa zgodnie z oczekiwaniami. Jednak gdy umieściłem wszystkie pliki .class w pliku wykonywalnym .jar i uruchomiłem program za pomocą poleceniajava -jar MyProgram.jar
, dźwięki grane za pomocąplay
metoda zostaje odcięta po czymś w rodzaju od 50 do 150 ms.
public void play() throws LineUnavailableException {
final Clip clip = (Clip)AudioSystem.getLine(new DataLine.Info(Clip.class, format));
clip.open(format, data, 0, data.length);
new Thread() {
public void run() {
clip.start();
try {
Thread.sleep(300); // all sounds are less than 300 ms long
} catch (InterruptedException ex) { /* i know, i know... */ }
clip.close();
}
}.start();
}
Kilka komentarzy:
Próbowałem zwiększyć czas snu wplay
metoda do 1000 ms, bez zmiany zachowania.
CzasThread.sleep
za pomocąSystem.nanoTime
potwierdza, że wątek śpi dokładnie tak długo, jak oczekiwano.
Ponieważ plik dźwiękowy, który ma być odtwarzany, jest wstępnie załadowany do pamięci, nie wydaje mi się, aby problem z wydobyciem źródła dźwięku z pliku.
Próbowałem uruchomić program zarówno wewnątrz, jak i na zewnątrz jar, używając opcji rozmiaru puli pamięci-Xms2m
i-Xmx64m
(oddzielnie), bez zmiany zachowania.
Używam OpenJDK Java 6 na Ubuntu 11.04. Masz jakiś pomysł, co się dzieje?