FMOD - LOOP & PAUSE - HILFE!

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Lukaso
Beiträge: 720
Registriert: 08.09.2004 18:51
Wohnort: Oberkirch
Kontaktdaten:

FMOD - LOOP & PAUSE - HILFE!

Beitrag von Lukaso »

Hallo,

sitze jetz schon wieder an einem Problem, habe jetzt meinen kleinen MP3 Player von MCI auf FMOD gecodet, soweit funktioniert alles, nur bekomme ich keine Loop von meinem Song so richtig hin, genauso wie ne Pause. Habe mir schon die Komplette FMOD Datei durchgelesen, alles Probiert, komme aber nicht weiter ....

Zum Loop:
Habe es mit, Probiert, aber ging nicht:

Code: Alles auswählen

              FSOUND_SetLoopMode(1, FSOUND_LOOP_NORMAL)
              FSOUND_Stream_SetMode(hstream, FSOUND_LOOP_NORMAL)
Habe es versucht anderst zulösen mit:

Code: Alles auswählen

  If wiederholen = 1
    If FSOUND_IsPlaying = FALSE
      FSOUND_Stream_Play(1,music_stream)
    EndIf
  EndIf
Aber dabei gibt es ein Problem, wenn ich mit der Maus nicht im Fenster bin (und bewege) Wiederholt er nicht, erst wenn ich wieder mit der Maus hineinfahre.

Zur Pause:
Habe volgendes versucht, aber ohne Erfolg:

Code: Alles auswählen

FSOUND_SetPaused(1,TRUE)
Bitte um Hilfe, Danke für jede art von Tips!

MFG Lukaso
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

Falls das Original-Ausschnitte aus deinem Code sind, dann ist das Problem, dass Du nicht Konstanten nutzt, sondern Variablen mit dem Namen der jeweiligen Konstanten, (da nicht initialisiert, mit Wert 0) z.B. für FSOUND_LOOP_NORMAL ebenso für FALSE und besonders TRUE.

Schreib stattdessen (wie immer für Konstanten in PB) ein '#' davor:
#FSOUND_LOOP_NORMAL
#False
#True

Wenns nicht daran lag, guck ich nochmal näher.
!UD2
Benutzeravatar
Lukaso
Beiträge: 720
Registriert: 08.09.2004 18:51
Wohnort: Oberkirch
Kontaktdaten:

Beitrag von Lukaso »

Hallo,

Danke für deine schnelle Antwort :allright:

Funktioniert jetzt Prima :wink:

Danke :allright:


Lukaso
Nextgen Guild Wars Fanseite: Guild Wars Tactics (Pseudo-Admin + Developer)
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

Für 'Samples', also per FSOUND_Sample_Load geladene Sounds kannst Du folgendermaßen verfahren, indem Du den Loopmode des Channels, auf dem Sounds gespielt werden, setzt:

Code: Alles auswählen

FSOUND_Init(44100, 32, 0)
*hsample = FSOUND_Sample_Load(#FSOUND_FREE, "car.wav", 0, 0, 0)
FSOUND_PlaySound(1, *hsample)
FSOUND_SetLoopMode(1, #FSOUND_LOOP_NORMAL) ; setzt den Loop-Mode des Channels
Delay(5000)
Für Streams hingegen muss entweder beim Laden, oder später per FSOUND_Stream_SetMode() das Flag #FSOUND_LOOP_NORMAL für diesen Stream gesetzt werden, damit dieser überhaupt loopen kann. Zusätzlich läßt sich dann die Anzahl einstellen per FSOUND_Stream_SetLoopCount(*hstream, 2), also z.B. sowas in der Art:

Code: Alles auswählen

FSOUND_Init(44100, 32, 0)
*hstream = FSOUND_Stream_Open(OpenFileRequester("","car.wav","",0), 0, 0, 0) ; hier könnte auch schon das Flag #FSOUND_LOOP_NORMAL angegeben werden

FSOUND_Stream_SetMode(*hstream, #FSOUND_LOOP_NORMAL) ; markiere als loopenden Stream (ohne #FSOUND_LOOP_NORMAL für diesen Stream kann er gar nicht geloopt werden

FSOUND_Stream_SetLoopCount(*hstream, 3) ; 3 Wiederholungen
*hchannel = FSOUND_Stream_Play(1, *hstream)
Delay(5000)
Ein Stream spricht auf ein FSOUND_SetLoopMode() auf seinen Wiedergabechannel nur dann an, wenn der Stream bereits auf #FSOUND_LOOP_NORMAL gesetzt ist. Dann läßt sich der Loop z.B. per FSOUND_SetLoopMode(1, #FSOUND_LOOP_OFF) unterdrücken, aber nicht andersherum erzwingen, wenn beim Stream-laden #FSOUND_LOOP_NORMAL weggelassen wurde.

Das ist ein seltsames Verhalten finde ich, wenn dann sollte FSOUND_SetLoopMode() für alle Samples und Stream auf diesem Channel gleichermaßen gelten, also auch einen Stream-Loop erzwingen können, aber wahrscheinlich ist das eine Krankheit, die sich von Version zu Version eingeschlichen hat.
Bald gibt es ja das komplett neugeschriebene und -konzipierte fmod 4.0 (dann nicht mehr abwärtskompatibel, da völlig neue Befehlslogik), da wird sowas dann wohl hoffentlich ausgebügelt sein.
Mal sehen, ob PureBasic dann auf 4.0 mitzieht ;-)
!UD2
Benutzeravatar
Lukaso
Beiträge: 720
Registriert: 08.09.2004 18:51
Wohnort: Oberkirch
Kontaktdaten:

Beitrag von Lukaso »

Hallo,

Das mit dem Loopen, habe ich schon hinbekommen, aber trotzdem Danke für die o.g. Tips.

Stehe aber jetzt vor einem Neuen Problem, ich versuche eine Playlist zu machen, ich speichere alles in eine Liste, und möchte, wenn ein Musikstück beendet wird, das nächste anfängt zu Spielen, habe es volgender masen versucht:

Code: Alles auswählen

        files.l = CountList(playlist())
        
        SelectElement(playlist(), files-1)
        last_file.s = playlist()
        
        ResetList(playlist())
        count.l = 0
        Repeat
          If FSOUND_IsPlaying = False
            SelectElement(playlist(), count)
            FMOD_PLAYMUSIC(playlist())
            count + 1
          EndIf
        Until files = count
Das geht aber nicht, da er "count" gleich hochzählt, muss ein fehler in der if abfrage sein, dachte weil ich den channel nicht angegeben habe, aber wenn ich es mit

Code: Alles auswählen

If FSOUND_IsPlaying(1) = False
mache, steigt beim abspielen der Playlist meine CPU auslastung auf 100%!

Irgendwas mach ich Falsch .....

THX 4 HELP!

MFG Lukaso
Nextgen Guild Wars Fanseite: Guild Wars Tactics (Pseudo-Admin + Developer)
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

Mit FSOUND_IsPlaying = False fragst Du ab, ob die Variable namens 'FSOUND_IsPlaying' den Wert der Variablen 'False' hat. Da beide mit 0 initialisiert sind, ist das immer der Fall, daher zählt count immer hoch.
Korrekt wäre FSOUND_IsPlaying() = #False, um zu fragen, ob die Funktion FSOUND_IsPlaying den Wert der Konstanten #False hat.
Das würde aber einen Fehler liefern, da die Funktion FSOUND_IsPlaying einen Parameter erwartet, nämlich die Channel ID, oder den handle des Channels.

Also ist z.B. FSOUND_IsPlaying(1) = #False das richtige, was Du suchst.

Du musst vorsichtiger im Umgang mit Funktionen, Variablen und Konstanten sein.

Das mit der CPU-Auslastung liegt natürlich daran, dass deine Schleife fortwährend ausgeführt wird, Du mußt irgendwo darin noch z.B. ein Delay(1) einbauen.
!UD2
Benutzeravatar
Lukaso
Beiträge: 720
Registriert: 08.09.2004 18:51
Wohnort: Oberkirch
Kontaktdaten:

Beitrag von Lukaso »

Hallo,

Danke für deine Hilfe, nur mit

Code: Alles auswählen

FSOUND_IsPlaying(1) = #False
gings auch nicht, habs aber mit

Code: Alles auswählen

FSOUND_Stream_GetLength(music_stream) = FSOUND_Stream_GetPosition(music_tream)
gelöst!

Danke!
Nextgen Guild Wars Fanseite: Guild Wars Tactics (Pseudo-Admin + Developer)
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
Antworten