GPIO Schalten bei Audiowiedergabe

  • Hy,
    hätte da noch eine Kleinigkeit zu lösen.
    Ich benutze meinen RPI mit Airplay, Squeezebox und MPD und möchte mir ein shell script basteln damit sich mittels einem GPIO via solid state relay ein 230VAC Audioverstärker einschalte.


    Ich benutze eine exteren Soundkarte am rpi, da die Qualität der onboard-Karte etwas zu wünschen übrig lässt. Jetzt müsste das script ständig auf meine Soundkarte horchen und wenn da was ankommt sollte der GPIO schalten. Mein erster Zugang wäre irgendwie über ALSA aber wie kann man das lösen?


    Ich hoffe es gib Ideen!


    Vielen DANK!

    Edited once, last by Sevi ().

    • Official Post

    Moin, Moin,


    ich hatte einen ähnlichen Fall gelöst indem ich abgefragt habe ob "MPC" grad Musik abspielt und daraufhin einen GPIO Pin geschaltet.



    Gruß Alex

  • hy trek_star,
    Vielen DANK für deine Antwort. ist schon mal ein Anfang. jetzt müsste ich aber das gleiche vom Squeezebox und AirPlay play machen und wenn nun xbmc auch nocht dazukommt müsste ich wieder was hinzu programmieren. gibt es da nicht eine Universallösung mit ALSA oder irgendeinem anderem teil das lediglich auf die Soundkarte horcht? eigentlich weiß ich garnicht so genau wie das mit ALSA und AMIXER funktioniert :denker: gibts da schon irgend welche projekte oder hat schon mal jemand damit was gemacht?


    DANKE!
    [hr]
    hab jetzt mal etwas dr. goggle ran gelassen:
    http://wiki.ubuntuusers.de/amixer
    das war jetzt schon mal sehr informativ. wie kann ich mir nun ein script basteln das ständig auf AMIXER horcht....:denker:


    DANKE!

    Edited once, last by Sevi ().

  • Hallo


    schau dir mal mein screensaver_stopper script an. Müsstest es eingentlich genau das sein was du suchst.
    Müsstest dann nur noch das in einen Schleife packen.



    mfg

  • habe ich selbst geschrieben, da es mir am sack ging, das der screensaver anging wenn ich youtube oder anderes schaute


    mfg

  • Hey
    DANKE nochmal für deine Hilfe, hab aber ein problem..... ich bekomms nicht hin :daumendreh2:
    ich muss zugeben ich bin jetzt nicht der über drüber shell script bastler und benötige deine hilfe und fange einfach mal am script anfang an.


    was machst du mit dieser zeile? bzw. was bedeutet diese. ich nehme mal an das ich diese für meine anwendung etwas anpassen muss.



    Code
    if [ `arecord -f cd -d 1 -V mono /dev/null 2>&1 | grep -c 00%` -eq 0 ]


    Zur info ich habe das squeezeplug image am laufen.


    Vielen DANK!




    im moment:


    hab mich jetzt nochmal damit auseinander gesetzt. arecord ist das ALSA-tool auf der bedienoberfläche oder? ich arbeite aber in der Kommando zeile. funktioniert das auch ohne benienoberfläche? in der datei /dev/null seh ich jedenfalls nichts? oder bin ich total auf dem holzweg.....


    DANKE!

    Edited once, last by Sevi ().

  • Hallo zusammen,


    leider kann ich bei meinem problem noch keinen erfolg verbuchen, jedoch weiß ich jetzt das zusammenspiel der einzelnen Audio Komponenten am RPi


    die Audiowiedergabe funktioniert bei mir so:
    Soundquelle(MPD) -> ALSA-Treiber -> Hardware


    ich nehme ja nicht den weg über PulsAudio:
    Soundquelle(MPD) -> PulseAudio -> ALSA-Treiber -> Hardware


    Es gibt jedoch noch viele andere Methoden....... egal


    Meine Frage an das Forum - weiß jemand wie ich ALSA oder von mir aus auch PulsAudio mit einem shell abfrage auf aktiv verknüpfen kann?


    Ich muss sagen, dass meine shell erfahrung schon eine weile zurück liegt.


    DANKE!

  • hallo


    arecord nimmt deine Audioausgabe auf und liefert dir für 1sek eine vu-meter, der grep Befehl dient dann dazu ob 00% sich im String befindet wenn nicht findet eine Audioausgabe statt.


    aber du könntest auch mal diesen Befehl testen

    Code
    pactl list | grep -c RUNNING


    dieser Befehl liefert dir 0 wenn keine Soundausgabe stattfidnet & 1 wenn eine stattfindet zurück
    Das Problem mit Flash funkt. das ganze nicht, da Flash wenn einmal gestartet immer 1 zurück gibt, bis man den Tab/Fenster schließt--> für mein Vorhaben unbrauchbar


    mfg

  • hey I-Catch


    Danke für deine Antwort.
    hab mir das mal angesehen - dazu braucht man ja PulseAudio. Hab das jetzt mal Probiert aber leider funktioniert der befehl nicht es kommt dann <Verbindung verweigert>. hast du eine idee? Werde jetzt noch etwas herum probieren viell. bekomm ichs ja doch noch hin.


    Eine Frage noch zu arecord und zu deinem Projekt. Hab das mal probiert jedoch funktioniert der befehl auch nicht ich denke mal, dass ich eine externe Soundkarte brauche mit mic oder?


    DANKE!

  • Hallo!


    Genau dieses Thema habe ich vor einigen wochen schon mal angeschnitten, leider bis heute ohne erfolg... ^^


    Da ich selber noch blutiger Anfänger in sachen Linux bin, kann ich hier wohl wenig mithelfen, wer das ganze aber sehr aufmeksam verfolgen!


    Ich habe auch schon das skript von I-Catch ausprobiert, leider pekomme ich immer den Status "1" zurück, egal ob was läuft oder nicht...

  • Hey hannes,


    das bedeutet das bei dir das script funktioniert. ich denke, dass du da ein mic anschließen musst dann müsste eigentlich der gpio schalten. Ist für mich jedoch keine Lösung da man ja nur dann einen ton hat wenn der Verstärker läuft bzw. der gpio TRUE ist.

  • nein, denke nicht das hierfür ein mikro benötigt wird, da die Audioausgabe softwareseitig recordet wird.


    "Ist für mich jedoch keine Lösung da man ja nur dann einen ton hat wenn der Verstärker läuft bzw. der gpio TRUE ist."
    ----Wär ja bei mir genauso, auch ich möchte ja den amp schalten.


    Vielleicht wärs wirlich am besten ein Skript zu erstellen welches per "hairtunes" prüft ob shaiport läuft und per "mpc" prüft ob per MPD Musik abgespielt wird.


    Leider werd ich dies jedoch alleine nicht schaffen^^

  • Quote


    [font="Tahoma, Verdana, Arial, sans-serif"]nein, denke nicht das hierfür ein mikro benötigt wird, da die Audioausgabe softwareseitig recordet wird. [/font]


    bist du dir sicher? also wenn ich unter alsamixer nachsehe bewegt sich bei mir der balken mic kein wenig und wenn ich keine usb-soundkarte mit mikro eingang habe, bekomm ich noch nichtmal eine 1 retour. wenn die aufnahme wirklich softwareseitig ist müsste der gpio doch schalten.... :denker:


    Quote


    [font="Tahoma, Verdana, Arial, sans-serif"]Vielleicht wärs wirlich am besten ein Skript zu erstellen welches per "hairtunes" prüft ob shaiport läuft und per "mpc" prüft ob per MPD Musik abgespielt wird.[/font]


    Also ein script das zwischen MPD und Airplay umschaltet hab ich ja schon müsste dann nur noch einwenig modifiziert werden. Finde aber dennoch eine Abspielprogramm unabhängige lösung besser.


    Edited once, last by Sevi ().

  • Servus,


    ich nutze auch den Raspi u.a. als Internetradio.
    Irgendwann werde ich das Ganze mit Display, Menüsteuerung etc ausbauen. Dazu gibts ja genug Projekte die das dann über Python steuern und damit das Verstärkerschalten einfacher geregelt werden kann.
    Aber noch ist es nicht soweit und die kleinen Aktivboxen werden nach wie vor von Hand ein/ausgeschaltet.


    Auf dem Raspi läuft mpd, gesteuert wird übers Telefon mit dem Client MPDroid.


    Ich habe die Diskussion hier mit Interesse verfolgt und mich auch mal bisschen mit Shell Script beschäftigt. Ich würde das folgende Script mal als Lösung in den Ring werfen... :cool:


    Das macht Folgendes:


    • aus top wird die CPU-Usage von mpd 10 mal hintereinander auslesen
    • wenn von den 10 mindestens 8 Mal die Usage 0,0 ist, dann wird mpd nicht genutzt und der GPIO entsprechend low gesetzt. Das funktioniert gut, kann aber sein, dass das Relais ganz leicht verzögert anspricht. Kann man durch Anpasssung der Schleifendurchläufe sicher optimieren (siehe Kommentare)


    Bei mir funktioniert es (bislang ohne Verdrahtung, deswegen der readall am Ende) perfekt.
    Ich weiß natürlich nicht, wie bei anderer Nutzung des mpd es mit dessen CPU Usage aussschaut.


    Da ich absoluter Rookie bin, ist das Script sicher nicht so schön geschrieben, aber es funkt und ich hab einiges gelernt...:thumbs1:





    Vielleicht kann mir noch jemand ein paar Tipps zu Folgenden geben:


    • Wie kann ich das von-bis bei der Schleife bisschen ungespackter angeben??? Hab nur {1..10} gefunden und das geht nicht.
    • Ne einfache Möglichkeit das 0,0 in 0.0 umzuwandeln, damit die CPU-Usage addiert werden kann. Die Krücke mit dem Stringvergleich ist ja eher unelegant. ("${load/,/.}" geht nicht im Script.)

    Danke!

  • hmm, ich will das Script ja eigentlich im Hintergrund laufen lassen, das funktioniert aber irgendwie nicht...


    Führe ich es im Vordergrund aus, läuft es perfekt. Starte ich es mit " &" gehts nicht mehr...
    Hab auch bisschen mit screen und nohup rumprobiert. Geht nicht...


    Hat jemand ein Tipp?



    Ich habe mir auch mal erlaubt, das Thema parallel hier im Unterforum "Programmierung" anzusprechen.
    Hoffe das verstößt nicht gegen die Boardregel - aber hier gehts halt um zwei verschiedene Sachen.

    Edited once, last by johneff ().

  • So, das Script läuft nun auch perfekt im Hintergrund :thumbs1:


    Problem war das andere Verhalten von top bei Ausführung im Hintergrund.
    Wenn Details interessieren, die gibts hier.


    Hier ist es:



    Eine Version mit Kommentaren zu den einzelnen Zeilen und weitere Infos gibts weiter oben im Thread.

  • Hallo,


    der Eintrag hier ist zwar schon etwas älter - da ich aber neulich auch nach diesem Thema gesucht habe und direkt auf diese Diskussion hier gestoßen bin, vielleicht noch ein Tipp, wie sich das Problem noch direkter erledigen lässt:
    (also ohne Umweg über top und Auswertung der Systemlast etc.)


    Ich habe im Netz ein perl-script gefunden, mit dem sich der Status jedes Players am Squeeze-Server direkt abfragen lässt. Zu finden ist das hier:
    http://www.thespicers.net/squeezebox-stuff


    Weiter unten auf der Seite beim Abschnitt Miscellaneous gibt's ein Script (shutdown.pl) was den Status aller Player direkt ermittelt. Eigentlich zwar als Information, falls der Server ausgeschaltet wird, aber das lässt sich ja schnell ändern.



    Beste Grüße.
    Tjareson

  • Hallo Tjareson,


    bei meinem Problem ging es ausschließlich um den MPD. Dort lässt sich z.B. über den Client MPC der Status zwar auch direkt auslesen, jedoch funktioniert das -zumindest bei mir- nicht zuverlässig, da man halt über den Client nachfragt.
    Aber vielen Dank für die Ausweitung des Themas auf andere Player! Ehrlich gesagt verstehe ich nicht ganz, dass es zu dem Thema "Aktivboxen nur anschalten wenn sie gebraucht werden" so wenig Diskussion gibt. Wahrscheinlich sind viele Stromrechnungen doch noch zu klein? ;)
    Vielleicht gibt es mal ja mal ne Lösung, die sich die Aktivitätsinfo direkt vom ALSA holt. Bin gespannt.



    Für alle die das Ergebnis des Langzeittests meines Scripts interessiert (läuft seit über einem halben Jahr ununterbrochen):
    Läuft!!! :D
    Da Musik mit langen ruhigen Phasen (z.B. Klavierkonzerte) zum kurzen Ausschalten geführt hat, habe ich die Empfindlichkeit nochmal verändert. Wenn von 20 top-Abfragen 18 oder weniger 0,0% Last des MPD zurückgeben, dann "scheint" der MPD Music zu spielen und der GPIO 25 wird geschaltet. Dadurch gibt es zwar eine ganz leichte Verzögerung beim Einschalten, dafür ist die Prozessorlast des Scripts selbst signifikant geringer.
    Hier nochmal das aktualisierte Script (GPIO ist von 17 auf 25 geändert!):