Bass Wrapper DLL kommt wieder!

    • Bass_w16a_int.zip ist ja auch ein anderes archiv als Bass_w16a.zip :D
      ich hab mir die jetzt auch mal runter geleaden und den importer dann natürlich auch gefunden. das kommt davon, wenn man die neue version nicht in den den ersten post editiert ;)
      Battle Command - WeltraumEchtzeitStrategie | Meine GM Spiele auf Box.net
      GCM/FA/O d-(--)@>---xpu s-:- !a C++$@ U- P L+ E W++ N o K-- w++ O? M V PS PE-- Y PGP t 5 X R+++ tv+ b DI D G e+ h? r-- x
    • Ich will Sounds mit Bass abspielen, da ich so die Frequenz derselbigen ändern und das .ogg Format nutzen kann.

      Mein erster Versuch sah so aus:

      GML-Quellcode

      1. //datei laden
      2. global.soundindex[index]=BASS_SampleLoad(datei,1,0);
      3. global.soundindex[index]=BASS_SampleGetChannel(global.soundindex[index],0);


      GML-Quellcode

      1. //sound abspielen
      2. BASS_ChannelPlay(global.soundindex[index],0);


      Zuerst dachte ich das würde so klappen aber der Sound wurde manchmal einfach nicht abgespielt.
      danach habe ich versucht, die anzahl an Sounds die gleichzeitig spielen können (BASS_SampleLoad(datei,DAS HIER,0)) zu erhöhen.
      Das hat überhaupt nichts gebracht.

      Danach habe ich das folgendermassen geändert:

      GML-Quellcode

      1. //datei laden
      2. global.soundindex[index]=BASS_SampleLoad(datei,1,0);


      GML-Quellcode

      1. //sound abspielen
      2. var chn;
      3. chn=BASS_SampleGetChannel(global.soundindex[index],0);
      4. BASS_ChannelPlay(chn,0);


      Also wird bei jedem neuen Abspielen des Sounds ein neuer Channel kreiert.
      Das hat den Sound zwar gespielt, jedoch konnte nur 1 Sound gleichzeitig spielen.
      Neue Sounds haben den alten, noch laufenden Sound nicht gestoppt und wurden somit nicht abgespielt.
      Ich habe wiederum die maximale Soundanzahl erhöht und siehe da, mehrere Sounds können gleichzeitig spielen.
      Das will ich aber nicht, da die Lautstärke der gleichzeitig spielenden Sounds viel zu hoch werden kann.
      Ich will, das immer nur eine Soundinstanz spielen kann und durch neue Sounds ersetzt wird.

      Also habe ich den Vorschlaghammer ausgepackt und den Abspielscript folgendermassen geändert:

      GML-Quellcode

      1. //sound abspielen
      2. var chn;
      3. BASS_SampleStop(global.soundindex[index]);
      4. chn=BASS_SampleGetChannel(global.soundindex[index],0);
      5. BASS_ChannelPlay(chn,0);


      Das macht genau das, was ich will.
      Jedoch frage ich mich, ob das auch so sein soll oder ob ich von vornerein falsch an Samples rangegangen bin da mir meine Lösung irgendwie primitiv vorkommt.
      Ausserdem befürchte ich, das bei längerem spielen der Speicher irgendwann voll ist, da bei jedem neuen Abspielen des Sounds ein neuer Channel kreiert wird.
      Ist das der Fall?
      Mache ich etwas grundlegend falsch oder kann man den Code jetzt so lassen?

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Verwurster ()

    • Hmm so etwas wie BASS_Channel_Free gibt es nicht.
      Ich kann nur das Sample freigeben aber wenn ich das mache, kann der Sound überhaupt nicht mehr abgespielt werden.


      In der bass Dokumentation sehe ich gerade, das man in den flags der funktion BASS_SampleLoad einstellen kann, welcher Sound durch den neuen Sound ersetzt werden soll.
      Da müsste ich dann einfach BASS_SAMPLE_OVER_POS angeben und alles wäre gut.
      Leider kürzt der basswrapper die ursprünglichen 6 argumente auf 2, die flags sind da im Verschnitt inbegriffen.

      Könntest du die als 3. Zusatzargument hinzufügen oder gleich alle 6 argumente einbringen?

      edit: oh man ich sehe gerade, das die Flags schon da sind.
      Ich sollte wohl mal wieder ausschlafen :P

      edit2: genau wie ich dachte. Mit dem flag BASS_SAMPLE_OVER_POS wird der älteste noch spielende Sound durch den neuen ersetzt.
      Ich denke, jetzt funktioniert die Sache.
      So sieht der code jetzt aus:

      GML-Quellcode

      1. //laden
      2. global.soundindex[index]=BASS_SampleLoad(datei,1,BASS_SAMPLE_OVER_POS);
      3. global.soundindex[index]=BASS_SampleGetChannel(global.soundindex[index],0);


      GML-Quellcode

      1. //spielen
      2. BASS_ChannelPlay(global.soundindex[index],1);


      edit3: Grrr jetzt wird der Sound schon wieder manchmal nicht abgespielt.
      Das verstehe ich nicht. Was mache ich denn falsch?

      edit4: Okay wenn ich den abspielcode wieder so verändere, das jedes mal ein neuer Channel kreiert wird, wenn der Sound spielt, dann klappts.
      Auch, wenn ich vorher nicht alle samples stoppe.
      Ich schätze mal, so ist das gedacht.

      Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von Verwurster ()

    • Also vom Code her dürfte das korrekt sein. Keine Ahnung woran das liegt. Aber ich werde den Kram eh mal überarbeiten und den in eine GM7 Extension verpacken.
      "Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
      - Joseph Weizenbaum
    • Ich glaube, eine Lösung gefunden zu haben.

      GML-Quellcode

      1. //laden
      2. global.soundindex[index]=BASS_SampleLoad(datei,1,BASS_SAMPLE_OVER_POS);
      3. global.soundindex[index]=BASS_SampleGetChannel(global.soundindex[index],0);


      GML-Quellcode

      1. //sound abspielen
      2. var chn;
      3. chn=BASS_SampleGetChannel(global.soundindex[index],0);
      4. BASS_ChannelPlay(chn,1);


      Vieleicht ist es so gedacht, das man bei jedem neuen Abspielen des Sounds einen neuen Channel kreieren soll.
      Auf jeden Fall muss ich jetzt nicht mehr alle samples stoppen, um ein Neues spielen zu können.
      Kommt mir trotzdem komisch vor...

      Wenn du etwas am basswrapper veränderst/ reparierst, dann stell bitte auch eine gm6 kompatible Version bereit.
      Ich will noch nicht vom Gm7 abhängig sein, wenn es um meine Projekte geht.
      Mit dem Ding gibt es einfach noch zu viele Probleme, deshalb bleib ich beim gm6 und benutze den gm7 um .exen zu erstellen.
    • Ja, bleibt auf jeden Fall GM6 kompatibel.
      Also, beim Laden eines Samples ist der zweite Parameter die Zahl der Channel, die mit dem Sample erzeugt werden können.
      Ein Channel wird freigegeben, wenn er gestoppt oder aufgrund eines Mangels an freien Channeln für das Sample überschrieben wird.

      Also überschreibst du immer wieder den alten Channel mit nem neuen, dadurch dürfte kann keine Speichervermüllung entstehen.
      "Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
      - Joseph Weizenbaum
    • Benutzer online 1

      1 Besucher