J'ai bien progressé sur la compréhension de FMOD. Pour pouvoir effectuer le remplacement des fonctions natives Sound de Purebasic dans mon projet, j'aurai besoin de savoir comment déterminer qu'un fichier est stoppé. En clair qu'il a fini d'être lu. Je ne trouve rien dans la lib de FMOD.
Code : Tout sélectionner
; ----------------------------------------------------------------------
;
; FMOD SOUND Pour Radio les Floralies
;
; ----------------------------------------------------------------------
; Hubert BAYRE : hubert.bayre@wanadoo.fr
; avril 2021
EnableExplicit
IncludeFile "fmodex.pbi"
;IncludeFile "fmodex(short).pbi"
#TIMER01 = 1
Global gFini
Global fmodsystem.i
Structure Son_fmod_struct
Url.s
Channel.i
Sound.i
Volume.f
PauseStatus.b
EndStructure
Global gSonLu.Son_fmod_struct
; ----------------------------------------------------------------------
;
; FENETRE
;
; ----------------------------------------------------------------------
Global Window_0
Global Text_message, Button_pause, TrackBar_volume, Button_lecture, Button_Stop, Button_fichier
Procedure OpenWindow_0(x = 0, y = 0, width = 550, height = 230)
Window_0 = OpenWindow(#PB_Any, x, y, width, height, "Radio Les Floralies - Lecteur", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered | #PB_Window_WindowCentered)
Text_message = TextGadget(#PB_Any, 20, 140, 520, 25, "", #PB_Text_Center)
SetGadgetColor(Text_message, #PB_Gadget_FrontColor,RGB(255,255,255))
SetGadgetColor(Text_message, #PB_Gadget_BackColor,RGB(125,0,245))
Button_pause = ButtonGadget(#PB_Any, 220, 50, 90, 60, "PAUSE")
TrackBar_volume = TrackBarGadget(#PB_Any, 10, 20, 530, 25, 0, 10)
Button_lecture = ButtonGadget(#PB_Any, 120, 50, 90, 60, "LECTURE")
Button_Stop = ButtonGadget(#PB_Any, 320, 50, 90, 60, "STOP")
Button_fichier = ButtonGadget(#PB_Any, 20, 50, 90, 60, "FICHIER...")
EndProcedure
; ----------------------------------------------------------------------
;
; PROCEDURES
;
; ----------------------------------------------------------------------
Procedure FMod_Initialiser()
;Déclarer l'objet FMOD System
FMOD_System_Create(@fmodsystem)
;Initialiser le system (32 canaux) un seul suffirait pour cet exemple
FMOD_System_Init(fmodsystem, 32, #FMOD_INIT_NORMAL, 0)
EndProcedure
Procedure FMOD_charger_son (Url$)
Define Id_son
;CreateStream permet de commencer la lecture avant le chargement complet de l'url
FMOD_System_CreateStream(fmodsystem, Ascii(Url$), #FMOD_CREATESTREAM, 0, @Id_son)
ProcedureReturn Id_son
EndProcedure
Procedure.s Convertion_affichage_temps (ms)
Define Resultat$
Define Minutes
Define Secondes
Define Heures
Define Secondes$
Define Minutes$
Define Heures$
Secondes = Mod (Int (ms / 1000),60)
Minutes = Mod (Int(ms / 60000),60)
Heures = Mod (Int(ms / 3600000),60)
If Secondes < 10
Secondes$ = "0" + Str(Secondes)
Else
Secondes$ = Str(Secondes)
EndIf
If Minutes < 10
Minutes$= "0" + Str(Minutes)
Else
Minutes$ = Str(Minutes)
EndIf
If Heures < 10
Heures$ = "0" + Str(Heures)
Else
Heures$ = Str(Heures)
EndIf
If Heures > 0
Resultat$ = heures$ + ":" + minutes$ + ":" + secondes$
Else
If Minutes > 0
Resultat$ = minutes$ + ":" + secondes$
Else
If Secondes > 0
Resultat$ = secondes$ + "s"
EndIf
EndIf
EndIf
ProcedureReturn Resultat$
EndProcedure
Procedure Afficher_message (Message$)
SetGadgetText (Text_message, Message$)
EndProcedure
Procedure Quitter()
Define Result
Result = MessageRequester("Quitter Radio Les FLoralies", "Nous Quitter ? Veuillez faire votre choix !", #PB_MessageRequester_YesNo)
If Result = #PB_MessageRequester_Yes
ProcedureReturn 1
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure Initialiser()
SetGadgetState(TrackBar_volume, 5)
EndProcedure
Procedure FMOD_Jouer_son(*Son.Son_fmod_struct, Volume)
;On joue le son sur le canal 1
FMOD_System_PlaySound(fmodsystem, 1, *Son\Sound, 0, @*Son\Channel)
;Et on ajuste le volume (le son est compris entre 0.0 et 1.0)
*Son\Volume = Volume
FMOD_Channel_SetVolume(*Son\Channel, Volume)
EndProcedure
Procedure FMOD_Arreter_son (*Son.Son_fmod_struct)
FMOD_Channel_Stop(*Son\Channel)
EndProcedure
Procedure.i FMOD_DonnerPosition (*Son.Son_fmod_struct)
; Retourne la position en ms du fichier sonore lu
Define CurrentPos
Define Resultat
FMOD_Channel_IsPlaying(*Son\Channel,@Resultat)
If Resultat = #True
FMOD_Channel_GetPosition(*Son\Channel,@CurrentPos,1)
Else
Resultat = -1
EndIf
ProcedureReturn Resultat
EndProcedure
Procedure FMOD_Donner_duree_son(*Son.Son_fmod_struct)
Define Duree
If *Son\Sound <> 0
FMOD_Sound_GetLength (*Son\Sound, @Duree, #FMOD_TIMEUNIT_MS)
Else
Duree = -1
EndIf
ProcedureReturn Duree
EndProcedure
Procedure FMOD_Changer_volume (*Son.Son_fmod_struct, Volume)
*Son\Volume = Volume
FMOD_Channel_SetVolume(*Son\Channel, Volume)
EndProcedure
Procedure FMOD_Basculer_pause (*Son.Son_fmod_struct)
FMOD_Channel_GetPaused(*Son\Channel, @*Son\PauseStatus)
If *Son\PauseStatus = #False
FMOD_Channel_SetPaused(*Son\Channel, #True) ;Pause
Else
FMOD_Channel_SetPaused(*Son\Channel, #False) ;Reprise de la lecture
EndIf
EndProcedure
Procedure FMOD_Fermer_son (*Son.Son_fmod_struct)
FMOD_Channel_Stop(*Son\Channel)
EndProcedure
Procedure FMOD_fermer()
FMOD_System_Release(fmodsystem)
EndProcedure
Procedure.b FMOD_Determiner_EnPause (*Son.Son_fmod_struct)
; Retourne #True si en Pause, #False sinon
Define IsPaused
FMOD_Channel_GetPaused(*Son\Channel, @IsPaused)
*Son\PauseStatus = IsPaused
ProcedureReturn IsPaused
EndProcedure
Procedure.b FMOD_Determiner_EnLecture (*Son.Son_fmod_struct)
; Retourne #True si en Pause, #False sinon
Define IsPlaying
FMOD_Channel_IsPlaying(*Son\Channel, @IsPlaying)
ProcedureReturn IsPlaying
EndProcedure
Procedure.b FMOD_Determiner_EstArrete (*Son.Son_fmod_struct)
; Retourne #True si en Pause, #False sinon
Define IsStopped
;FMOD_Channel_IsStopped(*Son\Channel, @IsPlaying)
ProcedureReturn IsStopped
EndProcedure
Procedure Charger_son()
Protected StandardFile$
Protected Pattern$
Protected Pattern
Protected NomFichier$
StandardFile$ = "son.ogg"
Pattern$ = "Fichier sonore (*.ogg)|*.ogg|All files (*.*)|*.*"
Pattern = 0
NomFichier$ = OpenFileRequester("Fichier sonore", StandardFile$, Pattern$, Pattern)
If NomFichier$ <> ""
gSonLu\Url = NomFichier$
gSonLu \Sound = FMOD_charger_son (NomFichier$)
SetGadgetText (Text_message,"A lire : '" + NomFichier$ + "'")
Else
MessageRequester("Erreur de chemin", "Impossible de charger le fichier sonore !", 0)
EndIf
EndProcedure
; ----------------------------------------------------------------------
;
; PROGRAMME PRINCIPAL
;
; ----------------------------------------------------------------------
OpenWindow_0(0,0)
SetWindowTitle (Window_0, "Radio Les Floralies : Test ")
AddWindowTimer(Window_0, #TIMER01, 1000)
Afficher_message ("Bienvenue - hubert.bayre@orange.fr - version 1.0")
FMOD_Initialiser()
SetGadgetText (Text_message,"Choisissez une fichier à lire...")
Initialiser()
Repeat
Select WaitWindowEvent(1)
Case #PB_Event_CloseWindow
gFini = Quitter()
Case #PB_Event_Gadget ; on a reçu un message en provenance d'un gadget PureBasic
Select EventGadget()
Case Button_fichier
Charger_son()
Case Button_stop
FMOD_Arreter_son (gSonLu)
Case Button_pause
FMOD_Basculer_pause (gSonLu)
Case Button_lecture
FMOD_Jouer_son (gSonLu, 0.5)
Case TrackBar_volume
Define Volume
Volume = GetGadgetState(TrackBar_volume)/10
FMOD_Changer_volume(gSonLu, Volume)
EndSelect
Case #PB_Event_Timer
Select EventTimer()
Case #TIMER01
;
EndSelect
EndSelect
FMOD_DonnerPosition (gSonLu)
Until gFini
FMOD_Fermer()