Hallo zusammen,
arbeite mich gerede in die Web Programmierung ein und stehe bei einem Projekt vor folgendem Problem:
Projektvorstellung:
Es handelt sich ein Frontend für einen Musik-Player.
Mittels des Frontend soll ein eine Server Applikation gsteuert werden, welche sich per PHP ansprechen lässt.
Die Serverapplikation heist mpd (Music - Player - Daemon) welche die Wiedergabe von Musikdateien übernimmt, ohne jede GUI Ausgabe.
Das Frontend läuft auf einem Hardware Streaming Client (popcorn hour) welcher einen integrierten Browser sowie integrierten Webserver mit stark eingeschränkten Fähigkeiten hat.
- Kein Ajax
- kein Java
- reduziertes Javascript
- keine Frames
Nun zu meinem Problem:
mpd hat keinen notifier zum status der Applikation, man muss also den status jedesmal neu "pollen". Wenn man also ein Musikstück abspielt, kann man die aktuelle Spielzeit des Stückes nur durch regelmäßiges pollen herausbekommen (1.24 von 3:12).
Um dieses pollen zu vermeiden, setze ich beim Laden der Seite einen Javascript timer (sekündlich), welcher mir die Spielzeit hochzählt und auf dem Bildschirm anzeigt.
Da ich die Gesamtlänge des Stückes erst nach dem Start des Stückes herausbekomme, starte ich erst das Abspielen des Musikstückes, polle mir dann die Zeiten von mpd, (alles php) und trage dann dann die Zieten per php echo in die entsprechenden Javascript Variablen ein.
Dann starte ich den Timer innerhalb des html codes.
Das funktioniert auch alles! aber....
Das Musikstück beginnt zu spielen, bevor die Seite angezeigt wird. Wenn die Seite angezeigt und der Timer beginnt, sind schon 2-3 Sekunden vergangen, sodaß die angezeigte Zeit asynchron zum Musikstück ist.
Ich brauche aber die Zeiten des Musikstückes, welche ich erst nach Start des Abpielen bekomme, um den Timer zu initialiseren.
Bin kein PHP javascript Geek, vielleicht fehlen mir da ein paar Grundlagen , wie z.B. starten einer PHP Funktion aus Javascript, o.ä.
Ich hoffe, ich habe das halbwegs Verständlich erklärt und würde mich über antworten freuen.
Anbei ein Code Fragment:
arbeite mich gerede in die Web Programmierung ein und stehe bei einem Projekt vor folgendem Problem:
Projektvorstellung:
Es handelt sich ein Frontend für einen Musik-Player.
Mittels des Frontend soll ein eine Server Applikation gsteuert werden, welche sich per PHP ansprechen lässt.
Die Serverapplikation heist mpd (Music - Player - Daemon) welche die Wiedergabe von Musikdateien übernimmt, ohne jede GUI Ausgabe.
Das Frontend läuft auf einem Hardware Streaming Client (popcorn hour) welcher einen integrierten Browser sowie integrierten Webserver mit stark eingeschränkten Fähigkeiten hat.
- Kein Ajax
- kein Java
- reduziertes Javascript
- keine Frames
Nun zu meinem Problem:
mpd hat keinen notifier zum status der Applikation, man muss also den status jedesmal neu "pollen". Wenn man also ein Musikstück abspielt, kann man die aktuelle Spielzeit des Stückes nur durch regelmäßiges pollen herausbekommen (1.24 von 3:12).
Um dieses pollen zu vermeiden, setze ich beim Laden der Seite einen Javascript timer (sekündlich), welcher mir die Spielzeit hochzählt und auf dem Bildschirm anzeigt.
Da ich die Gesamtlänge des Stückes erst nach dem Start des Stückes herausbekomme, starte ich erst das Abspielen des Musikstückes, polle mir dann die Zeiten von mpd, (alles php) und trage dann dann die Zieten per php echo in die entsprechenden Javascript Variablen ein.
Dann starte ich den Timer innerhalb des html codes.
Das funktioniert auch alles! aber....
Das Musikstück beginnt zu spielen, bevor die Seite angezeigt wird. Wenn die Seite angezeigt und der Timer beginnt, sind schon 2-3 Sekunden vergangen, sodaß die angezeigte Zeit asynchron zum Musikstück ist.
Ich brauche aber die Zeiten des Musikstückes, welche ich erst nach Start des Abpielen bekomme, um den Timer zu initialiseren.
Bin kein PHP javascript Geek, vielleicht fehlen mir da ein paar Grundlagen , wie z.B. starten einer PHP Funktion aus Javascript, o.ä.
Ich hoffe, ich habe das halbwegs Verständlich erklärt und würde mich über antworten freuen.
Anbei ein Code Fragment:
PHP-Code:
<HTML>
// HTM CSS zeugs hier
<?php
// Hier ist einiges Zeugs wie Datenbank abfragen (entfernt)
//
$mpd_time=0;
$mpd_playtime=60;
startPlay($mpdplay,$songs,$songid,$mpc);
getPlayTime($mpd_status,$mpd_playtime,$mpd_time,$mpc);
function startPlay(&$mpdplay,$songs,$songid,$mpc)
{
if($mpdplay==1)
{
$fp = fopen ( '/opt/sybhttpd/localhost.drives/HARD_DISK/Music/umcmusic2.m3u', 'w' );
fputs ($fp,'/share/'.substr($songs[$songid]['pchPath'],49));
fclose ($fp);
exec($mpc.' clear');
exec($mpc.' consume=1');
exec($mpc.' single=1');
exec($mpc.' load umcmusic2');
exec($mpc.' play 0');
$mpdplay=0;
}
}
function secondsFromTimeString($timestring)
{
$tokens=array('0');
$token = strtok ($timestring, ':' );
while ( $token)
{
array_push($tokens,$token);
$token = strtok(':');
}
return 1*$tokens[1]*60+$tokens[2];
}
function getPlayTime(&$mpd_status,&$mpd_playtime,&$mpd_time,$mpc)
{
exec($mpc,$status);
$mpd_status="";
if (count($status)>1)
{
$tokens=array('0');
$token = strtok ($status[1], ' ' );
while ( $token)
{
array_push($tokens,$token);
$token = strtok(' ');
}
$mpd_status=$tokens[1];
$tokens2=array('0');
$token = strtok ($tokens[3], '/' );
while ( $token)
{
array_push($tokens2,$token);
$token = strtok('/');
}
$mpd_time=secondsFromTimeString($tokens2[1]);
$mpd_playtime=secondsFromTimeString($tokens2[2]);
}
if ($mpd_playtime==0)
$mpd_playtime=60;
}
?>
<script type="text/javascript">
var count;
var starttime=<?php echo $mpd_time; ?>;
var endtime=<?php echo $mpd_playtime; ?>;
var a;
var bRepeat=0;
var sStatus="<?php echo $mpd_status; ?>";
function init_page()
{
<?php
$Artist=rawurlencode($songs[$songid]['Artist']);
$AlbumTitle=rawurlencode($songs[$songid]['AlbumTitle']);
$Title=rawurlencode($songs[$songid]['Title']);
$Year=rawurlencode($songs[$songid]['PRODUCT_YEAR']);
$pchPath=rawurlencode($songs[$songid]['pchPath']);
$Info2="";
$AlbumPicturePrefix=rawurlencode($songs[$songid]['AlbumPicturePrefix']);
$AlbumBackDropPrefix=rawurlencode($songs[$songid]['AlbumBackDropPrefix']);
echo "showSong(".$songid.",\"".$Artist."\",\"".$AlbumTitle."\",\"".$Title."\",\"".$Year."\",\"".$pchPath."\",\"".$Info2."\",\"".$mpd_playtime."\",\"".$AlbumPicturePrefix."\",\"".$AlbumBackDropPrefix."\");";
?>
}
function counter()
{
if((starttime-1) >= endtime)
{
starttime=0;
SendCommand("nextsong");
return;
}
if (sStatus=="[playing]")
{
document.getElementById("time").firstChild.nodeValue = time_to_string(starttime++);
a = window.setTimeout('counter()', 1000);
}
}
function time_to_string(time)
{
var mins=0;
var secs=0;
if (time > 60)
{
mins = Math.floor(time/60);
secs = time - (mins *60);
}
else
{
secs = time;
}
if (mins < 10)
{
mins = "0" + mins;
}
if (secs < 10)
{
secs = "0" + secs;
}
return mins + ":" + secs;
}
// weterer Javascript - Code....
Kommentar