Javazoom AdvancedPlayer

Tueftler

Mitglied
Hallo zusammen,
Wie verwende ich beim AdvancedPlayer die stop()-Methode richtig. Im folgenden Code wird der ganze Stream abgespielt und der anschließende stop führt dann natürlich zu einer Exception.
Java:
protected int offset = 0;
protected int repeatOnFrame=0; 
protected int mod=0;
new Thread()
        {
            public void run() {
                while(true){
                    try {
                        BufferedInputStream buffer = new BufferedInputStream(new FileInputStream(filename));
                        AdvancedPlayer player = new AdvancedPlayer(buffer);
                        player.setPlayBackListener(new PlaybackListener() {
                            @Override
                            public void playbackFinished(PlaybackEvent event) {
                                repeatOnFrame=offset;
                                offset = event.getFrame();
            
                            }
                        }); 
                        player.play(offset, Integer.MAX_VALUE);
                        if(mod==0)break;            // Start
                        else if(mod==1){            // Pause
                            mod=0;
                            player.stop();
                        }
                        else if(mod==2){            // Stopp
                            mod=0;
                            player.stop();
                            break;
                        } 
                        else{                        //Repeat
                            mod=0;
                            offset=repeatOnFrame;
                        }
                    } catch (JavaLayerException ev) {
                        ev.printStackTrace();
                    } catch (FileNotFoundException ev) {
                        ev.printStackTrace();
                    }
                }
            }
        }.start();
 

MoxxiManagarm

Top Contributor
Ich raffs nicht, wieso ist da eine Dauerschleife drum? Wenn du auf einen Start/Pause Knopf reagieren willst dann tu das mit entsprechenden Events und nicht mit einer Schleife die den Zustand von einem int abfragt und nebenbei noch wiederholt einen Stream öffnet
 

Tueftler

Mitglied
Na, so richtig hilfreich ist diese Art des Kommentars ja nicht, aber auch mit dem unten dargestellten Code bleibt die Frage dieselbe. Die Player-Api weist zwei Listener-Methoden aus (mehr hab ich nicht gefunden): playbackFinished und playbackStarted. Laut Api sorgt die Methode stop() für einen notify. Ich nehme an, das damit der interne Thread des Players einen interrupt erhalten soll und damit das Auslesen des Streams unterbrochen wird. Nur so, wie ich den stop verwende, wird nichts gestoppt. By the way: Die Methoden playerPause(), playerStopp() und playerRepeat() werden durch die Listener der Buttons aufgerufen.
Java:
public void play() {
        try {
            BufferedInputStream buffer = new BufferedInputStream(new FileInputStream(filename));
            player = new AdvancedPlayer(buffer);
            player.setPlayBackListener(new PlaybackListener() {
                @Override
                public void playbackFinished(PlaybackEvent event) {
                    repeatOnFrame=offset;
                    offset = event.getFrame();

                }
            }); 
            player.play(offset, Integer.MAX_VALUE);

        } catch (JavaLayerException ev) {
            ev.printStackTrace();
        } catch (FileNotFoundException ev) {
            ev.printStackTrace();
        }
    }    
    public void playerPause(){
        if(player != null){
            player.stop();
        }
    }
    public void playerStopp(){
        if(player != null){
            player.stop();
            offset=0;
        }
    }
    public void playerRepeat(){
        if(player != null){
            offset=repeatOnFrame;
            play();
        }
    }
 

MoxxiManagarm

Top Contributor
Sollte ja auch noch nicht hilfreich sein, konnte noch nicht helfen. Der 2. Code ist deutlich ersichtlicher.
So wie ich die Doku aber verstehe ist es wichtig play() in einem Thread aufzurufen, dann kannst du den Player auch stoppen.

Java:
new Thread() {
  public void run() {
   try {
    player.play(offset, Integer.MAX_VALUE);
   } catch (/* Welche Exceptions du auch immer fangen musst */) {   }
  }
}.start();
 

Tueftler

Mitglied
Sollte ja auch noch nicht hilfreich sein, konnte noch nicht helfen. Der 2. Code ist deutlich ersichtlicher.
So wie ich die Doku aber verstehe ist es wichtig play() in einem Thread aufzurufen, dann kannst du den Player auch stoppen.

Java:
new Thread() {
  public void run() {
   try {
    player.play(offset, Integer.MAX_VALUE);
   } catch (/* Welche Exceptions du auch immer fangen musst */) {   }
  }
}.start();
Danke für den Tipp. Hab tatsächlich den stopp innerhalb des Threads aufrufen wollen, geht natürlich nicht.
 

Christopher25

Bekanntes Mitglied
Na, so richtig hilfreich ist diese Art des Kommentars ja nicht, aber auch mit dem unten dargestellten Code bleibt die Frage dieselbe. Die Player-Api weist zwei Listener-Methoden aus (mehr hab ich nicht gefunden): playbackFinished und playbackStarted. Laut Api sorgt die Methode stop() für einen notify. Ich nehme an, das damit der interne Thread des Players einen interrupt erhalten soll und damit das Auslesen des Streams unterbrochen wird. Nur so, wie ich den stop verwende, wird nichts gestoppt. By the way: Die Methoden playerPause(), playerStopp() und playerRepeat() werden durch die Listener der Buttons aufgerufen.
Java:
public void play() {
        try {
            BufferedInputStream buffer = new BufferedInputStream(new FileInputStream(filename));
            player = new AdvancedPlayer(buffer);
            player.setPlayBackListener(new PlaybackListener() {
                @Override
                public void playbackFinished(PlaybackEvent event) {
                    repeatOnFrame=offset;
                    offset = event.getFrame();

                }
            });
            player.play(offset, Integer.MAX_VALUE);

        } catch (JavaLayerException ev) {
            ev.printStackTrace();
        } catch (FileNotFoundException ev) {
            ev.printStackTrace();
        }
    }  
    public void playerPause(){
        if(player != null){
            player.stop();
        }
    }
    public void playerStopp(){
        if(player != null){
            player.stop();
            offset=0;
        }
    }
    public void playerRepeat(){
        if(player != null){
            offset=repeatOnFrame;
            play();
        }
    }
Du solltest bei streams immer darauf achten diese auch zu schließen nach dem bearbeiten.
Ein Stream sollte auch immer nur einmal benutzt werden und nicht wiederverwendet werden.
Probiere mal die autoclose funktionalität von java8 aus welche du ja direkt mit dem try-keyword benutzt ;)
oder passiert das in der AdvancedPlayer class?
 

Ähnliche Java Themen


Oben