Bonjour, je profite du topic pour partager quelques sources d'un travail effectué sur FMOD et les imports sous environnement windows.
Les imports sont assez nouveau pour moi, mais visiblement j'ai réussi à faire quelque chose qui marche, donc je partage la méthode, si d'autres veulent la reprendre.
( Si un modo pense que sujet à sa place ailleur, faite vous plaisir )
Tout d'abord pour importer une lib et pouvoir l'utiliser dans PB, il faut la récupérer. Cela veut dire qu'il faut bien sur que la société ou la personne developpant ce dont vous avez besoin ai "fabriquer" la library. Dans mon exemple avec FMOD version 4.38 , c'est le cas :
Rendez vous donc toute d'abord sur le site
http://www.fmod.org , section "Download", et telecharger "FMOD Ex Programmers API" en raport avec votre plateforme ( moi c'est windows ).
Une fois le produit téléchargé et installé , vous aurez accès à quelques programmes ayant surement une utilité, mais qui ne nous interesse pas dans le cadre de cette exemple.
Rendez-vous dans le dossier d'installation du programme ( sur un windows 7 c'est par defaut C:\Program Files (x86)\FMOD SoundSystem\FMOD Programmers API Windows ). Vous y trouverez un dossier "api" , qui contient ce qui nous interesse à savoir :
- un fichier "Fmodex.dll"
- un dossier lib contenant, entre autre, un fichier "fmodex_vc.lib"
Copier ces 2 fichiers dans un dossier que vous aller creer pour votre projet ( soit un projet PB ou plus simplement un fichier ".pb").
Notez au passage dans le dossier d'install de l'API un dossier documentation contenant le fichier "fmodex.chm", vous pouvez dès maintenant l'ouvrir en double cliquant dessus, vous en aurez besoin. Il s'agit du fichier d'aide de l'API contenant toutes les références aux fonctions, enumérations, variables, procédures que nous pourrons importer.
Copier également un fichier style "mp3" ( ou autre format, comme "wav" par exemple ) trouver sur votre HD ( allez , j'suis sur que vous en avez au moins 1
) dans le dossier de travail pour tester le son
Une fois la librarie récupérée et mise de coter dans un dossier de travail, il vous reste à creer le code PureBasic pour l'importation.
Creer donc au moins un fichier ".pb" pour votre code ( moi j'en ai creer 2 , un fichier ".pbi" qui va contenir les Enumerations et code d'import , et le fichier contenant le programme principal,auquel j'ai inclut le fichier ".pbi" )
Je vous livre ici mes 2 fichiers sources de test de l'import :
fichier : fmod.pb
Code : Tout sélectionner
EnableExplicit
XIncludeFile "fmodex_import.pbi"
;- Enumeration
;- Variable
Global fmodsystem.l,channel.l,SoundPause.b=#False,Fmod_SoundVolume.a=100
Global sound
Define fmodversion.l
;- Procedure
Procedure Close_Appli()
Debug FMOD_System_Release(fmodsystem)
End
EndProcedure
Procedure GetKeyBoard()
ExamineKeyboard()
If KeyboardReleased(#PB_Key_Escape)
Close_Appli()
EndIf
If KeyboardReleased(#PB_Key_Space)
If SoundPause
SoundPause=#False
Debug FMOD_Channel_SetPaused(channel,SoundPause)
Else
SoundPause=#True
Debug FMOD_Channel_SetPaused(channel,SoundPause)
EndIf
EndIf
If KeyboardReleased(#PB_Key_PageUp)
If Fmod_SoundVolume < 100
Fmod_SoundVolume + 10
FMOD_Channel_SetVolume(channel,(Fmod_SoundVolume / 100))
EndIf
ElseIf KeyboardReleased(#PB_Key_PageDown)
If Fmod_SoundVolume > 0
Fmod_SoundVolume - 10
FMOD_Channel_SetVolume(channel,(Fmod_SoundVolume / 100))
EndIf
EndIf
EndProcedure
;- Init
InitSprite()
InitKeyboard()
OpenWindow(0,0,0,1024,768,"test import FMOD",#PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget)
OpenWindowedScreen(WindowID(0),0,0,1024,768,1,0,0)
KeyboardMode(#PB_Keyboard_International)
Debug FMOD_System_Create(@fmodsystem)
FMOD_System_GetVersion(fmodsystem,@fmodversion) : Debug "version=" + Str(fmodversion)
Debug FMOD_System_init(fmodsystem,2,#FMOD_INIT_NORMAL,0)
Debug FMOD_System_CreateSound(fmodsystem,"votrefichiersonMP3-WAV-autrefomat.mp3",#FMOD_DEFAULT,0,@sound)
Debug FMOD_System_PlaySound(fmodsystem,0,sound,0,@channel)
;- Main Loop
Repeat
Select WindowEvent()
Case #PB_Event_CloseWindow
Close_Appli()
EndSelect
GetKeyBoard()
ClearScreen($CCCCCC)
StartDrawing(ScreenOutput())
DrawText(512,300,FormatDate("%hh:%mm:%ss",Date()))
DrawText(512,320,Str(Fmod_SoundVolume) + " %")
If SoundPause : DrawText(512,340,"PAUSE") : EndIf
StopDrawing()
FlipBuffers()
ForEver
fichier : Fmodex_import.pbi
Code : Tout sélectionner
; *****************
; *** FMODEX IMPORT PBI
; *** By Jem October 2011
;******************
;- Enumeration
; FMOD RESULT
Enumeration
#FMOD_OK
#FMOD_ERR_ALREADYLOCKED
#FMOD_ERR_BADCOMMAND
#FMOD_ERR_CDDA_DRIVERS
#FMOD_ERR_CDDA_INIT
#FMOD_ERR_CDDA_INVALID_DEVICE ;5
#FMOD_ERR_CDDA_NOAUDIO
#FMOD_ERR_CDDA_NODEVICES
#FMOD_ERR_CDDA_NODISC
#FMOD_ERR_CDDA_READ
#FMOD_ERR_CHANNEL_ALLOC ;10
#FMOD_ERR_CHANNEL_STOLEN
#FMOD_ERR_COM
#FMOD_ERR_DMA
#FMOD_ERR_DSP_CONNECTION
#FMOD_ERR_DSP_FORMAT ;15
#FMOD_ERR_DSP_NOTFOUND
#FMOD_ERR_DSP_RUNNING
#FMOD_ERR_DSP_TOOMANYCONNECTIONS
#FMOD_ERR_FILE_BAD
#FMOD_ERR_FILE_COULDNOTSEEK ;20
#FMOD_ERR_FILE_DISKEJECTED
#FMOD_ERR_FILE_EOF
#FMOD_ERR_FILE_NOTFOUND
#FMOD_ERR_FILE_UNWANTED
#FMOD_ERR_FORMAT ;25
#FMOD_ERR_HTTP
#FMOD_ERR_HTTP_ACCESS
#FMOD_ERR_HTTP_PROXY_AUTH
#FMOD_ERR_HTTP_SERVER_ERROR
#FMOD_ERR_HTTP_TIMEOUT ;30
#FMOD_ERR_INITIALIZATION
#FMOD_ERR_INITIALIZED
#FMOD_ERR_INTERNAL
#FMOD_ERR_INVALID_ADDRESS
#FMOD_ERR_INVALID_FLOAT ;35
#FMOD_ERR_INVALID_HANDLE
#FMOD_ERR_INVALID_PARAM
#FMOD_ERR_INVALID_POSITION
#FMOD_ERR_INVALID_SPEAKER
#FMOD_ERR_INVALID_SYNCPOINT ;40
#FMOD_ERR_INVALID_VECTOR
#FMOD_ERR_MAXAUDIBLE
#FMOD_ERR_MEMORY
#FMOD_ERR_MEMORY_CANTPOINT
#FMOD_ERR_MEMORY_SRAM ;45
#FMOD_ERR_NEEDS2D
#FMOD_ERR_NEEDS3D
#FMOD_ERR_NEEDSHARDWARE
#FMOD_ERR_NEEDSSOFTWARE
#FMOD_ERR_NET_CONNECT ;50
#FMOD_ERR_NET_SOCKET_ERROR
#FMOD_ERR_NET_URL
#FMOD_ERR_NET_WOULD_BLOCK
#FMOD_ERR_NOTREADY
#FMOD_ERR_OUTPUT_ALLOCATED ;55
#FMOD_ERR_OUTPUT_CREATEBUFFER
#FMOD_ERR_OUTPUT_DRIVERCALL
#FMOD_ERR_OUTPUT_ENUMERATION
#FMOD_ERR_OUTPUT_FORMAT
#FMOD_ERR_OUTPUT_INIT ;60
#FMOD_ERR_OUTPUT_NOHARDWARE
#FMOD_ERR_OUTPUT_NOSOFTWARE
#FMOD_ERR_PAN
#FMOD_ERR_PLUGIN
#FMOD_ERR_PLUGIN_INSTANCES ;65
#FMOD_ERR_PLUGIN_MISSING
#FMOD_ERR_PLUGIN_RESOURCE
#FMOD_ERR_PRELOADED
#FMOD_ERR_PROGRAMMERSOUND
#FMOD_ERR_RECORD ;70
#FMOD_ERR_REVERB_INSTANCE
#FMOD_ERR_SUBSOUND_ALLOCATED
#FMOD_ERR_SUBSOUND_CANTMOVE
#FMOD_ERR_SUBSOUND_MODE
#FMOD_ERR_SUBSOUNDS ;75
#FMOD_ERR_TAGNOTFOUND
#FMOD_ERR_TOOMANYCHANNELS
#FMOD_ERR_UNIMPLEMENTED
#FMOD_ERR_UNINITIALIZED
#FMOD_ERR_UNSUPPORTED ;80
#FMOD_ERR_UPDATE
#FMOD_ERR_VERSION
#FMOD_ERR_EVENT_FAILED
#FMOD_ERR_EVENT_INFOONLY
#FMOD_ERR_EVENT_INTERNAL ;85
#FMOD_ERR_EVENT_MAXSTREAMS
#FMOD_ERR_EVENT_MISMATCH
#FMOD_ERR_EVENT_NAMECONFLICT
#FMOD_ERR_EVENT_NOTFOUND
#FMOD_ERR_EVENT_NEEDSSIMPLE ;90
#FMOD_ERR_EVENT_GUIDCONFLICT
#FMOD_ERR_EVENT_ALREADY_LOADED
#FMOD_ERR_MUSIC_UNINITIALIZED
#FMOD_ERR_MUSIC_NOTFOUND
#FMOD_ERR_MUSIC_NOCALLBACK ;95
EndEnumeration
;FMOD_INIT_FLAG
Enumeration
#FMOD_INIT_NORMAL=$0
#FMOD_INIT_STREAM_FROM_UPDATE=$1
#FMOD_INIT_3D_RIGHTHANDED=$2
#FMOD_INIT_SOFTWARE_DISABLE=$4
#FMOD_INIT_OCCLUSION_LOWPASS=$8
#FMOD_INIT_HRTF_LOWPASS=$10
#FMOD_INIT_DISTANCE_FILTERING=$200
#FMOD_INIT_SOFTWARE_REVERB_LOWMEM=$40
#FMOD_INIT_ENABLE_PROFILE=$20
#FMOD_INIT_VOL0_BECOMES_VIRTUAL=$80
#FMOD_INIT_WASAPI_EXCLUSIVE=$100
#FMOD_INIT_PS3_PREFERDTS=$800000
#FMOD_INIT_PS3_FORCE2CHLPCM=$1000000
#FMOD_INIT_DISABLEDOLBY=$100000
#FMOD_INIT_SYSTEM_MUSICMUTENOTPAUSE=$200000
#FMOD_INIT_SYNCMIXERWITHUPDATE=$400000
#FMOD_INIT_GEOMETRY_USECLOSEST=$4000000
#FMOD_INIT_DISABLE_MYEARS_AUTODETECT=$8000000
EndEnumeration
;FMOD_MODE ==> CreateSOund
Enumeration
#FMOD_DEFAULT=$00000000
#FMOD_LOOP_OFF=$00000001
#FMOD_LOOP_NORMAL=$00000002
#FMOD_LOOP_BIDI=$00000004
#FMOD_2D=$00000008
#FMOD_3D=$00000010
#FMOD_HARDWARE=$00000020
#FMOD_SOFTWARE=$00000040
#FMOD_CREATESTREAM=$00000080
#FMOD_CREATESAMPLE=$00000100
#FMOD_CREATECOMPRESSEDSAMPLE=$00000200
#FMOD_OPENUSER=$00000400
#FMOD_OPENMEMORY=$00000800
#FMOD_OPENMEMORY_POINT=$10000000
#FMOD_OPENRAW=$00001000
#FMOD_OPENONLY=$00002000
#FMOD_ACCURATETIME=$00004000
#FMOD_MPEGSEARCH=$00008000
#FMOD_NONBLOCKING=$00010000
#FMOD_UNIQUE=$00020000
#FMOD_3D_HEADRELATIVE=$00040000
#FMOD_3D_WORLDRELATIVE=$00080000
#FMOD_3D_INVERSEROLLOFF=$00100000
#FMOD_3D_LINEARROLLOFF=$200000
#FMOD_3D_LINEARSQUAREROLLOFF=$400000
#FMOD_3D_CUSTOMROLLOFF=$4000000
#FMOD_3D_IGNOREGEOMETRY=$40000000
#FMOD_UNICODE=$1000000
#FMOD_IGNORETAGS=$2000000
#FMOD_LOWMEM=$8000000
#FMOD_LOADSECONDARYRAM=$20000000
#FMOD_VIRTUAL_PLAYFROMSTART=$80000000
EndEnumeration
;- Variable
;- Main
Import "fmodex_vc.lib"
;FMOD_System_Create.l (*system) As "_FMOD_System_Create@4"
FMOD_System_Create.l(*system)
FMOD_System_Release.l(*system)
FMOD_System_GetVersion.l(*system,*version)
FMOD_System_Init.l(*system,NbrChannel.l,flags.l,*extradriverdata)
FMOD_System_CreateSound.l(*system,name_or_data.s,mode.l,exinfo.l,*sound)
FMOD_System_PlaySound.l(*system,channelid.l,*sound,paused.b,*channel)
FMOD_Channel_SetPaused.l(chanel.l,paused.b)
FMOD_Channel_SetVolume.l(chanel.l,volume.f)
EndImport
Détail du code :
Le code est sale ( comme mon orthographe ! ) pas forcément très bien organiser, c'est un code vite fait pour tester l'import de procédure.
Pensez à changer le nom du fichier à écouter dans la source "fmod.pb" lors de l'appel de la fonction : FMOD_System_CreateSound
les "Debug" présent devant chaque ligne servent juste à afficher le retour de la fonction appelée de façon simple. Il convient de creer une jolie procedure si vous voulez rendre les choses plus "académique".
J'ai numéroté de 5 en 5 les valeurs de l'enumération "#FMOD_ERR_" dans le fichier "fmod_import.pbi" pour retrouver facilement le code d'erreur.
La principal question que j'ai souvent vu sur le forum et que je me posais moi il y a encore 2 jours, c'est comment on importe une librarie sous PB.
Voici la méthode que j'ai utilisé : ce n'est pas la meilleur méthode , c'est juste comment j'ai compris le fonctionnement du bousin.
Dans le fichier "Fmodex_import.pbi" vous trouvez en bas la section princpal de l'import. Sous PB on utilise les mots clés Import "nomdufichier.lib" EndImport dans lequel nous allons spécifier le nom des procédure que nous allons utiliser sous PB. Ces procédures doivent correpondre à fonction "enregistrée" dand le fichier lib ( qui lui mème fait appel au fichier .DLL )
Il suffit pour cela de nommer la procédure avec le nom de votre choix avec la syntaxe PureBasic
exemple : MaProcédure.l(argument1.s,arguement2.l,etc ......) et du lui faire correspondre la signature de la fonction du fichier avec le mot clef As "_nomdelafonctionaimporter@tailledesarguments"
Je vous renvoie à la doc PB pour une meilleur explication des mot clée "Import EndImport"
Quand la fonction à importer correspond au "préfix" que va rajouter automatiquement PB pour essayer d'importer la fonction , il n'y a pas besoin de spécifier le parametre "As".
Maintenant pour connaitre le "nom" des fonctions à importer , c'est la que le fichier d'aide de l'API "fmodex.chm" va nous aider. Il contient la liste de toute les fonctions et Constantes/variables utilisées par l'API. Il suffit donc de chercher la fonction que l'on désire importer dans l'aide, et de coper/coller sa déclaration dans votre section "Import" et de faire les modifications necessairent pour la faire correspondre à la syntaxe PB.
Exemple :
je recherche la fonction setVolume ; il y à plusieurs entrées dans le fichier d'aide de l'Api, on prend celle s'appliquant aux "channel", le code C de la fonction est le suivant :
Code : Tout sélectionner
FMOD_RESULT FMOD_Channel_SetVolume( FMOD_CHANNEL * channel, float volume);
FMOD_RESULT ===> Type de la variable de retour de la fonction ( c'est en faite un entier, qui retourne une valeur correspondant a l'enumeration "FMOD_RESULT"
FMOD_Channel_SetVolume ===> nom de la fonction à importer
FMOD_CHANNEL * channel ===> arguement "channe"l de type FMOD_CHANNEL ( un entier )
float volume ===> argument "volume" de type Float
Traduction en PB :
Voila nous venons d'importer une fonction utilisable dans PB.
Reste à comprendre comment marche l'API , donc il faut se repporter aux exemples fournis dans le fichier d'aide et trouvable sur le Net, mais qui seront dans d'autre language ( C , C++, C# )
Il suffit de comprendre le cheminement des fonctions necessaires et d'importer les fonctions nécésaaires. Il n'y a pas besoin d'importer toutes les fonctions, juste celles necessaires à votre projet.
Vous pouvez également creer les énumérations et variables portant le meme nom que dans l'API afin de les utiliser. Pour cela il faut trouver leur définition dans le fichier d'aide ( généralement un lien sur la page d'aide la fonction décrite vous amene vers la description du type de variable ) , de copier/coller le code, et de l'adapter à la syntaxe PB.
Fmod publie également un logiciel appeler FMod Designer, permetant de réaliser le montage des sons necessaire à votre projet qui pourront etre sujet à modification en temps réelle en fonction de parametres. Tout l'interet de l'utilisation de cette librairie est là.
Pour utiliser "ces banques sons" avec le moteur Fmod, il faut utiliser l'API de "fmodDesigner" , que vous trouver dans le dossier "fmoddesignerapi"
En épérant que cela aide.
Dans mon projet PureSprint cela me sert pour le son du moteur de la voiture, le son doit varier en fonction de la vitesse de la voiture, qui change tres souvent.
L'utilisation de la lib "Sound" inclu dans PB ne me permetait pas ce genre de chose , et l'utilisation des modules semble etre une technique totalement dépasser et les outils disponibles pour la création de fichier module semble venir d'un autre temps
( avis personnel hein !! )
La License d'utlisation de Fmod est asssez souple, pour le developpement "maison", du genre tant que c'est gratuit et que vous gagnez pas d'argent avec votre projet, faite vous plaisir avec leur API.
@++ dans le bus