2013-02-12 11 views
7

tworzę i sekwencera MIDI zainicjować sekwencera o ile wiem, muszę użyć:MidiSystem.getSequencer() bardzo powolny

Sequencer sequencer = MidiSystem.getSequencer(); 

Ale to powoduje mój program do uruchomienia bardzo, bardzo powolny do 2 minut dla tego jednego wywołania metody!

Wszelkie pomysły, jak to naprawić? Dziękujemy

+1

Zastanawiam się, skąd zrozumiałeś, że ta metoda powoduje, że twój program uruchamia się do 2 minut? Czy dodałeś kilka wydruków przed/po metodzie z porównaniem czasu? – Andremoniy

+0

Czy możesz dodać wersję Java, do której się odwołujesz? I który sekwenser jest zwracany (np. Nazwa, ciąg dostawcy)? Aktualnie korzystam z wersji Oracle jdk1.7.0_06 w wersji 64-bitowej i nie mogę odtworzyć problemu (kilka milisekund dla tej rozmowy). W moim przypadku może zająć do minuty ładowanie ogromnego soundfontu do syntezatora. Może twój domyślny syntezator robi coś dziwnego? Czy MidiSystem.getSynthesizer() zajmuje tyle samo czasu? – bluenote10

+0

Próbowałem w 1.6.0_37 (Mac OS), to połączenie trwa od 0,25 do 4 sekund; po wywołaniu ikona pojawia się w doku. Gdy po raz pierwszy uruchomiono aplikację [testową] (https://gist.github.com/kolen/4990019), generował on krótki głośny dźwięk przez wyjście dźwięku. – kolen

Odpowiedz

1

patrząc na kod dla MidiSystem.getSequencer() wygląda na to, że próbuje połączyć różne rzeczy, próbując połączyć następny, jeśli poprzednie zawiedzie. Oznacza to, że jeśli wszystkie próby połączenia zakończą się niepowodzeniem, może to zająć dużo czasu.

Aby przetestować tę teorię, spróbuj użyć

Sequencer sekwencer = MidiSystem.getSequencer (false);

i zobacz, czy linia ta zadziała szybciej, jeśli tak, to czas potrzebny na połączenie z domyślnym syntezatorem.

Dzwoniąc getSequencer() serię zdarzeń są

  1. uzyskać domyślny Sequencer podłączony do urządzenia domyślnego
  2. zwrócony Sequencer jest podłączony do domyślnych Syntezator ...
  3. jeśli nie ma Syntezator dostępne lub domyślnie nie można otworzyć połączenia z domyślnym odbiornikiem. Połączenie jest nawiązywane poprzez pobranie instancji nadajnika z Sequencer i ustawienie jej jako odbiornika.

Ten tekst jest niemal dosłowny, co znajduje się w javadoc, ale jak widać, jest wystarczająco dużo prób tworzenia połączeń, aby wywołanie było nieco powolne.

Powiązane problemy