PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mplayer-therad-umschaltung mit Taster aus C heraus !?



alldroid
24.08.2016, 17:40
Ich möchte ein sehr simples Internetradio in C "bauen", das nur aus einem Taster am RPI besteht.
Dazu habe ich das folgende Programm geschrieben, das aus dem "Autostart" /etc/rc.local auch
gut läuft, aber eben nur mit der ertsne Radiostation radio1.pls .
Die Taster-Abfrage wird natürlich gar nicht erst durchgeführt, da das Programm im mplayer
festhängt (eine Tastatur für ^C soll nicht angeschlossen werden).

Wie kann ich (bin Linux- und RPI-Laie) einfach ohne jahrelanges Studium von Multithreading o.ä.
(Thread-Tippfehler im Thread-Titel ;) )
das Ganze mit der Programmweiterschalttaste zum Laufen bekommen (vielleicht kann jemand
sogar den Quelltext posten, wenn das nicht doch viel zu kompliziert ist) ?


#include <wiringPi.h>
#include <stdio.h>
int main() {
pinMode(5, INPUT);
while(1) {
system ("mplayer -playlist /home/pi/mplay/radio1.pls");
if(digitalRead(5)==1)
system ("mplayer -playlist /home/pi/mplay/radio2.pls");
if(digitalRead(5)==1)
system ("mplayer -playlist /home/pi/mplay/radio3.pls");
if(digitalRead(5)==1)
system ("mplayer -playlist /home/pi/mplay/radio4.pls");
if(digitalRead(5)==1)
system ("mplayer -playlist /home/pi/mplay/radio5.pls");
if(digitalRead(5)==1)
system ("mplayer -playlist /home/pi/mplay/radio6.pls");
}
}

hirnfrei
25.08.2016, 17:47
Klar bleibt das beim mplayer hängen. Ich weiss nicht genau ob es sich bei system() genau so verhält wie im Terminal, gehe aber davon aus. Entsprechend müsstest du



system ("mplayer -playlist /home/pi/mplay/radio1.pls &");


verwenden. Dann sollte mplayer gestartet werden ohne das Programm zu blockieren.

Nächstes Problem dürftest du dann aber haben, dass mit dem nächsten Aufruf einfach ein neuer mplayer gestartet wird und du auf einmal zwei laufen hast. Von daher wäre vorher ein Aufruf



system("killall mplayer");


von Nöten sein. Habe ich selbst aber nicht getestet. Denke aber das es so funktionieren könnte.

peterfido
25.08.2016, 18:43
Hallo,

eine solche Antwort wollte ich auch erst posten, finde das aber 'irgendwie' unsauber, da beim Killen evtl. der Audiopuffer ständig die letzte Sequenz abspielt. Also erst Tonaus, dann killen, dann mit neuem Stream starten, dann paar Millisekunden warten und dann Ton wieder an.

Ich nutze für Internetradio den MPD. Der lässt sich relativ einfach 'fernbedienen'

hirnfrei
25.08.2016, 22:21
Wirklich toll ist es in der Tat nicht und ich glaube auch unter Phyton kann man das besser lösen. Zumindest habe ich mal vor ein paar Jahren ein Programm in Phyton gesehen wo man über http den mplayer steuern kann. Habe auch schon geguckt, finde das Forum aber nicht mehr.

Richtig sauber wird es aber wohl erst, wenn man den Stream direkt aus dem Netz holt und dann im Programm selbst abspielt. Das ist aber auch ungleich mehr Aufwand.

HaWe
26.08.2016, 11:10
Python, die Riesenschlange (wahrscheinlich wegen dem Monsterbandwurmcode), nicht Phyton, das Plankton-Micropflänzchen ;)

hirnfrei
26.08.2016, 23:56
Wer wird denn hier spitzfindig ;)

Thomas$
27.08.2016, 09:31
$man mplayer siehe stichpunkt -input mplayer -input file= deineFIFo und dann wechselst du nur in deiner Playlist hin und her

alldroid
27.08.2016, 19:13
Danke an "hirnfrei" für den Tip mit dem & .
Klappt super!
(Man sollte eben nicht den ganzen Tag vor dem Windows-Rechner hängen sondern sich bei Zeiten auch
einmal in die Linux-Kommadozeilenoptionen einarbeiten...).
Und wenn der Audiobuffer nur temporär gespeichert wird und beim Neustart wieder leer ist,
sollte ja auch die SD-Karte auf Dauer nicht vollgeschrieben werden (werde das dauerhafte Verhalten beobachten;
Das was ich mit den Python-Scripten gefunden habe ist mir dann doch zu kompliziert; kann ja nur ansi-C ).

hirnfrei
27.08.2016, 23:34
Das was Thomas da geschrieben hat sollte dir aber auch weiter helfen.

PS: Ich hab mich früher durch einige Linux Varianten gequält. Fedora, SuSe usw. Die sind aber alle auf Windows getrimmt. Hauptsache nichts mehr tippen müssen. Bei jedem einzelnen Fehler musste ich mich dann durch irgendwelche Anleitungen quälen. Wirklich was gelernt hab ich dann aber auch erst als ich Gentoo installiert habe. Das installiert man komplett von Hand, hat am Schluss wirklich nur das was man haben will und lernt ziemlich viel. So etwas kann ich absolut empfehlen.

Das mit dem & habe ich allerdings auch aus einem Forum ;)

peterfido
28.08.2016, 11:22
Hallo,

ich habe mal etwas mit mplayer gespielt. Anbei ein kleines BASH-Script, wie man die Idee von Thomas$ nutzen könnte.


#!/bin/bash
cfile="/tmp/mplayctl" # FIFO-Datei
max=5 #Einträge in der 'Playlist'
vmax=100 #maximale Lautstärke, nicht Geschwindigkeit

#*****************************Playlist Beginn
r0="stop" # das gleiche wie quit. Da ist ein Fehler im MPlayer. Also nicht nutzen! Wird vom Script ignoriert! Pause könnte den RAM vollaufen lassen
r1="http://player.ffn.de/comedy.mp3"
r2="http://ndr-ndr2-nds-mp3.akacast.akamaistream.net/7/400/252763/v1/gnl.akacast.akamaistream.net/ndr_ndr2_nds_mp3"
r3="http://stream.laut.fm/just80s_maximal"
r4="http://player.ffn.de/ffn.mp3"
r5="http://188.94.97.91:80/radio21.mp3"
#*****************************Playlist Ende

sfile="/tmp/mplayscript" # Wird die gelöscht, wird das Script beendet
lfile="/tmp/playpos" # Position in der 'Playlist' Durch ein anderes Programm oder so befüllen
vfile="/tmp/playvol" # Lautstärke zwischen 0 und 100 Durch ein anderes Programm oder so befüllen

touch $sfile
echo "1" > $lfile
echo "75" > $vfile
posalt=1
volalt=75
if [ -e $cfile ]; then
rm $cfile
sleep 1
fi
mkfifo $cfile

mplayer -slave -input file=$cfile $r1 </dev/null >/dev/null 2>&1 & # Ohne Ausgaben
#mplayer -slave -input file=$cfile $r1 & # Mit Ausgaben

echo "set_property volume 75" > $cfile

while [ -e $sfile ] ; do
pos=$(cat $lfile)
vol=$(cat $vfile)
if [ $pos -le $max ] && [ $pos -gt 0 ]; then
if [ $pos != $posalt ]; then
posalt=$pos
adr=$(eval echo \$\{r${pos}\})
echo "Pos:$pos=$adr"
echo "loadfile $adr" > $cfile
fi
fi
if [ $vol -le $vmax ] && [ $vol -ge 0 ] ; then
if [ $vol != $volalt ]; then
volalt=$vol
echo "Lautst:$vol"
echo "set_property volume $vol" > $cfile
fi
fi
done
echo "quit" > $cfile
echo "Programm beendet!"
rm $cfile
exit