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 :mrgreen: ).
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.

:arrow: 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é