FMOD [Résolu]

cs_parki 77 Messages postés mardi 29 juillet 2008Date d'inscription 20 mars 2014 Dernière intervention - 16 sept. 2012 à 11:46 - Dernière réponse : cs_parki 77 Messages postés mardi 29 juillet 2008Date d'inscription 20 mars 2014 Dernière intervention
- 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 ?
Afficher la suite 

17 réponses

Répondre au sujet
cs_parki 77 Messages postés mardi 29 juillet 2008Date d'inscription 20 mars 2014 Dernière intervention - 22 sept. 2012 à 08:32
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_parki
ToutEnMasm 552 Messages postés jeudi 28 novembre 2002Date d'inscription 26 mars 2016 Dernière intervention - 18 sept. 2012 à 14:42
0
Utile
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.
Commenter la réponse de ToutEnMasm
cs_parki 77 Messages postés mardi 29 juillet 2008Date d'inscription 20 mars 2014 Dernière intervention - 18 sept. 2012 à 15:09
0
Utile
Merci pour ta réponse ToutEnMasm,je vais appliquer tes conseils et voir si j'y arrive.
Commenter la réponse de cs_parki
ToutEnMasm 552 Messages postés jeudi 28 novembre 2002Date d'inscription 26 mars 2016 Dernière intervention - 18 sept. 2012 à 15:33
0
Utile
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.
Commenter la réponse de ToutEnMasm
cs_parki 77 Messages postés mardi 29 juillet 2008Date d'inscription 20 mars 2014 Dernière intervention - 18 sept. 2012 à 16:36
0
Utile
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)
Commenter la réponse de cs_parki
ToutEnMasm 552 Messages postés jeudi 28 novembre 2002Date d'inscription 26 mars 2016 Dernière intervention - 18 sept. 2012 à 17:34
0
Utile
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.
Commenter la réponse de ToutEnMasm
ToutEnMasm 552 Messages postés jeudi 28 novembre 2002Date d'inscription 26 mars 2016 Dernière intervention - 18 sept. 2012 à 18:09
0
Utile
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.
Commenter la réponse de ToutEnMasm
ToutEnMasm 552 Messages postés jeudi 28 novembre 2002Date d'inscription 26 mars 2016 Dernière intervention - 18 sept. 2012 à 18:19
0
Utile
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?>
Commenter la réponse de ToutEnMasm
ToutEnMasm 552 Messages postés jeudi 28 novembre 2002Date d'inscription 26 mars 2016 Dernière intervention - 18 sept. 2012 à 18:41
0
Utile
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 !
Commenter la réponse de ToutEnMasm
cs_parki 77 Messages postés mardi 29 juillet 2008Date d'inscription 20 mars 2014 Dernière intervention - 19 sept. 2012 à 10:41
0
Utile
merci pour toutes tes réponses ToutEnMasm,
je revois tout ça et je te tiens au courant.
Commenter la réponse de cs_parki
cs_parki 77 Messages postés mardi 29 juillet 2008Date d'inscription 20 mars 2014 Dernière intervention - 20 sept. 2012 à 10:31
0
Utile
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é ??
Commenter la réponse de cs_parki
ToutEnMasm 552 Messages postés jeudi 28 novembre 2002Date d'inscription 26 mars 2016 Dernière intervention - 20 sept. 2012 à 11:36
0
Utile
Il faudrait me donner le nom du source c pour que je puisse y jeter un oeil.
Commenter la réponse de ToutEnMasm
cs_parki 77 Messages postés mardi 29 juillet 2008Date d'inscription 20 mars 2014 Dernière intervention - 20 sept. 2012 à 13:18
0
Utile
c'est le prog PLAYSOUND du repertoire examples
du sdk Fmod (FMOD SoundSytem/FMOD programmers API WINDOWS/examples)
Commenter la réponse de cs_parki
ToutEnMasm 552 Messages postés jeudi 28 novembre 2002Date d'inscription 26 mars 2016 Dernière intervention - 20 sept. 2012 à 15:32
0
Utile
Tout doit fontionner sauf que getch est la pour empécher le programme de s'arréter.
Cela me parait indispensable,içi.
Commenter la réponse de ToutEnMasm
ToutEnMasm 552 Messages postés jeudi 28 novembre 2002Date d'inscription 26 mars 2016 Dernière intervention - 20 sept. 2012 à 15:43
0
Utile
ç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:
Commenter la réponse de ToutEnMasm
ToutEnMasm 552 Messages postés jeudi 28 novembre 2002Date d'inscription 26 mars 2016 Dernière intervention - 20 sept. 2012 à 16:00
0
Utile
Petite erreur a la fin:

;relacher les pointeurs obtenus
invoke FMOD_Sound_Release,sound1
invoke FMOD_System_Release,system
Commenter la réponse de ToutEnMasm
cs_parki 77 Messages postés mardi 29 juillet 2008Date d'inscription 20 mars 2014 Dernière intervention - 20 sept. 2012 à 21:04
0
Utile
Merci ToutEnMasm,je vais étudier ton code.
Commenter la réponse de cs_parki

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.