brak dzwięku podczas wykonywania programu Java

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
johny
Piegowaty Guziec
Piegowaty Guziec
Posty: 5
Rejestracja: 01 mar 2006, 20:52
Płeć: Mężczyzna
Wersja Ubuntu: 8.04
Środowisko graficzne: GNOME
Kontakt:

brak dzwięku podczas wykonywania programu Java

Post autor: johny »

Cześć.Jestem w trakcie nauki programowania w języku Java. W ksiażce napotkałem na mały problem: Kompilacja programiku przebiega pomyslnie, program powinien odtworzyć jakiś dzwięk. Jednak podczas wykonywania nic nie odtwarza, a w terminalu pojawiają się to co poniżej.Mam Ubuntu 8.04 i zainstalowaną java-6-jdk. Byłbym wdzięczny za pomoc w rozwiązaniu problemu.
Terminal:

Kod: Zaznacz cały

java.lang.IllegalArgumentException: No line matching interface SourceDataLine supporting format PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian is supported.
	at javax.sound.sampled.AudioSystem.getLine(AudioSystem.java:476)
	at javax.sound.sampled.AudioSystem.getSourceDataLine(AudioSystem.java:604)
	at com.sun.media.sound.SoftSynthesizer.open(SoftSynthesizer.java:736)
	at com.sun.media.sound.SoftSynthesizer.open(SoftSynthesizer.java:718)
	at com.sun.media.sound.SoftSynthesizer.getReceiverReferenceCounting(SoftSynthesizer.java:983)
	at javax.sound.midi.MidiSystem.getSequencer(MidiSystem.java:431)
	at javax.sound.midi.MidiSystem.getSequencer(MidiSystem.java:365)
	at MiniMiniMuzaAplk.graj(MiniMiniMuzaAplk.java:18)
	at MiniMiniMuzaAplk.main(MiniMiniMuzaAplk.java:8)

Program:

Kod: Zaznacz cały

import javax.sound.midi.*;


public class MiniMiniMuzaAplk {   
       
  public static void main(String[] args) {
    MiniMiniMuzaAplk mini = new MiniMiniMuzaAplk();
    mini.graj();
  }

  public void graj() {

    try {

      Sequencer sekwenser = MidiSystem.getSequencer();         
      sekwenser.open();
        
      Sequence sekw = new Sequence(Sequence.PPQ, 4);
      Track sciezka = sekw.createTrack();     

      MidiEvent zdarzenie = null;
      
      ShortMessage a = new ShortMessage();
      a.setMessage(144, 1, 44, 100);
      MidiEvent nutaP = new MidiEvent(a, 1); 
      sciezka.add(nutaP);

      ShortMessage b = new ShortMessage();
      b.setMessage(128, 1, 44, 100);
      MidiEvent nutaK = new MidiEvent(b, 16); 
      sciezka.add(nutaK);
        
      sekwenser.setSequence(sekw);

      sekwenser.start();
    } catch (Exception ex) {ex.printStackTrace();}
  } 
} 
Awatar użytkownika
DNADesigNed
Sędziwy Jeż
Sędziwy Jeż
Posty: 84
Rejestracja: 30 sie 2007, 17:01
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: LXDE
Architektura: x86
Kontakt:

Odp: brak dzwięku podczas wykonywania programu Java

Post autor: DNADesigNed »

Witaj, nie zamknąłeś na końcu sekwensera, dlatego pierwsze uruchomienie przebiegało bez wyjątków, natomiast każde następne uruchomienie wywoła ten wyjątek.

Ogólnie oznacza to, że w systemie nadal chodzi Ci jakiś proces Java'y z otwartym sekwenserem, który musisz zabić, żeby móc go ponownie wywołać. Top (albo htop) są tutaj bardzo pomocne. ;)

Spróbuj ten wariant, a wyjątek powinien przestać się pojawiać:

Kod: Zaznacz cały

    public void graj() {

        Sequencer sekwenser = null; //zmienna sekwensera umieszczona jest poza try...catch tak, aby dostępna była w całym bloku kodu

        try {

            sekwenser = MidiSystem.getSequencer();
            sekwenser.open();

            if (!sekwenser.isOpen()) { // sprawdzamy, czy sekwenser się otworzył
                throw new RuntimeException("Sekwenser nie jest otwarty!");
            }

            Sequence sekw = new Sequence(Sequence.PPQ, 4);
            Track sciezka = sekw.createTrack();

            MidiEvent zdarzenie = null;

            ShortMessage a = new ShortMessage();
            a.setMessage(ShortMessage.NOTE_ON, 1, 44, 100); // ShortMessage.NOTE_ON = 144 (zobacz JavaDoc klasy ShortMessage)
            MidiEvent nutaP = new MidiEvent(a, 1);
            sciezka.add(nutaP);

            ShortMessage b = new ShortMessage();
            b.setMessage(ShortMessage.POLY_PRESSURE, 1, 44, 100); // ShortMessage.POLY_PRESSURE = 128 (JavaDoc)
            MidiEvent nutaK = new MidiEvent(b, 8);
            sciezka.add(nutaK);

            sekwenser.setSequence(sekw);

            sekwenser.start();
            Thread.sleep(5000); //usypiamy proces na 5 sekund, tak żeby wszystko pofrunęło do sekwensera
            sekwenser.stop(); // i zatrzymujemy odtwarzanie

        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            if (sekwenser != null) { //jeżeli sekwenser został utworzony (a co za tym idzie: także otwarty)
                sekwenser.close(); // to zamykamy go i zwalniamy zajmowany przez niego zasób alsa/oss/whatever...
            }
        }
    }
Taka konstrukcja try..catch..finally gwarantuje Ci, że w momencie, gdyby coś poszło nie tak i program rzuciłby wyjątkiem po otwarciu sekwensera, to i tak na końcu sekwenser zostanie zamknięty, ponieważ block finally wykonuje się zawsze, nawet w przypadku wyjątku (nawet, jeżeli w bloku try dasz instrukcję return, to finally i tak się wykona). W przypadku poprawnego wykonania sekwenser po prostu zostanie zamknięty, a w przypadku, gdy nie uda się go stworzyć nic się nie stanie (po to ten if w bloku finally).
Pozdrawiam
Piotr "MoroS" Mrożek - http://dnadesign.pl/
johny
Piegowaty Guziec
Piegowaty Guziec
Posty: 5
Rejestracja: 01 mar 2006, 20:52
Płeć: Mężczyzna
Wersja Ubuntu: 8.04
Środowisko graficzne: GNOME
Kontakt:

Odp: brak dzwięku podczas wykonywania programu Java

Post autor: johny »

po zakonczeniu lektury wracam do problemow napotkanych po drodze;) rzeczywiście tym razem jest w porządku,po tej modyfikacji kodu programik wykonuje sie poprawnie za każdym razem . dzięki za pomoc:)
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 9 gości