FMOD

Résolu
cs_parki Messages postés 75 Date d'inscription mardi 29 juillet 2008 Statut Membre Dernière intervention 25 mars 2019 - 16 sept. 2012 à 11:46
cs_parki Messages postés 75 Date d'inscription mardi 29 juillet 2008 Statut Membre Dernière intervention 25 mars 2019 - 22 sept. 2012 à 08:32
Bonjour,
j'essai d'utiliser la librairie FMODex avec masm
mais je n'arrive pas à trouver la definition de FMOD_SYSTEM dans la doc de FMOD.

Dans fmod.h j'ai ;
typedef struct FMOD_SYSTEM FMOD_SYSTEM
mais où est défini la struct FMOD_SYSTEM ?

En c,ils utilisent le code suivant pour initialiser un objet FMOD;

FMOD_SYSTEM *system
puis
FMOD_System_Create(&system)

Comment faire ?

17 réponses

cs_parki Messages postés 75 Date d'inscription mardi 29 juillet 2008 Statut Membre Dernière intervention 25 mars 2019
22 sept. 2012 à 08:32
Bizarre,

en utilisant _getch de msvcr100.dll,ça ne marche pas sur mon pc (aucun problème de liage,mais pas de son !)

j'ai ensuite repris mon programme et je n'ai plus mis la partie FMOD lors de la création de la fenêtre mais uniquement lors de la pression d'une touche et là ça marche .....Bizarre

je poste tout ça,
Encore merci pour ton aide ToutEnMasm
3
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
18 sept. 2012 à 14:42
Ah,la,la : Quand on a le programme en c,on a aussi le programme en assembleur.
Dans les propriétés du projet , rajouter /Fa dans la ligne de commande de vc++.
Il produit un .asm,recompilable,c'est aussi simple que cela.
"je ne trouve pas la definition de la structure".
Le programme c a forcément un .h avec la structure de définit.
Utiliser le traducteur "editmasm" pour les sdk,remplacer les "PROTO" par "PROTO C" avec notepad.
Et tout doit gazouiller.
0
cs_parki Messages postés 75 Date d'inscription mardi 29 juillet 2008 Statut Membre Dernière intervention 25 mars 2019
18 sept. 2012 à 15:09
Merci pour ta réponse ToutEnMasm,je vais appliquer tes conseils et voir si j'y arrive.
0
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
18 sept. 2012 à 15:33
J'ai téléchargé le "fmod programmers api" et traduit vite fait le fmod.h avec le traducteur d'editmasm.
une seule variable inconnue:
FMOD_DSP_TYPE 1933 (ligne 1933 de fmod.h) devant se trouver dans un autre header.
Sinon prototypes , constantes..structures sont traduites.
Headinc est le nom du traducteur.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_parki Messages postés 75 Date d'inscription mardi 29 juillet 2008 Statut Membre Dernière intervention 25 mars 2019
18 sept. 2012 à 16:36
Je dois être très très c.. mais je ne trouve toujours pas la definition de la struct FMOD_SYSTEM.

je veux traduire en masm l'exemple C PLAYSOUND du sdk de FMOD qui commence comme suit;

;----------------------------
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include "fmod.h"
#include "fmod_errors.h"

void ERRCHECK(FMOD_RESULT result)
{
if (result != FMOD_OK)
{
printf("FMOD error! (%d) %s\n", result, FMOD_ErrorString(result));
exit(-1);
}
}
int main(int argc, char *argv[])
{
FMOD_SYSTEM *system;
FMOD_SOUND *sound1, *sound2, *sound3;
FMOD_CHANNEL *channel = 0;
FMOD_RESULT result;
int key;
unsigned int version;

/*
Create a System object and initialize.
*/
result = FMOD_System_Create(&system);
ERRCHECK(result);
etc ...
----------------------

En traduisant le fichiers fmod.h et fmod_errors.h grâce à ton traducteur (très bien fait par ailleurs),les lignes suivantes
du fichier fmod.h n'apparaissent pas dans le fichiers traduit;

/*
FMOD types.
*/

typedef int FMOD_BOOL;
typedef struct FMOD_SYSTEM FMOD_SYSTEM;
typedef struct FMOD_SOUND FMOD_SOUND;
typedef struct FMOD_CHANNEL FMOD_CHANNEL;
etc..


L'autre fichier fmod_errors.h ne contient pas non plus de reference à la structure FMOD_SYSTEM.
Cette structure est indispensable pour initialiser FMOD;

FMOD_SYSTEM *system
result = FMOD_System_Create(&system)

Le prog PLAYSOUND en C fonctionne parfaitement
avec VISUAL C++ express 2008,elle doit donc bien se trouver quelque part ???

je ne connais pas grand chose en C,(la preuve)
mais qu'est ce que je n'ai pas compris ?
(PLAYSOUND utilise la lib fmod.dll et fmodex_vc.lib)
0
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
18 sept. 2012 à 17:34
Si j'en crois la suite de :
FMOD_System_Create
FMOD_System_Release....
FMOD_System serait un simple pointeur d'interface.
Un dword suffit pour ça.

FMOD_System_GetDriverInfo (FMOD_SYSTEM *system, int id, char *name, int namelen, FMOD_GUID *guid);
on crée une class FMOD_System et on met dedans tous les protos utilisés.
Inutile de chercher la structure FMOD_System.
la syntaxe FMOD_System_GetDriverInfo est créé en general par midl.
On peut aussi trouver la syntaxe:
FMOD_System->GetDriverInfo(,,) le plus souvent utilisé dans les liens dynamiques.
0
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
18 sept. 2012 à 18:09
Un petit coup de pouce pour démarrer:
typedef struct FMOD_SYSTEM FMOD_SYSTEM;
içi on est content de savoir que c'est une structure dans la librairie

PRATIQUE:
FMOD_SYSTEM *system
en assembleur:
.data
system dd 0
result dd 0
.code
;result = FMOD_System_Create(&system)
invoke FMOD_System_Create,addr system
; ----- et maintenant on utilise le pointeur.
;result = FMOD_System_GetVersion(system, &version)
/FA
lea edx, DWORD PTR _version$[ebp]
push edx
mov eax, DWORD PTR _system$[ebp]
push eax
call ?getVersion@System@FMOD@@QAG?AW4FMOD_RESULT@@PAI@Z ; FMOD::System::getVersion
mov DWORD PTR _result$[ebp], eax
; masm syntaxe
;?getVersion@System@FMOD@@QAG? est décoré ;comme un sapin de noël.
;?getVersion@System@FMOD@@QAG? PROTO SYSCALL :DWORD,:DWORD
FMOD_System_GetVersion TEXTEQU <;?getVersion@System@FMOD@@QAG?>
invoke FMOD_System_GetVersion,system,addr version
J'ai créé un utiitaire pour ce genre de cas.
0
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
18 sept. 2012 à 18:19
Le message n'est pas très clair vu l'éditeur.

les protos sont décorés.
Il faut traduire le .h.
Puis ensuite utiliser dumpbin (c++ express) pour faire apparaitre les noms décorés.
Ensuite on met les protos masm sous la forme:
?@@@info? PROTO SYSCALL (arguments masm)
masmproto TEXTEQU <?@@@info?>
0
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
18 sept. 2012 à 18:41
apparemment on a de la chance,la librairie a prévu le cas et on trouve aussi:

3BFEA _FMOD_System_GetVersion@8
3BFEA __imp__FMOD_System_GetVersion@8

Forme fonctionnant avec:
FMOD_System_GetVersion PROTO :DWORD ,:DWORD

LA TRADUCTION SUFFIT , ouf !
0
cs_parki Messages postés 75 Date d'inscription mardi 29 juillet 2008 Statut Membre Dernière intervention 25 mars 2019
19 sept. 2012 à 10:41
merci pour toutes tes réponses ToutEnMasm,
je revois tout ça et je te tiens au courant.
0
cs_parki Messages postés 75 Date d'inscription mardi 29 juillet 2008 Statut Membre Dernière intervention 25 mars 2019
20 sept. 2012 à 10:31
HELP !

le prog se compile,et se lie parfaitement,mais à l'éxecution aucun son ne sort.J'ai tracé pas à pas chaque appel des fonctions Fmod,le prog va bien chercher les fonctions dans fmodex.dll,et chaque fonction retourne FMOD_OK (0) ??
voici le code;

.686P
.XMM
.model flat,stdcall
option casemap:none

INCLUDELIB fmodex_vc.lib
INCLUDELIB user32.lib
INCLUDELIB kernel32.lib
INCLUDELIB gdi32.lib

FMOD_System_Create PROTO STDCALL :DWORD

FMOD_System_GetVersion PROTO STDCALL :DWORD,:DWORD

FMOD_System_Init PROTO STDCALL :DWORD,:DWORD,:DWORD,:DWORD

FMOD_System_CreateSound PROTO STDCALL :DWORD,:DWORD,:DWORD,:DWORD,:DWORD

FMOD_Sound_SetMode PROTO STDCALL :DWORD,:DWORD

FMOD_System_PlaySound PROTO STDCALL :DWORD,:DWORD,:DWORD,:DWORD,:DWORD

FMOD_Sound_Release PROTO STDCALL :DWORD

FMOD_System_Close PROTO STDCALL :DWORD

.data

syst dword 0
result dword 0
sound1 dword 0
channel dword 0
FMOD_INIT_NORMAL dword 0
FMOD_HARDWARE dword 20h
FMOD_SOFTWARE dword 40h
FMOD_CHANNEL_FREE dword -1
titre BYTE "jaguar.wav",0

.....

lors de la creation de la fenetre;

.if uMsg == WM_CREATE

;FMOD_System_Create(&system)

lea eax,syst
push eax
call FMOD_System_Create

;FMOD_System_Init(system,32,FMOD_INIT_NORMAL, ;NULL)

push 0
push FMOD_INIT_NORMAL
push 32
mov eax,syst
push eax
call FMOD_System_Init

;FMOD_System_CreateSound(system, ;"jaguar.wav", FMOD_SOFTWARE, 0, &sound1)

lea eax,sound1
push eax
push 0
push FMOD_SOFTWARE
push offset titre
mov eax,syst
push eax
call FMOD_System_CreateSound

;FMOD_System_PlaySound(system, ;FMOD_CHANNEL_FREE, sound1, 0, &channel)

lea eax,channel
push eax
push 0
mov eax,sound1
push eax
push FMOD_CHANNEL_FREE
mov eax,syst
push eax
call FMOD_System_PlaySound

;FMOD_Sound_Release(sound1)

mov eax,sound1
push eax
call FMOD_Sound_Release

j'ai étudié le code assembleur du prog playsound (/FA de visual C++) mais il n'y a pas de différence pour cette portion de programme.

qu'est ce que j'ai oublié ??
0
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
20 sept. 2012 à 11:36
Il faudrait me donner le nom du source c pour que je puisse y jeter un oeil.
0
cs_parki Messages postés 75 Date d'inscription mardi 29 juillet 2008 Statut Membre Dernière intervention 25 mars 2019
20 sept. 2012 à 13:18
c'est le prog PLAYSOUND du repertoire examples
du sdk Fmod (FMOD SoundSytem/FMOD programmers API WINDOWS/examples)
0
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
20 sept. 2012 à 15:32
Tout doit fontionner sauf que getch est la pour empécher le programme de s'arréter.
Cela me parait indispensable,içi.
0
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
20 sept. 2012 à 15:43
ça marche avec getch

system dd 0
version dd 0
sound1 dd 0
channel dd 0
drumploop db "D:\Program Files\FMOD SoundSystem\FMOD Programmers API Windows\examples\media\drumloop.wav",0
msvcrtdll DB "msvcr100.dll",0
.code

start:
invoke InitInstance,1
;---- code here --------
invoke FMOD_System_Create,addr system
.if eax == FMOD_OK
invoke FMOD_System_GetVersion,system, addr version
.if eax == FMOD_OK
.if version < FMOD_VERSION
jmp quit_fmode
.endif
invoke FMOD_System_Init,system, 32, FMOD_INIT_NORMAL, NULL
.if eax != FMOD_OK
jmp quit_fmode
.endif
invoke FMOD_System_CreateSound,system,addr drumploop, FMOD_HARDWARE, 0,addr sound1
.if eax != FMOD_OK
jmp quit_fmode
.endif
invoke FMOD_Sound_SetMode,sound1, FMOD_LOOP_OFF
.if eax != FMOD_OK
jmp quit_fmode
.endif
invoke FMOD_System_PlaySound,system, FMOD_CHANNEL_FREE, sound1, 0, addr channel
.if eax != FMOD_OK
jmp quit_fmode
.endif
;*******************
invoke _getch
;---------------------
invoke FMOD_System_Release,sound1

.endif
.endif
quit_fmode:
0
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
20 sept. 2012 à 16:00
Petite erreur a la fin:

;relacher les pointeurs obtenus
invoke FMOD_Sound_Release,sound1
invoke FMOD_System_Release,system
0
cs_parki Messages postés 75 Date d'inscription mardi 29 juillet 2008 Statut Membre Dernière intervention 25 mars 2019
20 sept. 2012 à 21:04
Merci ToutEnMasm,je vais étudier ton code.
0
Rejoignez-nous