Page 1 sur 1
FMod et Mp3 en DataSection
Publié : jeu. 19/oct./2017 10:29
par jmg49
Bonjour ,
Connaissez vous un moyen plus propre d'extraire un fichier mp3 et le faire jouer par Fmod ?
je ne veux pas le laisser en fichier joint je préfère l'intégrer aux ressources, pour l'instant je me débrouille comme ça :
Code : Tout sélectionner
stub = CreateFile(#PB_Any, "drop.res")
WriteData(stub, ?File, ?EndFile-?File)
CloseFile(stub)
File.s= "drop.res"
FMOD_System_Create(@fmodsystem)
FMOD_System_Init(fmodsystem, 32, #FMOD_INIT_NORMAL, 0)
FMOD_System_CreateStream(fmodsystem, @File, #FMOD_SOFTWARE, 0, @sound)
FMOD_System_PlaySound(fmodsystem, #FMOD_CHANNEL_FREE, sound, 0, @channel)
tout en ajoutant un deletefile("drop.res") en fin de code ....ce n'est pas très joli ...
Merci,
Re: FMod et Mp3 en DataSection
Publié : jeu. 19/oct./2017 13:24
par Ar-S
Pourquoi n'inclus tu pas directement ton fichier. ça marche pas en faisant un truc du genre ?
Code : Tout sélectionner
MonMP3 = ?endMP3-?startMP3
startMP3:
includebinary "test.mp3"
endMP3:
Re: FMod et Mp3 en DataSection
Publié : jeu. 19/oct./2017 13:52
par jmg49
j'inclus mon fichier mp3 comme tu as décris ,
si je le récupère à ta manière , après pour FMOD on a :
Code : Tout sélectionner
FMOD_System_CreateStream(fmodsystem, @File, #FMOD_SOFTWARE, 0, @sound)
et c'est ce @File qui me pose problème, avec l'adresse du fichier passé en File.s = "monmp3.mp3" => @File ok
à ta façon :
Code : Tout sélectionner
MonMP3 = ?endMP3-?startMP3
FMOD_System_CreateStream(fmodsystem, @MonMP3, #FMOD_SOFTWARE, 0, @sound)
pas de son joué et un debug sur la position du fichier musical reste en 0 ...il ne le joue pas
Re: FMod et Mp3 en DataSection
Publié : jeu. 19/oct./2017 13:57
par falsam
Quel version de PureBasic utilises tu ?
Re: FMod et Mp3 en DataSection
Publié : jeu. 19/oct./2017 14:18
par jmg49
J'utilise la v 5.42 LTS x86
Re: FMod et Mp3 en DataSection
Publié : jeu. 19/oct./2017 14:30
par Marc56
Je ne sais pas si cela peut venir de là, mais ne pas oublier le "gag" classique: tout ce qui est musique se joue sur un thread séparé (pour ne pas interférer avec le reste du programme), donc une fois que ton programme a lancé un fichier mp3 il quitte tout de suite s'il n'y a plus rien à faire (pas de boucle) (et le programme principal "kill" le thread de zic' avant qu'il ait eut le temps de dire une note

).
Donc il faut "checker" que la musique soit terminée avant de quitter (ou mettre un horrible Delay(2000) par exemple pour tester)
PS. En LTS, la dernière version est la 5.45
Re: FMod et Mp3 en DataSection
Publié : jeu. 19/oct./2017 23:50
par falsam
Testé avec 5.43 LTS (x86) - X Unicode & 5.61 (x86)
J'ai trouvé l'idée intéressante de charger des sons depuis la DataSection. C'est une bonne idée de protection.
Tu auras besoin de cet include minimal et des dll qui vont avec que j'ai mis à jour il y a moins d'un an.
https://github.com/pbcodex/FMODEX-MIN-UNICODE
Dans les options de compilation de ta version tu coches la
prise en charge Unicode.
A partir de la version 5.60, cette précaution est inutile.
Ce code permet de charger deux sons que j'ai mis en datasection (
Tu mettras les tiens)
Chaque son est mémorisé dans une table Sounds() ce qui permet de les jouer individuellement plus facilement sans les recharger.
Code : Tout sélectionner
EnableExplicit
IncludeFile "fmodex-min.pbi"
#FMOD_OPENMEMORY = $00000800
Structure FMOD_CREATESOUNDEXINFO
cbsize.i ; Size of this structure
length.i ; Size in bytes of file to load
params.i[32] ; Other 32 Parameters
EndStructure
Global FmodSystem.i, Channel.i
Global Dim Sounds(1) ;Two sounds
;Load Sound from DataSection
Procedure FMOD_DataSectionLoadSound(SoundId, SoundLocStart, SoundLocEnd)
Protected exinfo.FMOD_CREATESOUNDEXINFO
exinfo\cbSize = SizeOf(FMOD_CREATESOUNDEXINFO)
exinfo\Length = SoundLocEnd - SoundLocStart
FMOD_System_CreateStream(FmodSystem, SoundLocStart, #FMOD_SOFTWARE | #FMOD_OPENMEMORY, @exinfo, @Sounds(SoundId))
EndProcedure
;Init FMODEX
FMOD_System_Create(@fmodsystem)
FMOD_System_Init(FmodSystem, 32, #FMOD_INIT_NORMAL, 0)
;Load sound
FMOD_DataSectionLoadSound(0, ?forest_start, ?forest_end)
FMOD_DataSectionLoadSound(1, ?dynamite_start, ?dynamite_end)
;Play sound
Debug "Play forest-theme-8-bit.mp3"
FMOD_System_PlaySound(fmodsystem, #FMOD_CHANNEL_FREE, Sounds(0), 0, @channel)
Delay(5000)
Debug "dynamite.mp3"
FMOD_System_PlaySound(fmodsystem, #FMOD_CHANNEL_FREE, Sounds(1), 0, @channel)
Delay(5000)
;Clear all
FMOD_Channel_Stop(Channel)
FMOD_System_Release(FmodSystem)
DataSection
forest_start:
IncludeBinary "forest-theme-8-bit.mp3"
forest_end:
dynamite_start:
IncludeBinary "dynamite.mp3"
dynamite_end:
EndDataSection
Un défaut que je n'ai pas compris. Ce code ne fonctionne pas avec une version 64bits de PureBasic.
http://falsam.com/Download/purebasic/FM ... nSound.zip (
Codes + DLLs + Media 1.44 Mo)
Re: FMod et Mp3 en DataSection
Publié : ven. 20/oct./2017 10:45
par jmg49
Merci Falsam !!
c'est ça qu'il me manquait , la procédure Procedure FMOD_DataSectionLoadSound(SoundId, SoundLocStart, SoundLocEnd)
et donc plus besoin d'extraire le mp3 de la DataSection et ensuite effacer le fichier,
j'ai besoin de la fonction FMOD_Channel_GetWaveData() qui n'est pas dans ton fmodex-min.pbi mais qui est dans fmodex.pbi
je l'ai donc rajoutée à la liste des fonctions dans le fmodex-min.pbi
Code : Tout sélectionner
Prototype.l FMOD_System_GetWaveData_Prototype (system.l, *Wavearray, Numvalues.l, Channeloffset.l)
Global FMOD_System_GetWaveData.FMOD_System_GetWaveData_Prototype
FMOD_System_GetWaveData = GetFunction(fmodLib, "FMOD_System_GetWaveData")
et tout va bien !!
Merci pour votre réactivité