tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
2
ZUGRIFFE
208
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Flokati Flokati ist offline Rookie
    Registriert seit
    May 2004
    Beiträge
    9
    Hi!

    Ich möchte gerne etwas Sound in meinem Programm abspielen.
    Klappt leider noch nicht so ganz, wie ich mir das vorstelle. Ich kann ca. eine halbe Sekunde was hören und dann ist finito.
    Das Problem ist wohl, das das Programm beendet wird, bevor das Sound komplett abgespielt wurde.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    
    import java.applet.Applet;
    import java.applet.AudioClip;
    import java.io.File;
     
    public class PlaySound extends Thread {
     
      public static void main(String[] args) throws InterruptedException {
        PlaySound playSound = new PlaySound();
        playSound.start();
      }
     
      public void run() {
        // Sound File
        String file = "Ee_rev.wav";
        String path = "C:\\WINDOWS\\Media\\";
        String soundFileName = path + file;
        File soundFile = new File(soundFileName);
     
        // play Sound
        try {
          AudioClip sound = Applet.newAudioClip(soundFile.toURL());
          sound.play();
        } catch (Exception tmpE) {
          System.err.println(tmpE);
        }
      }
    }

    Ich vermute mal, das ich am Ende meiner main()-Methode einfach nur einen Befehl a la "Warte, bis alle Threads beendet sind" einbauen muss.
     

  2. #2
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    Dann tue es doch einfach. Schleife rein und immer abfragen. Aber ich würde das eigendlich am Ende der Run machen, bzw. dafür nichtmal einen Thread verwenden. Ich habe bis jetzt nur einen Sequenzer für diese Aufgabe genommen, da lautet die Methode .isRunning() (wer hätts gedacht?).
    Allerdings ist Musik doch immer ein Thread, oder? Wäre doch blöd wenn nicht.
    Also sollte es meines erachtends automatisch gehen.

    Zitat Zitat von JavaDoc
    isRunning
    boolean isRunning()
    Indicates whether the Sequencer is currently running. The default is false. The Sequencer starts running when either start() or startRecording() is called. isRunning then returns true until playback of the sequence completes or stop() is called.

    Returns:
    true if the Sequencer is running, otherwise false

    Die Methode, die ich immer verwende:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    
    package title;
     
    import java.io.File;
     
    import javax.sound.midi.MidiSystem;
    import javax.sound.midi.Sequencer;
    import javax.swing.JOptionPane;
     
    public final class Musikplayer extends Object
    {
        private boolean playable;
        private Sequencer sequencer;
        
        public Musikplayer(String s)
        {
            super();
            
            this.playable = false;      
            this.sequencer = this.getSequencer();
     
            if(this.sequencer == null)
                return;
            this.sequencer = this.openAndLoad(s, this.sequencer);
        }
        public final void startPlay(Float tempoRate)
        {
            if(!this.playable)
                return;
            this.sequencer.setTempoFactor(tempoRate);
            this.sequencer.start();
        }
        
        private final Sequencer getSequencer()
        {
            Sequencer sequencer = null;
            
            try
            {
                sequencer = MidiSystem.getSequencer();
            }
            catch(Exception e)
            {
                JOptionPane.showMessageDialog(null,
                        "Konnte Midi-Sequencer nicht intialisieren.\n" +
                        "Es wird keine Musik gespielt werden.",
                        "Warnung",
                        JOptionPane.WARNING_MESSAGE);
            }
            return(sequencer);
        }
        private final Sequencer openAndLoad(String s, Sequencer sequ)
        {
            try
            {
                sequ.open();
            }
            catch(Exception e1)
            {
                JOptionPane.showMessageDialog(null,
                        "Konnte Midi-Sequencer nicht öffnen.\n" +
                        "Es wird keine Musik gespielt werden.",
                        "Warnung",
                        JOptionPane.WARNING_MESSAGE);
                return(null);
            }
            
            File f = new File(s);
            
            if(!f.exists())
            {
                JOptionPane.showMessageDialog(null,
                        "Konnte Datei " + s + " nicht finden.\n" +
                        "Programm wird nun beendetet.",
                        "Fehler",
                        JOptionPane.ERROR_MESSAGE);
                System.exit(0);
            }
            
            try
            {
                this.sequencer.setSequence(MidiSystem.getSequence(f));
            }
            catch(Exception e)
            {
                JOptionPane.showMessageDialog(null,
                        "Konnte Musikdatei nicht laden\n" +
                        "Es wird keine Musik gespielt werden.",
                        "Warnung",
                        JOptionPane.WARNING_MESSAGE);
                return(null);
            }
            
            this.playable = true;
            return(sequ);
        }
    }

    Wie man prüft ob alle Threads beendet sind weiß ich nicht, man könnte event. einen globalen Counter am Beginn der run() hochzählen, und am Ende wieder abziehen.
    Aber ich bin immer davon ausgegangen, dass ein Programm erst beendet, wenn alle Threads, die keine Dämone sind beendet wurden.
    Geändert von Kai008 (18.02.09 um 06:11 Uhr)
     

  3. #3
    Flokati Flokati ist offline Rookie
    Registriert seit
    May 2004
    Beiträge
    9
    Aber ich bin immer davon ausgegangen, dass ein Programm erst beendet, wenn alle Threads, die keine Dämone sind beendet wurden.
    Jepp, davon bin ich auch ausgegangen, aber anscheinend passiert hier irgendwas anderes.

    Ich habe meiner main() am Ende folgenden Code angefügt:
    Code :
    1
    2
    3
    
    while(playSound.isAlive()) {      
          Thread.sleep(1000);
        }
    Es sollte also jede Sekunde gecheckt werden, ob die Musik noch läuft und danach ist dann Ende.
    Tatsächlich läuft die Musik eine Sekunde und dann ist Schluß, obwohl der Sample länger als eine Sekunde ist.

    Ich lasse jetzt einfach stumpf 10 Sekunden warten, bevor das Programm beendet wird, das reicht, um den kleinen Soundschnippsel abzuspielen, ist aber natürlich keine "elegante" Lösung.
     

Ähnliche Themen

  1. Problem mit Thread
    Von arkel im Forum .NET Windows Forms
    Antworten: 2
    Letzter Beitrag: 19.10.07, 12:33
  2. Thread Problem
    Von yan1 im Forum .NET Windows Forms
    Antworten: 5
    Letzter Beitrag: 01.08.06, 17:42
  3. Thread Problem
    Von fh_study im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 21.02.05, 15:05
  4. Thread Problem
    Von fh_study im Forum VisualStudio & MFC
    Antworten: 1
    Letzter Beitrag: 19.02.05, 15:43
  5. Antworten: 19
    Letzter Beitrag: 12.07.02, 11:13