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 nazwiedatai 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?

questionAnswers(3)

yourAnswerToTheQuestion