-         

Ergebnis 1 bis 10 von 10

Thema: mplayer-therad-umschaltung mit Taster aus C heraus !?

  1. #1

    mplayer-therad-umschaltung mit Taster aus C heraus !?

    Anzeige

    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) ?
    Code:
    #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");
      }
    }
    Geändert von alldroid (24.08.2016 um 18:57 Uhr)

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    321
    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

    Code:
    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

    Code:
    system("killall mplayer");
    von Nöten sein. Habe ich selbst aber nicht getestet. Denke aber das es so funktionieren könnte.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    46
    Beiträge
    765
    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'
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    321
    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.

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.415
    Python, die Riesenschlange (wahrscheinlich wegen dem Monsterbandwurmcode), nicht Phyton, das Plankton-Micropflänzchen
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    321
    Wer wird denn hier spitzfindig

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    30.12.2008
    Beiträge
    1.418
    $man mplayer siehe stichpunkt -input mplayer -input file= deineFIFo und dann wechselst du nur in deiner Playlist hin und her
    was gibt es noch zu sagen

  8. #8

    So einfach kann das sein ...

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

  9. #9
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    321
    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
    Geändert von hirnfrei (28.08.2016 um 12:02 Uhr)

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    46
    Beiträge
    765
    Hallo,

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

    Code:
    #!/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
    Geändert von peterfido (28.08.2016 um 11:29 Uhr)
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

Ähnliche Themen

  1. Light L16: Kompaktkamera mit 16 Objektiven fordert Spiegelreflexkameras heraus
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 08.10.2015, 12:20
  2. Einarmiger Roboter: Willow Garage bringt einen günstigeren PR2 heraus
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 11.08.2011, 11:20
  3. Hilfe...finde die fehler nicht heraus
    Von Kuwe im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 13
    Letzter Beitrag: 21.04.2010, 21:29
  4. RX TX Umschaltung
    Von cardhu im Forum Elektronik
    Antworten: 3
    Letzter Beitrag: 15.08.2008, 22:48
  5. Interrupt aus Interruptroutine heraus??
    Von Baui im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 06.05.2005, 16:15

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •