FMod et Mp3 en DataSection

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
jmg49
Messages : 153
Inscription : mer. 26/févr./2014 8:53

FMod et Mp3 en DataSection

Message 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,
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: FMod et Mp3 en DataSection

Message 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:
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
jmg49
Messages : 153
Inscription : mer. 26/févr./2014 8:53

Re: FMod et Mp3 en DataSection

Message 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
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: FMod et Mp3 en DataSection

Message par falsam »

Quel version de PureBasic utilises tu ?
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
jmg49
Messages : 153
Inscription : mer. 26/févr./2014 8:53

Re: FMod et Mp3 en DataSection

Message par jmg49 »

J'utilise la v 5.42 LTS x86
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: FMod et Mp3 en DataSection

Message 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
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: FMod et Mp3 en DataSection

Message 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)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
jmg49
Messages : 153
Inscription : mer. 26/févr./2014 8:53

Re: FMod et Mp3 en DataSection

Message 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é
Répondre