# BasicPlayer - Beendigung Abfragen (Allgemein)



## chuxXo (30. Okt 2014)

Hallo liebes Forum,

ich steh erneut auf dem Schlauch. Und zwar bin ich wohl einfach zu dumm den BasicPlayer abzufragen, wann er fertig ist. Es geht um folgendes:
Generated Documentation (Untitled)
Dort wird mir ja die Möglichkeit gegeben, "PLAYING" abzufragen (.getStatus). Das funktioniert ja auch.
Mir wird dann einer der folgenden Parameter zurückgegeben:

```
public static final int	OPENED	3
public static final int	PAUSED	1
public static final int	PLAYING	0
public static final int	SEEKING	4
public static final int	STOPPED	2
public static final int	UNKNOWN	-1
```

Jetzt hätte ich in meiner Anweisung, in der ich das Lied starte nur ein Befehl, der quasi so lange wartet, bis ein Parameter zurückgegeben wird, der in diesem Fall "2" entspricht und während dieser noch "0" ist, nichts unternimmt bzw. nicht weiter im Programm geht.
Wie setzt man sowas um ???
(Danach wird geschaut ob in der Playlist, in meinem Fall eine ArrayList, noch eine Position zu spielen gibt und wenn ja, diese beginnt)

Ich wäre euch echt sehr dankbar, wenn ihr gute Ratschläge für mich hättet, da ich echt auf keinen grünen Zweig komm und mein Programm eigentlich daran scheitert ;(

Ich hätte daran gedacht einen Thread zu starten, der dies ab frägt. Mit dem Befehl ".join()" wäre mein  Programm ja auch so lange pausiert, bis dieser beendet ist. Jedoch weiß ich nicht wie ich die Abfrage gestalte, ohne eine Endlosschleife zu erstellen ?!

Ich hoffe ihr könnt mir soweit folgen. Freue mich auf eure Antworten.
mfg
chuxXo


----------



## arilou (30. Okt 2014)

Sowas?
	
	
	
	





```
// ...
  while( myPlayer.getStatus() == BasicPlayer.PLAYING )
  { try{
    Thread.sleep( 100 ); // 0.1 s warten
    } catch( InterruptedException iE ) { ; }
  } // end while
  // ...
```
-> fragt 10* pro Sekunde ab, ob da noch was spielt. Und Thread.sleep wartet non-busy.


----------



## Joose (30. Okt 2014)

Um ein Lied abzuspielen sollte dein Programm einen eigenen Thread starten, dieser Thread läuft dann einfach solange das Lied halt geht
Dein Programm wartet in der Zwischenzeit auf eine Useraktion (Stop, Pause, nächstes Lied, usw.) oder bis der Liedthread beendet (Lied fertig ist und das nächste wird gestartet) ist.

Du brauchst dein Programm nicht "pausieren" indem du mit "join()" arbeitest. 
Um ein Lied zu starten musst du ein bestimmtes Event auslösen, dann wird eben ein extra Thread gestartet welcher das Lied abspielt. Danach wartet dein UI auf ein weiteres Event solange hier keins kommt macht dein Programm nichts außer dem Lied abspielen.


----------



## chuxXo (30. Okt 2014)

Hört sich alles schon mal nicht schlecht an 
bei arilou bin ich mir nicht sicher ob das der feine Weg ist...

Joose, mein Problem ist, dass ich wenn ich zum Beispiel folgendes mach:


```
static BasicPlayer player = new BasicPlayer();
static BasicController control = (BasicController) player;
control.play();
```

Ich nicht weiß wo der Thread "play" läuft. ich komm einfach nicht dahinter.
Den könnte ich ja kontrollieren.

Bei mir sieht das ja so aus:

```
static BasicPlayer player = new BasicPlayer();
static BasicController control = (BasicController) player;
public static void play(String filename)
{
	try
	{			
		// Open file, or URL or Stream (shoutcast) to play.
		control.open(new File(filename));

		// Start playback in a thread.
		control.play();
			
		// Set Volume (0 to 1.0).
		// setGain should be called after control.play().
		control.setGain(0.85);
			
		// Set Pan (-1.0 to 1.0).
		// setPan should be called after control.play().
		control.setPan(0.0);
	}
	catch (BasicPlayerException e)
	{
		e.printStackTrace();
	}
}	
		
public static int getStatus(){
int status = player.getStatus();	
return status;
}
```

Ich mach jetzt erst seit einem Monat ungefähr Java und muss mir mein Wissen selbst irgendwie aneignen. Aber das hier verwirrt mich, wenn man das so ausdrücken möchte :lol:

Was mich sehr freuen würde, ist, wenn sich das noch jemand anschauen könnte und mir eventuell einen Tipp geben könnte, wie ich das dort erweitern kann. Ich verlange nicht nach Code 

Aber Danke für eure Hilfe bis jetzt !!!


----------



## Joose (30. Okt 2014)

chuxXo hat gesagt.:


> Ich mach jetzt erst seit einem Monat ungefähr Java und muss mir mein Wissen selbst irgendwie aneignen. Aber das hier verwirrt mich, wenn man das so ausdrücken möchte :lol:



Hier liegt auch eines der Probleme 
Viele wollen Java lernen und setzen sich dann immer schneller viel zu hohe Ziele und sind dann frustriert wenn es nicht klappt.
Daher mein Tipp einfach langsam an etwas ranwagen: Teile dein Problem in kleine Stücke auf soweit es geht!

Leider verwendest du oft "static" was schon ein Anzeichen davon ist das OOP noch nicht sitzt, und geübt gehört. Daher wird es schwer dir den richtigen Weg zu zeigen.

EDIT: Außerdem finde ich zu der Klasse "BasicPlayer" keinen Source, ist das eine deiner Klasse oder vom einer Bibliothek?


----------



## chuxXo (30. Okt 2014)

Du hast schon Recht!
Aber nur wenn ich mir so Hohe ziele steck, lern ich dazu.
Das mit dem "static" ist mir auch schon aufgefallen, aber ich weiß noch nicht so genau wie man das umgehen kann.

Die BasicPlayer APi kannst du hier herunterladen:
jlGui - BasicPlayer - JavaSound API

Dort ist dann die Bibliothek und der BeispielPlayer drin, den ich verwendet hab und durch play, paus,... etc erweitert hab.

Ich hoff so dazu zu lernen, außerdem brauch ich das Programm  Mein Vater hat ein identisches vor Jahren auf OS2 geschrieben, welches aber natürlich nicht auf Windows etc läuft. Aber genau das wird benötigt 

danke für deine Hilfe !!!


----------



## Joose (30. Okt 2014)

chuxXo hat gesagt.:


> Du hast schon Recht!
> Aber nur wenn ich mir so Hohe ziele steck, lern ich dazu.



Jein, das Problem ist das viele dann meist ein Programm mit GUI entwicklen wollen bzw. ein Spiel.
Und während der Entwicklung müssen sie sich "Threads", UI und OOP aneignen.
Besser wäre es zuerst einmal nur Dummy Threads mit Konsolenausgaben zu testen usw., eine GUI mit Event hier und Event da.
Danach kann man versuchen diese beiden Sachen zu kombinieren usw.



chuxXo hat gesagt.:


> Das mit dem "static" ist mir auch schon aufgefallen, aber ich weiß noch nicht so genau wie man das umgehen kann.



Indem man OOP übt und anwendet 
Und auch diese lässt sich leichter üben indem man mit Konsolenanwendungen beginnt.




chuxXo hat gesagt.:


> jlGui - BasicPlayer - JavaSound API
> Dort ist dann die Bibliothek und der BeispielPlayer drin, den ich verwendet hab und durch play, paus,... etc erweitert hab.



Habe kurz in die Sourcen geblickt:
Die Klasse BasisPlayer hat ein Attribut "m_thread" vom Type "Thread" diese ist protected.
Sprich erweiter die Klasse BasisPlayer und schreibe eine Method "getThread()" welche dir "m_thread" zurückgibt.
Schon kannst du das Threadobjekt direkt prüfen. (Falls du es wirklich benötigst)


----------



## chuxXo (30. Okt 2014)

Wohl wahr. Hab aber auch mit einfachen Konsolenprogrammen angefangen, bis ich dazu eine grafische Oberfläche machen wollte bzw. nachschauen wollte, wie man das umsetzt.

Mein Programm benötigt leider eine GUI, da über ein Touchpanel Zeichen eingegeben werden.
Ein Tipp dazu, wie man static vermeiden kann ?! Was muss ich machen, dass das nicht mal in Frage kommt ?


Danke, werde direkt mal reinschauen, wenn ich daheim bin.
Da du die Sourcen gesehen hast, wie würdest du das ganze umsetzten um zu warten, bis ein Lied fertig abgespielt ist ? Irgendeine Idee oder eine Methode, die man verwenden könnte ?


----------



## Joose (30. Okt 2014)

chuxXo hat gesagt.:


> Mein Programm benötigt leider eine GUI, da über ein Touchpanel Zeichen eingegeben werden.
> Ein Tipp dazu, wie man static vermeiden kann ?! Was muss ich machen, dass das nicht mal in Frage kommt ?



Ja indem man auf objektorientierte Programmierung setzt 
Diese zu lernen und üben kann dir aber keiner abnehmen. Grundlagen, Infos und Tutorials dazu findest du zu genüge im Netz.



chuxXo hat gesagt.:


> Danke, werde direkt mal reinschauen, wenn ich daheim bin.
> Da du die Sourcen gesehen hast, wie würdest du das ganze umsetzten um zu warten, bis ein Lied fertig abgespielt ist ? Irgendeine Idee oder eine Methode, die man verwenden könnte ?



BasicPlayer bietet die Möglichkeit sich Events zu abonnieren.
Dann wirst du informiert wenn der Thread gestartet bzw. beendet wird usw.
Implementiere das Listener Interface und reagiere entsprechend auf die Events.

Dass ist nichts anderes als das ein Button ein Event wirft auf das du reagierst


----------



## chuxXo (30. Okt 2014)

"objektorientierte Programmierung" - Das wollte ich hören  schau ich mir an !


Alles klar. Das ist ja perfekt ! 

Du meinst das hier ? 

```
/**
 * Notification callback for basicplayer events such as opened, eom ...
 *  
 * @param event
 */
public void stateUpdated(BasicPlayerEvent event)
{
	// Notification of BasicPlayer states (opened, playing, end of media, ...)
	display("stateUpdated : "+event.getCode());
	if (event.getCode()==BasicPlayerEvent.STOPPED)
	{
		System.exit(0);
	}
}
```

oder sowas ähnliches?! Das muss ich ja aufrufen, damit ich eine Info erhalte. ActionListener oder wie das heißt meinst du ?
"player.addBasicPlayerListener(this);"
Das hier ?


----------



## chuxXo (31. Okt 2014)

Wäre nett, wenn man mir weiter helfen könnte !


----------



## Joose (31. Okt 2014)

Dasselbe wie gestern: Dein selbstgebastelte Playlist soll die Events vom Player abonnieren. Wenn du das entsprechende Event bekommst starte das nächste Lied usw.

Ohne entsprechender Eigeninitiative lassen sich wenige überzeugen dir zu helfen.


----------



## chuxXo (31. Okt 2014)

Ich hab Eigeninitiative...
ich hab schon einige Sachen über Events/Ereignisse durchgelesen, bzw ausprobiert.
Wer dadurch nur nicht ganz schlau.
Wenn ich etwas anwenden kann und dann sehe wie es funktioniert, ist das für mich die beste Lernmethode.

Ich probier schon seit 1,5 Stunden rum und mach immer wieder die Dokumentation auf, etc.
Ich raff es nicht.

zuerst brauch ich ja das hier:

```
BasicPlayerEvent

public BasicPlayerEvent(java.lang.Object source,
                        int code,
                        int position,
                        double value,
                        java.lang.Object desc)
Constructor
Parameters:
source - of the event
code - of the envent
position - optional stream position
value - opitional control value
desc - optional description
```

also mindestens source und code.

Das sieht dann bei mir so aus:

```
BasicPlayerEvent event;
int code = event.getCode();
// String source = ???
			
stateUpdated(event);


public void stateUpdated(BasicPlayerEvent event)
{
	System.out.println(event.toString());
	if (event.getCode()==BasicPlayerEvent.PLAYING)
	{
		System.out.println("Der Player hat angefangen zu spielen !");
	}
}
```

Wie komme ich "source"???
Ist das so richtig ??? Immer, wenn dann ein neues Lied spielt, bekomme ich eine Ausgabe ?


----------



## Joose (31. Okt 2014)

Falsch, der BasicPlayer "wirft" Events, diese sollst du abonnieren, nicht du Events erzeugen.

Dazu musst du deine Klasse das passende Listener Interface implementieren lassen (dadurch wirst die Klasse gezwungen Methoden zu implementieren). Diese Klasse registriert sich dann als Listener beim BasicPlayer.
"Hier und da" wirft der BasicPlayer ein Event und darüber werden alle Listener (auch deine Klasse) informiert.
Deine Klasse reagiert dann halt in überschriebenen Interface Methoden auf die Events.


----------



## chuxXo (31. Okt 2014)

Ok, soweit verstanden. Jetzt macht das auch Sinn, was in den Klassen steht.
Also quasi-
class Player implements BasicPlayerListener
so ???

Und wie kann ich mir das Event dann zu nutze machen ? Irgendein Beispiel, oder ein gutes Tutorial wo mich nicht gleich mit 100000 Begriffen auseinander nimmt  ? 

Wie bekomme ich vom Listener dann das hier :

```
public void stateUpdated(BasicPlayerEvent event);

    /**
     * A handle to the BasicPlayer, plugins may control the player through
     * the controller (play, stop, ...)
     * @param controller : a handle to the player
     */
```

Edit:
Das hab ich:
BasicPlayer player = new BasicPlayer();
player.addBasicPlayerListener();

Nur welche Parameter erwartet er ?


----------



## Joose (3. Nov 2014)

chuxXo hat gesagt.:


> Und wie kann ich mir das Event dann zu nutze machen ? Irgendein Beispiel, oder ein gutes Tutorial wo mich nicht gleich mit 100000 Begriffen auseinander nimmt  ?



Wie machst du dir das Event von einem MouseClick zu nutze oder einen Buttondruck? 
Es wird eine bestimmte Methode aufgerufen, welche als Parameter das Event übergeben bekommt.
Dieses Event hat dann bestimmte Informationen .... wie du diese nutzt und verarbeitest kommt ganz auf dich und dein Ziel an.



chuxXo hat gesagt.:


> Wie bekomme ich vom Listener dann das hier :
> 
> ```
> public void stateUpdated(BasicPlayerEvent event);
> ```



Eine deiner Klasse muss dieses Listener Interface implementieren 
Dann wirst du auch gezwungen diese Methode zu implementieren




chuxXo hat gesagt.:


> Edit:
> Das hab ich:
> BasicPlayer player = new BasicPlayer();
> player.addBasicPlayerListener();
> ...



Das kannst du ganz einfach in der Dokumentation bzw. dem Source dieser Klassen nachschauen was erwartet wird.
Eine Objekt einer Klasse, welche das ListenerInterface implementiert.


----------



## chuxXo (3. Nov 2014)

Verstanden soweit  Danke !

Hab mal mein "Inselbuch" aufgeschlagen und lies grad die Listeners durch.
Dort wird das ganze aber ganz anderst implementiert und Sachen importiert, die beim BasicPlayer nicht importiert werden. Sprich, die Events beim BasicPlayer sind anderst aufgebaut. Dazu fehlt mir wohl das benötigte Verständnis für Ereignisse. 
Das Wissen, werde ich mir noch aneignen  Nur ich würde jetzt gerne mein Programm fertig schreiben können und dafür benötige ich meinen EventListener. Ich hab schon rumprobiert, ich schaffs aber nicht einen Listener zu erstellen, der aktiviert wird, wenn Value geändert wird. 
Ich wäre dir für ein konkretes Beispiel, welches auf die Source des BasicPlayers bezogen ist sehr dankbar !!!

Würd mich freuen, wenn du, oder jemand anderes mir dabei behilflich sein könnte. 
Ich versteh den Zusammenhang zwischen dem Listener im Buch und dem des BasicPlayers nicht. Mit einem funktionierenden Beispiel wäre das sicher nicht der Fall.

Dank dir/euch.
mfg chuxXo


----------



## Joose (3. Nov 2014)

```
public [DEINE LISTENERKLASSE] extends ....... {
}

BasicPlayer player = new BasicPlayer();
player.addListener(new [DEINE LISTENERKLASSE]());
```

Wo lag/liegt da genau das Problem?


----------



## chuxXo (3. Nov 2014)

Ok, so soll das aussehen ...


```
public valuChange extends BasicPlayerListener {
     if (value == 2) ListenerTest.value();
}
```

Und hier wird dann folgende Methode ausgeführt ?!

```
public class ListenerTest{
     public value(){
     System.out.println("Value wurde geändert");
     }
}
```

Ich komm einfach nicht ganz dahinter. Mir ist das für mein bisheriges Wissen zu umständlich erklärt 
Wenn es ein einfach gehaltenes Beispiel dazu geben würde, zum beispiel wo jediglich eine Ausgabe gesteuert wird, wäre das für mich einfacher 

Aber ich hoff ich komm noch ganz dahinter... Sollte auch mal wieder "Java ist auch eine Insel" weiterlesen, aber möchte erst mein Projekt meistern, da ich es brauch 

Ich werde gleich mal nochmal ein bisschen testen 
Hoffe du kannst mir das ganze eventuell noch näher erläutern.

Vielen Dank für deine Hilfe !!!

EDIT: 
Achso, so wird das sicher nicht ausgeführt. Ich muss ja noch meinen Listener hinzufügen. Wie wird dann eine Methode ausgeführt sobald mein Listener anschlägt ???


----------



## Joose (3. Nov 2014)

chuxXo hat gesagt.:


> Wie wird dann eine Methode ausgeführt sobald mein Listener anschlägt ???



In dem du deine gewünschte Methode aufrufst?!


----------



## chuxXo (3. Nov 2014)

Na klar  Ich steh nur so dermaßen auf dem Schlauch, dass ich ich nicht weiß wohin mit der Methode ....
Naja... Ich probier mal weiter.


----------



## chuxXo (3. Nov 2014)

Vielen Dank Joose  ! Hab es nun hinbekommen.
Irgendwelche Verbesserungsvorschläge ???


```
import java.io.File;
import java.util.Map;

import javazoom.jlgui.basicplayer.BasicController;
import javazoom.jlgui.basicplayer.BasicPlayer;
import javazoom.jlgui.basicplayer.BasicPlayerEvent;
import javazoom.jlgui.basicplayer.BasicPlayerException;
import javazoom.jlgui.basicplayer.BasicPlayerListener;


public class BasicPlayerTest implements BasicPlayerListener
{	

	BasicPlayer player = new BasicPlayer();
	BasicController control = (BasicController) player;
	public void playerDo(String filename, int action) throws BasicPlayerException
	{	
		
		/*
		 * 0 = pause
		 * 1 = resume
		 * 2 = play
		 * 3 = stop
		 * 
		 */
		
		
	switch (action){
			case 0:
			{
				System.out.println("try pause");
				control.pause();
				break;
			}
			
			case 1:
			{
				System.out.println("try resume");
				control.resume();
				break;
			}
			
			case 2:
			{
				System.out.println("try play");
				player.removeBasicPlayerListener(this);
				player.addBasicPlayerListener(this);
				control.open(new File(filename));
				control.play();
				control.setGain(0.85);
				control.setPan(0.0);	
				break;
			}
			
			case 3:
			{
				System.out.println("try stop");
				control.stop();
				break;
			}
		}
	}
		
	
	public void stateUpdated(BasicPlayerEvent event)
	{
		if (event.getCode()==BasicPlayerEvent.PLAYING)
		{
			System.out.println("SPIELT");
		}
		else if (event.getCode()==BasicPlayerEvent.STOPPED)
		{
			System.out.println("GESTOPPT");
		}
		else if (event.getCode()==BasicPlayerEvent.PAUSED)
		{
			System.out.println("PAUSIERT");
		}
		else if (event.getCode()==BasicPlayerEvent.RESUMED)
		{
			System.out.println("FORTGESETZT");
		}
	}
}
```

Endlich


----------

