Beiträge von FrauBerry

    Habe das das nochmal überprüft.

    Also es werden im Programm keine Daten ausgelesen, wenn der song noch spielt.

    Wenn ich nach 5 Sekunden teste, werden die Daten verspätet fehlerfrei ausgelesen und das Gerät pips so lange bis die Daten gesendet wurden.

    Wenn ich sofort nach einer Sekunde teste, dann pipst das Gerät extrem lange und es kommen keine Daten.

    Vielleicht muss ich da irgendeinen Zugriff auf den reader beenden, bevor ich einen neuen mache oder so etwas?

    So habe jetzt alles wieder drin und es funktioniert.

    Allerdings habe ich dieselben Fehler wie bisher. Also tagelange Fehlersuche am falschen Ende.

    Es muss irgendetwas mit der Abfrage der Daten vom Reader zu tun haben.

    Da verstehe ich auch bisher nicht 100% wie das abläuft. Ich kann die Daten ja über read abrufen. Sie werden wohl entweder im Gerät bis zum Abruf der Daten gespeichert oder aktiv vom Gerät gesendet, wenn ich eine Karte drauf lege. Wenn zweiteres der Fall ist, könnte es dann sein, das der Wert von read während des Lesens verändert wird und das den Fehler verursacht?

    Aber eigentlich kann das nicht sein, dann das Gerät pipst ja extrem lagen und das muss ja an irgendeinem Rückgabewert liegen den es fälschlicherweise erhält. Nach einer Sekunde pipst es extrem lange, nach 5 ungefähr doppelt so lange wie normal. (Aber dass nur wenn mein Programm läuft.)


    Durch die Threads sollte das "

    Code
    data = dev.read(endpoint.bEndpointAddress,endpoint.wMaxPacketSize)

    doch erst ausgeführt werden, wenn der Song zuende ist.

    Ok, verstehe das mit dem Thread.

    Ich suche gerade nach einer Möglichkeit den am Ende des Songs zu zerstören.

    Code
    Was ich aber immer noch nicht gerafft habe, was ist das nun genau ?
    Mit einem Kartenstapel soll entscheiden werden welcher Tital, oder welches Play-File laufen soll.
    Was ist dann wenn das Ende erreicht ist ? Soll der nächste Titel , oder sollen alle als Zufallsliste abgespielt werden - bis jemand einen Titelwunsch hat, und die letzte Karte dann zum Beendigung des Jukebox Programms führt ?

    Also ich habe rfid-karten und jeder ist eine sounddatei zugeordnet. Wenn ich sie drauflege dann spielt genau diese datei ab. Der letzte zum Ausschalten ist nur für den raspberry pi, weil ich keinen Schalter eingebaut habe.

    Das mit dem Thread habe ich gelöst, fehlt jetzt nur noch der Rest vom Code.

    Mal schauen ob es auch mit richtigen Songs funktionier ;).

    Code
    Und warum muß es jetzt eine Tastaturkommando sein ? Du hast doch dieses Shutdown Modul !? Da ist doch ein Taster drauf. Frage ihn doch einfach mit GPIOZERO ab. Wenn das dann klappt, dann Schritt 2.

    Ich wollte weiter vorn anfangen und ein Programm mit zwei Threads machen. Der eine soll später die Codes auslesen und im anderen Prozess einen Song starten. Wenn der Song läuft wird der Abfragethread pausiert oder beendet und neu gestartet wenn der Song zu ende ist.

    Zitat

    Open-Play-Close

    Naja die song-datei muss doch geöffnet, abgespielt und beendet werden. Oder was meinst du?

    Zitat

    Shutdown Modul

    Meinst du das "on/off shim?" Dafür hatte ich keine Zeit das einzubauen und werde das einfach weglassen. Für das Löten würde bei meinen Fähigkeiten ein ganzer Tag drauf gehen und mit draufstecken wird es nicht erkannt... Das war nur gedacht mit dem Schalter den ganzen Raspberry herunterzufahren, nicht für die Sounddateien. Ich habe alternativ eine RFID-Karte, die den Raspberry herunterfährt.

    Damit das aber kein Problem gibt darf der aber am besten nicht abstürzen, wenn eine Karte zu früh drauf aufgelegt wird.

    Zitat


    Das spricht für mich eben für eine Liste an Songs, die per RFID gefüllt wird (eine Art Playlist) und nacheinander abgespielt wird. Vielleicht habe ich da aber wirklich etwas falsch verstanden oder es ist tatsächlich zu spät für mich.

    Vielleicht eine Playlist mit zwei Songs, bei dem die Positionen immer wieder ersetzt werden beim Scan ganz gut. Wenn er Song zu ende ist wird die erste Position durch die zweite ersetzt. Wenn der Song noch spielt wird der nächste in der zweiten Position gespeichert.

    Aber das ist auch nur theoretisch einfach. Wenn der Song zu ende ist, dann kann ich einfach abfragen, ob einer in der Position 2 wartet. Wenn nicht, dann passiert erstmal nichts. Das ist theoretisch einfach.

    Nach dem eine ID vom Reader kommt muss ich also einmal etwas in die Liste schreiben. Aber es taucht ein Problem auf, das viel schwieriger íst. Wenn der letzte Song der Liste gespielt wurde. Dann brauche ich einen Ereignisauslöser, der das Ereignis "Song abspielen" auslöst, denn da ist wieder dasselbe Problem. Wenn bereits ein Song am abspielen ist, dann stürzt das Programm ab.

    Also immer wieder dasselbe Problem. -> Ich brauche etwas das die Übergabe der IDs, bzw. das Abspielen des Songs so lange blockiert bis ein Song zu Ende ist.

    Mh, ich überlege gerade:

    Wenn ich es so mache, das, wenn Position 2 leer ist, ein 5s Song ohne Ton abgespielt wird, dann kann ich auf diese Weise alle 5 Sekunden wieder prüfen, on ein neuer Song an Position zwei steht.

    Das benutzt sicher viel Energie, aber könnte eine Lösung sein, wenn ich nicht etwas übersehen habe.

    Die Beiden Prozesse wären getrennt. Aber ich brauche immer noch dieses Multiprocessing. Es passieren ja zwei Dinge gleichzeitig. Abspielen und Scannen.

    Zitat

    Vielleicht ist dann der Weg über "Queue" (eine Warteschlange) das richtige Suchwort. :conf:

    Ist aber schon spät und evtl. habe ich da gerade einen Denkfehler. :denker:

    Naja, ich denke, wenn ich sleep parallel zum abspielen für alle anderen Prozesse ausführen könnte, dann sollte es schon reichen.

    So ist der aktuelle stand. Kriege es noch nicht hin etwas in den zwei Prozessen auszuführen.

    Zitat

    Da ich keinen RFID-Reader habe, kann ich leider nicht testen und hätte dafür momentan auch keine Zeit. Aber so schwer kann das doch nicht sein ein Dict anzulegen, den RFID-Key mit dem Dict-Key zu vergleichen und bei einem Treffer den entsprechenden Sound abzuspielen. z:conf:

    Nein das ist es auch bisher nicht gewesen. Funktioniert ja. Nur das Warten auf das Ende des Songs bevor die nächste Karte gelesen wird finde ich wahnsinnig schwer.

    Was auch (etwas umständlicher) funktioniert, wären zwei Listen. eine Liste für die Keys der RFID-Karten und eine Liste der wav-Dateien. Ein Beispiel für ein Webradio (der Unterschied sind nur die Soundquellen) hatte ich hier schon mal: RE: Webradio-Player mit 8 Tastern/LED's

    Ok, das war mit Tastern und LEDs, aber das kann man ja anpassen.

    Das mit den Listen ist das kleinste Problem. Das mache ich am Ende. Die Schwierigkeit liegt beim Warten auf den Song und das mit den Threads.

    Ich habe leider keine Ahnung was neu und alt ist, sorry. Arbeite mich da so rein gerade.

    Aber eigentlich hat ja bisher alles funktioniert. Ich finde es super toll dass ihr mir helft und bin sehr dankbar. Aber bitte stresst mich nicht noch mehr. Dass mein Weg nicht optimal sein kann ist klar. Ich bastel mein Script ja aus schnipseln zusammen, die ich überall finde. Aber ich habe kein Jahr mich da richtig reinzuarbeiten.

    Mir läuft die Zeit davon.

    Das Problem mit dem sleep war, das es immer erst startet nachdem der song zuende gespielt war gestartet ist.

    EIn Thread ist daher eine gute Idee. Ich kann dann in dem einen Thread den sound spielen und im anderen passiert die rfid abfrage, die solange schläft bis der Sound zu ende abgespielt ist. denke ich mir.

    Nachdem was ich jetzt gelesen habe war vielleicht der Ansatz falsch und ich muss nicht den Sound stoppen, sondern den ganzen Thread. Da habe ich gelesen, dass es mit Thread nicht geht.

    Daher beschäftige ich mich jetzt schon eine Weile mit multiprocessing, allerdings wohl komlpizierter als thread, jedenfalls kriege ich eine Fehlermeldung nach der anderen und muss herausfinden woran es liegt...

    Wenn alles nicht klappt muss ich wohl am Ende ein Schild davor stellen "bitte 15 Sekunden warten" bevor die Karte verwendet werden darf oder so ;)

    Ok, probiere mich gerade an den Threads, dass kannte ich vorher noch nicht. Ist genau das was ich brauche, aber ich kriege das mit den Gültigkeiten gerade nicht hin.

    Starten der Musik mit "start" funktioniert. Wenn ich stoppen will, dann sagt er mir das f nicht definiert ist.

    Wie kriege ich das hin, dass ich vom zweiten Task auf dasselbe Objekt zugreifen kann?

    Oh, ich dachte eigentlich ich hätte eine möglichst simple Lösung gefunden. Ich hatte Ursprünglich die Anleitung für so eine selbstgebaute Musikbox und habe alles wie Buttons und sowas halt weggelassen. Das es noch etwas einfacheres gibt wusste ich nicht. Jetzt muss ich es so weitermachen, habe leider nur noch ein paar Tage übrig bis es aufgebaut werden muss.

    Gute Idee, versuche ich.

    Als Taste könnte ich aber auch einfach eine Eingabe per ssh nehmen machen oder? Ist ja erstmal nur zum Testen.

    Playsound oder so klappt leider nicht. Anfangs habe ich alle Soundklassen ausprobiert. alsaaudio wurde für die Tests der Soundkarte verwendet. Das war die einzige mit der ich es geschafft habe Sound abzuspielen.

    Das ist eine Art Musikbox. An den Pi angeschlossen ist eine Soundkarte mit Lautsprechern und ein Kartenlesegerät ist per USB angeschlossen. Wenn ich eine Karte drüber halte, dann startet ein Song. Eine extra karte ist fürs herunterfahren zuständig, da ich das mit dem "on/off Shim" erstmal aufgeschoben habe.

    Das funktioniert soweit alles super, nur, wenn ich die Karten draufhalte bevor der Song zu ende ist gibt es Probleme.

    Halte ich die Karte ca. 5-6 Sekunden nach der ersten drüber dann pipst das Gerät länger als normal, aber stürzt nicht ab. Wenn ich die Karte ein paar Sekunden nach der ersten drüber halte, dann stürzt das Programm ab.

    Ok, habe eine Menge daran gebastelt.

    Ich denke es könnte funktionieren, wenn ich old_id auf "" ändere, wenn der Song zu Ende ist. Denn wenn ich es herausnehme wird nur ein Song abgespielt und das Programm wird beendet. Eine Idee dazu?

    play(device,f)

    f.close()

    rfid_id = ""

    old_id = ""

    Ich hab hier mal meinen ganzen Code:

    Danke für die Antwort, das mit dem Dictionary schaue ich mir an.

    Jetzt muss aber zuerst dieser Fehler ausgebessert werden. "Merker" an so etwas habe ich auch gedacht und ein Beispiel mit sleep gefunden, allerdings funktioniert das bisher nicht.

    Code
    Die Ausgabe:
    
    time.sleep(f.duration)
    AttributeError: 'Wave_read' object has no attribute 'duration'

    Hallo,

    ich habe ein Programm geschrieben, bei dem Sounddateien per rfid-reader gestartet werden.

    Alles funktioniert so weit. Es gibt allerdings ein Problem.

    Sobald eine Datei rfid gscannt wird während eine Sounddatei noch nicht zu Ende abgespielt wurde pipst das Gerät länger und das Programm stürzt ab.

    Ich brauche irgendwie eine Idee, wie das Programm pausiert bis die Sounddatei zu ende abgespielt wurde.

    Hat jemand eine Idee dazu?

    lg

    FrauBerry