Neue bass.dll, ChannelPlay nicht mehr als einmal nutzbar?
Übersicht

![]() |
Verge3000Betreff: Neue bass.dll, ChannelPlay nicht mehr als einmal nutzbar? |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
im Chat ist anscheinend niemand ansprechbar auf mein Anliegen, deshalb poste ich das mal hier. Ich bin nun heute auf die neue bass.dll umgestiegen und habe nun Probleme geladene Sounds mehr als einmal mit ChannelPlay abzuspielen. Ich habe da z.B. einen Laufen-Sound für die Spielerfigur und ich lade das alles so: Code: [AUSKLAPPEN] sound_channel=BASS_SampleLoad(0,"sounds/laufen.ogg",0,0,1,BASS_SAMPLE_LOOP) sound_laufen = BASS_SampleGetChannel(sound_channel,BASS_NULL) Abspielen tu ich ihn so: Code: [AUSKLAPPEN] BASS_ChannelPlay(sound_laufen,0) BASS_ChannelSetAttributes(sound_laufen,0,20,0) Irgendwann stoppe ich den Sound auch mal wieder mit: Code: [AUSKLAPPEN] BASS_ChannelStop(sound_laufen) Das klappt beim ersten mal alles ganz gut, aber sobald ich den Sound später im Spiel nochmal abspielen möchte, ebenfalls wieder mit: Code: [AUSKLAPPEN] BASS_ChannelPlay(sound_laufen,0) BASS_ChannelSetAttributes(sound_laufen,0,20,0) Dann wird der Sound aber nicht nochmal abgespielt. Warum ist das so? Mit der alten bass.dll ging das ohne Probleme mit SamplePlay SampleStop SamplePlay. SamplePlay gibts aber ja nun in der neuen Version nicht mehr. Hmmm. Weiss da wer Rat? |
||
Woher soll ich wissen was ich denke, bevor ich höre was ich sage? |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du kannst es zB auch mit Pause machen. Hab ich eben ausprobiert, und funktioniert:
Code: [AUSKLAPPEN] If KeyHit(57)
pause=1-pause If pause=1 BASS_ChannelPause(sample) If pause=0 BASS_ChannelPlay(sample,BASS_FALSE) End If |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Moved da falsches board (kein 3D Problem) | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Verge3000 |
![]() Antworten mit Zitat ![]() |
---|---|---|
hectic hat Folgendes geschrieben: Du kannst es zB auch mit Pause machen. Hab ich eben ausprobiert, und funktioniert:
Das wusste ich auch schon, allerdings will ich das der Sound neustartet und nicht da weitermacht wo er pausiert wurde. |
||
Woher soll ich wissen was ich denke, bevor ich höre was ich sage? |
![]() |
Abrexxes |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
Ein Sample hat sein eigenes Handle. Diesem teilst du hiermit einen Channel zu Code: [AUSKLAPPEN] sound_laufen = BASS_SampleGetChannel(sound_channel,BASS_NULL) Nun gilt dieses Channel bist du Ihn frei gibst, und das tust du mit ChannelStop. ![]() Das zweite mal ist also zwar das Sample noch geladen, hat sich aber keine Channel Zuteilung mehr. Das ist wichtig da sonst bei diversen Games plötzlich 2500 Channels da wären für Effekte. Um einen Sample zu loopen gibt es also zwei möglichkeiten. Du erfragst vor dem spielen einen neuen Canal an Code: [AUSKLAPPEN] sound_laufen = BASS_SampleGetChannel(sound_channel,BASS_NULL) BASS_ChannelPlay(sound_laufen,0) BASS_ChannelSetAttributes(sound_laufen,0,20,0) oder du macht nur Pause und änders die Position auf Null zurück. Code: [AUSKLAPPEN] BASS_ChannelPause(sound_laufen) BASS_ChannelSetPosition(sound_laufen,0) ;das 2te Setattributes ist so auch nicht nötig Das ist wie gesagt ein Sonderfall bei geloopten Sounds und STOP. Welche Methode du nimmst ist egal. Werden die Schritte immer wieder gebraucht dann pause nur, das kostet keine Rechenzeit. Ist ein Level vorbei dann Stope und nimm nachher neuen Handle, so ist immer aufgeräumt und Speichertrouble kommt nie vor. Bei MUSIC und STREAM gilt das nicht. Der Grund ist das du zb von einem Sample mehrere Kanäle anfragen kannst und diese dann individuel steuern. (Musst also ein Sample nur einmal im Speicher haben). Lese dazu die Doc zu "BASS_SampleGetChannel" da steht alles unter anderem dein Problem hier. Zitat: A sample channel is automatically freed when it's overridden by a new channel, or when stopped by BASS_ChannelStop, BASS_SampleStop or BASS_Stop. If you wish to stop a channel and re-use it, it should be paused (BASS_ChannelPause) instead of stopped. Determining whether a channel still exists can be done by trying to use the handle in a function call, eg. BASS_ChannelGetAttributes. A list of all the sample's existing channels can also be retrieved via BASS_SampleGetChannels. !! Aber nur der Channel, das Sample ist weiterhin da. Um das aus dem Speicher zu schmeisen SAmpleFree (nur am Rande)!! Wenn das nächste mal etwas nicht spielt debuge mit Code: [AUSKLAPPEN] If not BASS_ChannelPlay(sound_laufen,0) RuntimeError "Joah da is aber nix in Zeile X zum playen Alda!!"
Also wenn Channel eine 0 zurückgibt dann gibts Fehler und die weist auch wieso, weil nix da. DAs geht bei fast allen Befehlen. Sie hierzu demo_debug im Ordner von BBS cu |
||
![]() |
Verge3000 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Woah, YaaaY! Danke für die ausführliche Antwort Abrexxes, stimmt alles und passt jetzt alles. =D | ||
Woher soll ich wissen was ich denke, bevor ich höre was ich sage? |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group