Voir la version complète : [GBA][Aide] Lecteur ADPCM et vbl
Acid burns
15/09/2006, 15h34
Bonjour , voici la question que je me pose , comment faire cohabiter le lecteur
ADPCM avec :
#include <mygba.h>
bool volatile NEW_FRAME = TRUE;
void vblTimer(){
NEW_FRAME = TRUE;
ham_CopyObjToOAM();
}
void startVBLTimer(){
NEW_FRAME = FALSE;
ham_StartIntHandler(INT_TYPE_VBL,(void*)&vblTimer);
}
void wait(u16 nbFrames){
u16 curFrame = 0;
while(curFrame < nbFrames ){
if(NEW_FRAME){
NEW_FRAME = FALSE;
curFrame++;
}
}
}
// source Dr vince .
car lorsque que j' execute un son ce dernier me fait n'importe quoi , je pense que les memes timers sont utilisés .. mais je n'ai aucune idée de la maniere de corriger cela , d'une façon plus claire enfin je l'espere ,lorsque que je lance une animation a l'ecran le son reagis en consequence .
Merci d'avance .
Dr.Vince
15/09/2006, 17h13
tu peux mettre le bout de code où tu utilises le lecteur ADPCM
Quand est-ce que tu appelles la fonction "AdpcmDecodeVbl(0)" ? Pour que le decodeur fonctionne bien, il faut que cette fonction soit appelee a chaque VBL... donc il faut faire cet appel dans ton "vblTimer" :void vblTimer(){
NEW_FRAME = TRUE;
ham_CopyObjToOAM();
AdpcmDecodeVbl(0);
}Aussi, il faut d'abord avoir fait l'initialisation de la lib (un appel a "AdpcmInit" au tout debut de ton main) ; ensuite il suffit de demarrer la musique avec "AdpcmStart" :).
Alekmaul
15/09/2006, 22h58
/me utilise le lecteur adpcm de Nrx et "c'est de la balle", il fonctionne plus que bien :::)))
Il suffit juste de bien lire le readme et les exemples fournis.
Donc, si tu peux être plus précis sur ton problème, on pourra certainement te donner la solution :)
Acid burns
16/09/2006, 23h12
j'ai bien initialisé la lib au debut de mon main "AdpcmInit" .
Pour :
void vblTimer(){
NEW_FRAME = TRUE;
ham_CopyObjToOAM();
AdpcmDecodeVbl(0);
}
j'avais essayé mais il en resulte ceci ,
warning: implicit declaration of function `AdpcmDecodeVbl'
Adpcm.h:31: warning: `AdpcmDecodeVbl' was previously implicitly declared to return `int'
je declare donc :
AdpcmStart(&ADPCM_Intro,1,0);
AdpcmDecodeVbl(0);
dans cet ordre car ci j ' inverse pas de son .
voici une parti de mon code .
// Initialisation HAMlib
ham_Init();
// initialisation du mode 4
ham_SetBgMode(4);
// initialisation lecteur adcpm
AdpcmInit(1);
startVBLTimer();
AdpcmStart(&ADPCM_crew1,-1,0);
AdpcmDecodeVbl(0);
//boucle infinie
while(1) {
if(NEW_FRAME){
NEW_FRAME = FALSE;
if(F_CTRLINPUT_A_PRESSED ){
for(x=1; x <=28;x++){
Changer_Bg();
wait(5);
}
}
else
if(F_CTRLINPUT_B_PRESSED){
for(x=29; x <=34;x++){
Changer_Bg();
wait(5);
}
}
}
}
return 0;
}
je pensais a avoir simplement placer AdpcmStart(&ADPCM_crew1,-1,0); a l'endroit ou je desire executer le son exemple a l'appuie d'une touche mais rien a faire , j'ai essaye d'autres choses mais soit le son s'arrete en meme temps que l'animation , soit une fois le son lu j'ai un gressillement infini , ou bien a la fin de mon animation le sample repart au debut sans avoir été jusqu'a la fin. bref je galere
Comme je le disais plus haut, il faut que le "AdpcmDecodeVbl(0);" soit fait a chaque cycle video, c'est a dire que l'appel soit dans la fonction qui est appelee sur l'interruption VBL (dans ton cas c'est bien "vblTimer"). Si tu n'appelles le "AdpcmDecodeVbl" qu'une seule fois... ben il est normal que tu aies n'importe quoi : le decodeur joue les premieres 1/60s de ton son, puis ne fait plus rien puisqu'il n'est plus appele ! => si les derniers echantillons envoyes au circuit sonor de la GBA valent 0, alors tu n'entends plus rien, sinon tu entends un gresillement continu...
Tes sources sont dans plusieurs fichiers differents ? (= tu as une seul fichier ".c", ou tout un tas de ".c" et ".h" ?) Si tu as plusieurs fichiers, il faut faire le "include" de la lib Adpcm dans chacun des fichiers qui utilisent un des fonction de la librairie.
Sinon, je confirme qu'ensuite tu pourras faire ton "AdpcmStart" quand tu le veux (au moment ou tu veux jouer le son). Si dans le code que tu as mis plus haut tu dois le mettre avant le "AdpcmDecodeVbl" pour entendre quelque chose, c'est uniquement parceque tu n'appelles ce "AdpcmDecodeVbl" qu'une seule fois (s'il etait appele de facon continue toutes les 1/60s, tu n'aurais pas a te soucier de savoir quand faire ton "AdpcmStart" : le son demarrerait au maximum 1/60s apres la commande start).
Acid burns
18/09/2006, 18h18
Merci de votre aide , ce lecteur est vraiment un petit bijoux ..
Merci de votre aide , ce lecteur est vraiment un petit bijoux ..Ca marche alors ?! :) Quel etait le probleme finalement ?
Acid burns
19/09/2006, 21h11
ça fonctionne oui et non j'ai plus le gresillement a la fin du sample et il est joué la ou je le desire , mais il est toujours actif seulement le temps d'une animation a l'ecran (exemple je fais defiler mes images pendant 3 secondes j'ai 3 secondes de son etc) , mais bon je pense qu 'avec un peu de persistance je vais arriver a trouver , faut surtout que je trouve un peu de temps , faudrait aussi que je me repenche un peu sur le C car cela laisse a desirer , mais bon n'est ce pas là la meilleur façon d'apprendre :p
je repasse vous embeter si vraiment ça coince :whst: :p
Dr.Vince
19/09/2006, 22h55
c'est vraiment bizarre quand même que tu ai des problèmes
j'avais intégré le lecteur dans puzznic et j'ai eu aucun soucis
Acid burns
25/09/2006, 19h50
c'est enfin ok , j'avais négligé une déclaration dans un .c :-' . Autant pour moi. ;)
vBulletin® v.3.7.2, Copyright ©2000-2008, Jelsoft Enterprises Ltd. Tous droits réservés - Version française vbulletin-fr.org