Seite 1 von 1

FMOD - LOOP & PAUSE - HILFE!

Verfasst: 09.09.2004 23:06
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

Verfasst: 09.09.2004 23:35
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.

Verfasst: 09.09.2004 23:43
von Lukaso
Hallo,

Danke für deine schnelle Antwort :allright:

Funktioniert jetzt Prima :wink:

Danke :allright:


Lukaso

Verfasst: 10.09.2004 00:17
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 ;-)

Verfasst: 10.09.2004 22:32
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

Verfasst: 11.09.2004 09:13
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.

Verfasst: 11.09.2004 13:21
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!