Seite 1 von 1

FSOUND_FX_Enable() die 2.

Verfasst: 21.01.2005 22:32
von nicolaus
Schade aber die freude über das gelingen des Equalizers (den ich auch in Code,Tips und Tricks) gepostet hatte hält nich lange an.
Und zwar taucht folgendes problem auf:
wenn man das erste mal ein soundfile läd und abspielt ist alles ok und FSOUND_FX_Enable() arbeitet auch richtig doch wenn das programm nun nicht geschlossen wird und man ein neues soundfile läd kommt es zu nem komischen fehler bei FSOUND_FX_Enable() und zwar bekommen dann nich mehr alle 10 EQ-Bander (is die bezeichnung aus dem beispielcode von mir) ne FX-ID sondern nur die ersten 5 und der rest auf einmal -1 was ich aber nich verstehe. weenn man nun noch mal ein neues file läd haben alle 10 Bander auf einmal ne FX-ID von -1.

Um das besser zu verstehen is hier mal ein beispielcode (mit debuger starten um zu sehen was ich meine)

Code: Alles auswählen

; Author: nicolaus
; Date: 21. Januar 2005
; um das beispiel zu kompilieren und zu starten braucht ihr die FMOD-Wrapper-LIB 
; und die fmod.dll (getestet wurde mit dll-version 3.7.4.0)

Enumeration 
  #NewSoundfile
  #TrackBar_80
  #TrackBar_170
  #TrackBar_310
  #TrackBar_600
  #TrackBar_1000
  #TrackBar_3000
  #TrackBar_6000
  #TrackBar_12000
  #TrackBar_14000
  #TrackBar_16000
  #TrackBar_SFX_Vol
EndEnumeration

Global HardCh_1.l
Global sample.l

Dim EQBand.l(10)

Procedure InitEQ() 
  Protected I.l 
  For  I=0 To 10 
    EQBand(I)= FSOUND_FX_Enable(HardCh_1, #FSOUND_FX_PARAMEQ)
    Debug "FX-ID "+Str(I)+" = "+ Str(EQBand(I))
  Next
    FSOUND_FX_SetParamEQ(EQBand(0), 80, 10, 0) 
    FSOUND_FX_SetParamEQ(EQBand(1), 170, 10, 0) 
    FSOUND_FX_SetParamEQ(EQBand(2), 310, 10, 0) 
    FSOUND_FX_SetParamEQ(EQBand(3), 600, 10, 0) 
    FSOUND_FX_SetParamEQ(EQBand(4), 1000, 10, 0) 
    FSOUND_FX_SetParamEQ(EQBand(5), 3000, 10, 0) 
    FSOUND_FX_SetParamEQ(EQBand(6), 6000, 10, 0) 
    FSOUND_FX_SetParamEQ(EQBand(7), 12000, 10, 0) 
    FSOUND_FX_SetParamEQ(EQBand(8), 14000, 10, 0) 
    FSOUND_FX_SetParamEQ(EQBand(9), 16000, 10, 0)  
EndProcedure 
Procedure Open_Equalizer()
  If OpenWindow(0, 216, 0, 410, 250,  #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_TitleBar , "FMOD Equalizer")
    If CreateGadgetList(WindowID())
      ButtonGadget(#NewSoundfile,10,2,100,18,"Load new File")
      TrackBarGadget(#TrackBar_80, 20, 30, 20, 200, 0, 240, #PB_TrackBar_Vertical)
      TrackBarGadget(#TrackBar_170, 60, 30, 20, 200, 0, 240, #PB_TrackBar_Vertical)
      TrackBarGadget(#TrackBar_310, 95, 30, 20, 200, 0, 240, #PB_TrackBar_Vertical)
      TrackBarGadget(#TrackBar_600, 130, 30, 20, 200, 0, 240, #PB_TrackBar_Vertical)
      TrackBarGadget(#TrackBar_1000, 165, 30, 20, 200, 0, 240, #PB_TrackBar_Vertical)
      TrackBarGadget(#TrackBar_3000, 200, 30, 20, 200, 0, 240, #PB_TrackBar_Vertical)
      TrackBarGadget(#TrackBar_6000, 235, 30, 20, 200, 0, 240, #PB_TrackBar_Vertical)
      TrackBarGadget(#TrackBar_12000, 270, 30, 20, 200, 0, 240, #PB_TrackBar_Vertical)
      TrackBarGadget(#TrackBar_14000, 305, 30, 20, 200, 0, 240, #PB_TrackBar_Vertical)
      TrackBarGadget(#TrackBar_16000, 340, 30, 20, 200, 0, 240, #PB_TrackBar_Vertical)
      TrackBarGadget(#TrackBar_SFX_Vol, 375, 30, 30, 200, 0, 255, #PB_TrackBar_Vertical)
      SetGadgetState(#TrackBar_80,120)
      SetGadgetState(#TrackBar_170,120)
      SetGadgetState(#TrackBar_310,120)
      SetGadgetState(#TrackBar_600,120)
      SetGadgetState(#TrackBar_1000,120)
      SetGadgetState(#TrackBar_3000,120)
      SetGadgetState(#TrackBar_6000,120)
      SetGadgetState(#TrackBar_12000,120)
      SetGadgetState(#TrackBar_14000,120)
      SetGadgetState(#TrackBar_16000,120)
      SetGadgetState(#TrackBar_SFX_Vol,255)
    EndIf
  EndIf
EndProcedure
Procedure Set_EQ_Value(ID.l,Value.f)
  Select ID
    Case 0
      FSOUND_FX_SetParamEQ(EQBand(0), 80, 10, Value)
    Case 1
      FSOUND_FX_SetParamEQ(EQBand(1), 170, 10, Value) 
    Case 2
      FSOUND_FX_SetParamEQ(EQBand(2), 310, 10, Value) 
    Case 3
      FSOUND_FX_SetParamEQ(EQBand(3), 600, 10, Value) 
    Case 4
      FSOUND_FX_SetParamEQ(EQBand(4), 1000, 10, Value) 
    Case 5
      FSOUND_FX_SetParamEQ(EQBand(5), 3000, 10, Value) 
    Case 6  
      FSOUND_FX_SetParamEQ(EQBand(6), 6000, 10, Value) 
    Case 7
      FSOUND_FX_SetParamEQ(EQBand(7), 12000, 10, Value) 
    Case 8  
      FSOUND_FX_SetParamEQ(EQBand(8), 14000, 10, Value) 
    Case 9
      FSOUND_FX_SetParamEQ(EQBand(9), 16000, 10, Value) 
  EndSelect
EndProcedure
Procedure.f Calculate_EQ_Gain(Value.f)
  If Value > 15.00
    temp_value.f = 15.00
    Gain = Value - temp_value
    ProcedureReturn Gain
  ElseIf Value < 15.00
    temp_value.f = -15.00
    Gain = Value + temp_value
    ProcedureReturn Gain
  EndIf
EndProcedure
Procedure NewSoundfile()
  FSOUND_Stream_Stop(sample)
  FSOUND_Stream_Close(sample)

  soundfile.s = OpenFileRequester("Wähle eine Musikdatei (wav, mp3,....)","","",0)
  If soundfile = "" 
    End 
  EndIf
  sample = FSOUND_Stream_Open(soundfile, #FSOUND_LOOP_NORMAL | #FSOUND_HW2D | #FSOUND_ENABLEFX, 0, 0)

  channel = FSOUND_Stream_PlayEx(HardCh_1, sample, 0, #True)
  Debug "----------------------"
  InitEQ() 
  FSOUND_SetPaused(channel, #False)

EndProcedure
soundfile.s = OpenFileRequester("Wähle eine Musikdatei (wav, mp3,....)","","",0)
If soundfile = "" 
  End 
EndIf

FSOUND_SetOutput(#FSOUND_OUTPUT_DSOUND) 

Init_OK = #False
For I=0 To FSOUND_GetNumDrivers() - 1
  FSOUND_GetDriverCaps(I, @caps)
  If caps & #FSOUND_CAPS_HARDWARE
    Init_OK = #True
    FSOUND_SetDriver(I)
    Break
  EndIf
Next
If Init_OK = #False
  MessageRequester("","Es wurde kein Soundtreiber mit Hardwarechannel gefunden", #MB_ICONERROR)
  End
EndIf

numSoftChannels = 2 
HardCh_1 = numSoftChannels + 1 
FSOUND_Init(44100, numSoftChannels,0)
;sample = FSOUND_Sample_Load(#FSOUND_FREE, soundfile, #FSOUND_LOOP_NORMAL | #FSOUND_HW2D | #FSOUND_ENABLEFX, 0, 0) 
sample = FSOUND_Stream_Open(soundfile, #FSOUND_LOOP_NORMAL | #FSOUND_HW2D | #FSOUND_ENABLEFX, 0, 0)

channel = FSOUND_Stream_PlayEx(HardCh_1, sample, 0, #True)
InitEQ() 
FSOUND_SetPaused(channel, #False)

Open_Equalizer()
  Repeat
    Delay(1)
    EventID = WindowEvent()
    If EventID = #PB_EventGadget
      gadget = EventGadgetID()
      If gadget = #TrackBar_80
        Set_EQ_Value(0,Calculate_EQ_Gain(GetGadgetState(#TrackBar_80)/8)) 
      ElseIf gadget = #TrackBar_170
        Set_EQ_Value(1,Calculate_EQ_Gain(GetGadgetState(#TrackBar_170)/8)) 
      ElseIf gadget = #TrackBar_310
        Set_EQ_Value(2,Calculate_EQ_Gain(GetGadgetState(#TrackBar_310)/8)) 
      ElseIf gadget = #TrackBar_600
        Set_EQ_Value(3,Calculate_EQ_Gain(GetGadgetState(#TrackBar_600)/8)) 
      ElseIf gadget = #TrackBar_1000
        Set_EQ_Value(4,Calculate_EQ_Gain(GetGadgetState(#TrackBar_1000)/8)) 
      ElseIf gadget = #TrackBar_3000
        Set_EQ_Value(5,Calculate_EQ_Gain(GetGadgetState(#TrackBar_3000)/8)) 
      ElseIf gadget = #TrackBar_6000
        Set_EQ_Value(6,Calculate_EQ_Gain(GetGadgetState(#TrackBar_6000)/8)) 
      ElseIf gadget = #TrackBar_12000
        Set_EQ_Value(7,Calculate_EQ_Gain(GetGadgetState(#TrackBar_12000)/8)) 
      ElseIf gadget = #TrackBar_14000
        Set_EQ_Value(8,Calculate_EQ_Gain(GetGadgetState(#TrackBar_14000)/8)) 
      ElseIf gadget = #TrackBar_16000
        Set_EQ_Value(9,Calculate_EQ_Gain(GetGadgetState(#TrackBar_16000)/8)) 
      ElseIf gadget = #TrackBar_SFX_Vol
        FSOUND_SetVolumeAbsolute(HardCh_1 ,GetGadgetState(#TrackBar_SFX_Vol))
      ElseIf gadget = #NewSoundfile
        NewSoundfile()
      EndIf 
    EndIf 
    If EventID = #PB_Event_CloseWindow
    FSOUND_Close()
      Quit = 1
    EndIf
  Until Quit = 1
End
Ist das ein bug in der FMOD-Wrapper-Lib oder direkt von FMOD ein bug oder mach ich was falsch?

Danke schon mal

Verfasst: 23.01.2005 22:27
von Froggerprogger
Aus der FMOD-Hilfe zu FSOUND_FX_Enable (okay, leider nur auf Englisch):
A total of 16 FX per channel is allowed, any more will result in an error. FX are reset to 0 after a sound is stopped or played. (but as above, before the unpausing of a play-paused sound).
Warning : This function is expensive to call as it has to set up fx buffers etc. It is best to call it once, reserve the channel then reuse the channel index when calling playsound without calling it again.
Du rufst bei jedem neuen File wieder InitEQ auf, so dass mehr als 16 FX auf den Channel geladen werden.
Entweder brauchst Du InitEQ nicht erneut, da die FX auf dem Channel bleiben, (Du musst nur ggf. die Effekteinstellungen neu setzen) oder aber ein Aufruf von FSOUND_FX_Disable zu Beginn von InitEQ sollte die geladenen FX (sämtliche auf einen Schlag) vom Channel nehmen.

Ich kann das derzeit leider nicht testen, da mein Laptop keine HW-Channel hat, und mein Desktoprechner-Windows kaputt ist.

Lags daran ?

Verfasst: 24.01.2005 12:31
von nicolaus
Danke dir lag daran. Ich rufe jetzt am anfang der InitEQ() erst FSOUND_FX_Disable() auf und damit gehts dann auch super.

THX noch mal für den tip

Gruß Nico