BasicPlayer - Beendigung Abfragen (Allgemein)

chuxXo

Bekanntes Mitglied
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:
Java:
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
 
Sowas?
Java:
  // ...
  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.
 
Zuletzt bearbeitet:
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.
 
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:

Java:
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:
Java:
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 !!!
 
Zuletzt bearbeitet:
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?
 
Zuletzt bearbeitet:
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 !!!
 
Zuletzt bearbeitet:
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.

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.


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)
 
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 ?
 
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.

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 🙂
 
Zuletzt bearbeitet:
"objektorientierte Programmierung" - Das wollte ich hören 😉 schau ich mir an !


Alles klar. Das ist ja perfekt !

Du meinst das hier ? 🙂
Java:
/**
 * 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 ?
 
Zuletzt bearbeitet:
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.
 
Zuletzt bearbeitet:
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:
Java:
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:
Java:
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 ?
 
Zuletzt bearbeitet:
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.
 
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 :
Java:
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 ?
 
Zuletzt bearbeitet:
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.

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

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


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

Nur welche Parameter erwartet er ?

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.
 
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
 
Zuletzt bearbeitet:
Java:
public [DEINE LISTENERKLASSE] extends ....... {
}

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

Wo lag/liegt da genau das Problem?
 
Ok, so soll das aussehen ...

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

Und hier wird dann folgende Methode ausgeführt ?!
Java:
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 ???
 
Zuletzt bearbeitet:
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.
 
Vielen Dank Joose 🙂 ! Hab es nun hinbekommen.
Irgendwelche Verbesserungsvorschläge ???

Java:
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 😀
 

Zurück
Oben