SDL - Wie fragt man ab, ob ein bestimmter Sound gerade läuft??



  • Hi!

    Hab da ne Problemstellung, bei der ich im Moment nicht weiter komme.
    Ich nutze die SDL_Mixer Bibliothek die die Funktion Mix_Playing (http://jcatki.no-ip.org:8080/SDL_mixer/SDL_mixer.html#SEC34) zur Verfügung stellt. Über diese kann ich prüfung, ob in einem bestimmten Channel gerade ein Sound (Mix_Chunk) abgespielt wird oder nicht. (oder ich kann mir von der Funktion die Anzahl zurückgeben lassen, auf wievielen Kanälen gerade Sounds abgespielt werden).

    Jetzt will ich mit einer Funktion prüfen, ob ein ganz bestimmter Sound in meinem Spiel gerade läuft oder nicht (und wenn ja ihn stoppen und wieder von vorne abspielen, es geht um Schüsse) - hat jemand ne Idee?

    Danke!



  • Die Sounds spielen doch nur, weil du das der SDL befiehlst. Dann solltest du doch schon wissen, wo was laueft! f'`8k

    Autocogito

    Gruß, TGGC (Das kommt gut)



  • ...!?

    Also ich hab z.B. fünf Gegner-Instanzen die alle zu verschiedenen Zeitpunkten schießen und nun will ich bei der PlaySound-Funktion abfragen

    //Pseudocode
    PlaySound (soundXY) {
    
       if (soundXY == läuft)    {
            soundXY->stop ();
            soundXY->abspielen ();
            }
       // d. h. den Sound wenn er schon läuft nochmal VON VORNE abspielen
    
       // und natürlich
       else 
           soundXY->abspielen ();
    }
    

    Da ich ja nicht weiss ob der Sound jetzt gerade läuft oder nich...



  • Du sorgst doch selbst dafuer, das der Sound ablaeuft, also musst du es doch wissen! f'`8k

    Autocogito

    Gruß, TGGC (Das kommt gut)


  • Mod

    dukems2112 schrieb:

    Jetzt will ich mit einer Funktion prüfen, ob ein ganz bestimmter Sound in meinem Spiel gerade läuft oder nicht

    spiele den sound auf einem bestimmten channel ab, ueber die funktion zu der du verlinkt hast kannst du dann ja abfragen ob dieser channel spielt 🙂



  • rapso schrieb:

    spiele den sound auf einem bestimmten channel ab

    DAs dachte ich auch erst, aber das hieße ja dass ich jeden Channel nur für einen einzigen Sound nutzen kann, dass dieser spezifische Channel dann sozusagen für diesen Sound reserviert is..!?


  • Mod

    dukems2112 schrieb:

    rapso schrieb:

    spiele den sound auf einem bestimmten channel ab

    DAs dachte ich auch erst, aber das hieße ja dass ich jeden Channel nur für einen einzigen Sound nutzen kann, dass dieser spezifische Channel dann sozusagen für diesen Sound reserviert is..!?

    jap, das ist eine moeglichkeit.

    oder du suchst dir immer den naechst freien channel aus, du merkst dir dann pro channel welchen sound du abspielst und pro sound in welchem channel der war. so kannst du dann testen ob die beiden immer noch aufeinander referenzieren und falls ja, ob der sound noch spielt.
    falls sie nicht mehr aufeinander referenzieren, dann war der channel wohl schon fertig mit abspielen und spielt(e) nen neuen sound ab.

    ich hoffe ich hab es einigermassen verstaendlich erklaert 😉



  • @rapso: Das macht trotzdem nicht viel Sinn, schliesslich sind dies alles bekannte Informationen. Es ist ja nicht so, das mal gerade ein fremdes Programm daherkommt und einem die Sounds deaktiviert, so das man sich staendig bei Soundtreiber versichern muss: hey, laeuft mein Sound noch? Ausserdem gibts fuer solche Sachen auch Callbacks -> besser als Polling. f'`8k

    Autocogito

    Gruß, TGGC (Das kommt gut)



  • @rapos: hm, okay, das klingt aber einigermaßen kompliziert ^^! Hab da gestern erstmal selbst noch ne Idee bekommen...

    Und zwar handhabe ich meine Sounds intern mit einer Liste (Multimap) in die eim Boot alle sounds reingeladen werden, und so funktioniert dann auch das abspielen: jeder Eintrag in der Map ist a) ein String mit dem Namen den ich dem Sound intern gebe und b) ein Zeiger auf den Sound (also das Mix_Chunk) selbst.
    Jetzt kam mir die Idee dass ich einfach den Namen des Sounds, also den STRING in einen Integer umwanlde (ASCII ?) und diese Zahl dann als den Channel verwende, auf welchem ich den Sound abspiele - somit wäre garantiert (sofern keine Sounds gleich heißen, worauf ich achten werde) dass jeder Sound seinen eigenen Channel hat auf dem nur er abgespielt wird ohne dass ich dafür extra eine Liste + Übersicht oder so anlegen muss, welcher Channel denn nun für welchen Sound fesgelegt ist.

    Mein Problem: Ich bekomme das mit dem casten nicht hin :)! Hab mich gestern mal umgeguckt und ne Stunde rumprobiert aber ohne Erfolg - wie kann ich denn nen String in nen Integer (oder vergleichbares) umwandeln? Konnte das weder mit atoi () noch mit der istringstream umsetzen weil ich immer eine fehlerhafte Typumwandlung erhalte.
    Wenn mir bei dem Typenumwandeln schnell jemand helfen könnte, wäre mein Problem, glaube ich gelöst!


  • Mod

    welchen integerwert sollte denn etwas wie "explosion.wav" haben?



  • Naja ich dachte mir man kann doch die einzelnen Chars des Strings in die entsprechenden dezimalen oder hexa-dezimalen Werte umwandeln und dann in einen String hauen.
    Für den String "Schuss1" wäre das zum Beispiel 83 99 104 usw., bzw. hexadezimahl 53 63 68 usw.
    Die Zahlen könnte ich dann entweder in eine Int-Variable ddieren (wäre einfacher, aber hierbei wäre Verwechslung möglich) oder noch besser - aber das weis ich auch noch nich wie das zu machen is - dass die Zahlen praktisch hintereinander in den String geschrieben werden, wenn das irgendwie geht, also sprich dass zb int a = 83;, a += 99; ergäbe a = 8399 (natürllich ist der += Operator jetzt nur symbolisch)...

    Wie kann man das machen? Vor allem erstmal die String in ASCII (dezimal) Umwandlung (und somit in int)?



  • Das hoert sich alles nach ziemlichen Schwachsinn an. Das ist wie als ob ich die Explosion fuer den Schuss auf den Bildschirm pinsele und dann denke ich mir ploetzlich: ach, ich lese mal schnell den Backbuffer aus, ob die Explosion auch wirklich zu sehen ist. f'`8k

    Autocogito

    Gruß, TGGC (Das kommt gut)


Anmelden zum Antworten