Je suis nouveau en langage C et je me résous à poster car je ne vois pas l'origine de mon problème malgré de multiples essais et consultations sur internet.
Voici mon code :
#include <stdlib.h>
#include <stdio.h>
#include <SDL.h>
#include <SDL_image.h>
#include <fmod.h>
#include <SDL_ttf.h>
#include <dirent.h>
#include <string.h>
#define LARGEUR_FENETRE 1024
#define HAUTEUR_FENETRE 700
#define DELAI_RAFFRAICHISSEMENT 25
#define RATIO 255/HAUTEUR_FENETRE
void setPixel(SDL_Surface *surface,int x,int y,Uint32 pixel);
int main(int argc, char *argv[])
{
//==========SDL==========
if (SDL_Init(SDL_INIT_VIDEO)==-1)
{
fprintf(stderr,"Erreur initialisation SDL : %s\n",SDL_GetError());
exit(EXIT_FAILURE);
}
SDL_Surface *ecran=NULL,*vf=NULL;
ecran=SDL_SetVideoMode(LARGEUR_FENETRE,HAUTEUR_FENETRE,32,SDL_HWSURFACE);
if(ecran==NULL)
{
fprintf(stderr,"Erreur de chargement du mode video : %s\n",SDL_GetError());
exit(EXIT_FAILURE);
}
SDL_WM_SetCaption("ROCK MUSIC PLAYER",NULL);
//==========lecture dans le répertoire de musiques==========
DIR *repertoire=NULL;
repertoire=opendir("C:/FD/programmation_C/essai_SDL_image_TTF_FMOD_texte/musiques");
if(repertoire==NULL)
{
perror("Erreur d'ouverture du repertoire");
exit(EXIT_FAILURE);
}
struct dirent *fichierLu=NULL;
int k;
for(k=1;k<=4;k++)
{
fichierLu=readdir(repertoire);
fprintf(stderr,"%s\n",fichierLu->d_name);//wwwwwwwwwwwwwwwwwwwwwww
if(fichierLu==NULL)
{
fprintf(stderr,"Erreur de lecture du fichier");
exit(EXIT_FAILURE);
}
}
//==========SDL_ttf==========
if (TTF_Init()==-1)
{
fprintf(stderr,"Erreur initialisation SDL_ttf %s\n",TTF_GetError());
exit (EXIT_FAILURE);
}
TTF_Font *police=NULL;
police=TTF_OpenFont("ERASMD.TTF",20);
SDL_Color couleurRouge={255,125,0};
SDL_Surface *texte=NULL;
texte=TTF_RenderText_Solid(police,fichierLu->d_name,couleurRouge);
SDL_Rect positionTexte;
positionTexte.x=500;
positionTexte.y=100;
//==========chargement du fichier sonore==========
FMOD_SYSTEM *systeme;
FMOD_System_Create(&systeme);
FMOD_System_Init(systeme,2,FMOD_INIT_NORMAL,NULL);
FMOD_SOUND *musique=NULL;
fprintf(stderr,fichierLu->d_name);//wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
FMOD_System_CreateSound(systeme,fichierLu->d_name,FMOD_SOFTWARE|FMOD_2D|FMOD_CREATESTREAM,0,&musique);
if(musique==NULL)
{
fprintf(stderr,"Impossible de charger le fichier musical \n");
exit(EXIT_FAILURE);
}
FMOD_Sound_SetLoopCount(musique,0);
FMOD_System_PlaySound(systeme,FMOD_CHANNEL_FREE,musique,0,NULL);
FMOD_CHANNEL *canal;
FMOD_System_GetChannel(systeme,1,&canal);
float spectre[LARGEUR_FENETRE];
SDL_Event evenement;
int continuer=1;
int tempsActuel=0,tempsPrecedent=0,hauteurBarre=0;
int i,j;
//==========boucle principale==========
while(continuer)
{
SDL_PollEvent(&evenement);
switch(evenement.type)
{
case(SDL_QUIT):
continuer=0;
break;
case(SDL_KEYDOWN):
if(evenement.key.keysym.sym==SDLK_p)
{
FMOD_BOOL etat;
FMOD_Channel_GetPaused(canal,&etat);
if(etat==1)
FMOD_Channel_SetPaused(canal,0);
else
FMOD_Channel_SetPaused(canal,1);
}
break;
default:
break;
}
SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,0,0,0));
tempsActuel=SDL_GetTicks();
if(tempsActuel-tempsPrecedent<DELAI_RAFFRAICHISSEMENT)
SDL_Delay(DELAI_RAFFRAICHISSEMENT-(tempsActuel-tempsPrecedent));
tempsPrecedent=tempsActuel;
FMOD_Channel_GetSpectrum(canal,spectre,LARGEUR_FENETRE,0,FMOD_DSP_FFT_WINDOW_RECT);
SDL_LockSurface(ecran);
for(i=0;i<LARGEUR_FENETRE;i++)
{
hauteurBarre=spectre[i]*20*HAUTEUR_FENETRE;
if(hauteurBarre>HAUTEUR_FENETRE)
hauteurBarre=HAUTEUR_FENETRE;
for(j=HAUTEUR_FENETRE-hauteurBarre;j<HAUTEUR_FENETRE;j++)
setPixel(ecran,i,j,SDL_MapRGB(ecran->format,255-j*RATIO,j*RATIO,0));
}
SDL_UnlockSurface(ecran);
SDL_BlitSurface(texte,NULL,ecran,&positionTexte);
SDL_Flip(ecran);
}
FMOD_Sound_Release(musique);
FMOD_System_Close(systeme);
FMOD_System_Release(systeme);
TTF_CloseFont(police);
TTF_Quit();
SDL_FreeSurface(texte);
SDL_Quit();
if(closedir(repertoire)==-1)
{
perror("Erreur de fermeture du repertoire");
exit(EXIT_FAILURE);
}
return EXIT_SUCCESS; // Fermeture du programme
}
void setPixel(SDL_Surface *surface,int x,int y,Uint32 pixel)
{
int bpp=surface->format->BytesPerPixel;
Uint8 *p=(Uint8 *)surface->pixels+y*surface->pitch+x*bpp;
switch(bpp)
{
case 1:
*p=pixel;
break;
case 2:
*(Uint16 *)p=pixel;
break;
case 3:
if(SDL_BYTEORDER==SDL_BIG_ENDIAN) {
p[0]=(pixel>>16)&0xff;
p[1]=(pixel>>8)&0xff;
p[2]=pixel&0xff;
}
else
{
p[0]=pixel&0xff;
p[1]=(pixel>>8)&0xff;
p[2]=(pixel>>16)&0xff;
}
break;
case 4:
*(Uint32 *)p=pixel;
break;
}
}
La base est issue du cours de Matéo.
Dans mon répertoire de travail, j'ai créé un répertoires appelé musiques et j'y ai mis 3 morceaux mp3 (ACDC, LYN et MOTO). la version du code ci-dessus fonctionne, le lecteur joue bien le morceau LYN. Mais seulement si en ligne 26 j'initialise une SDL_Surface *vf qui ne sert à rien par la suite ! (si je ne fais pas cela, j'ai une "erreur process returned 3".
Autre problème : si à la ligne 46 je donne à k les valeurs 3 ou 5 pour lire mes deux autres fichiers, la fenêtre s'ouvre et se ferme aussitôt, avec une erreur "process returned 1" et le message suivant dans le fichier stderr.txt :
..
ACDC.mp3
LYN.mp3
MOTO.mp3
MOTO.mp3Impossible de charger le fichier musical
Si je renomme le fichier mp3 MOTO en LYN et LYN en autre chose, que je demande de lire le nouveau fichier LYN, il joue ... mais pas le morceau de musique qui devrait être Motörhead ! il rejoue le morceau Lynyrd Skynyrd alors qu'il DEVRAIT jouer Motôrhead, j'ai vérifié avec le windows media player.
Merci. J'ai viré tous les tags sur mes fichiers mp3. Des erreurs process 3, avec aucun message d'erreur dans le stderr.txt.
J'ai essayé avec des fichiers wave. Même résultat.
Visiblement c'est la ligne 66 qui pose problème. Si je fais un fprintf dans le stderr avant, je le retrouve dans le stderr. Si j'en fait un juste après la ligne 66, il n'est pas écrit dans le stderr. Donc le programme "aborte" à la ligne 66. Mais je ne comprends pas pourquoi !
si ça plante à la ligne 66, c'est que ton instruction plane. De forte chances que ce soit la police qui n'ait pas été chargée correctement. C'est pour cela qu'on vérifie toujours le résultat de ce type de fonction.
Salut à tous. Je poste mon programme relooké, qui fonctionne, qui choisi un fichier mp3 au hasard sans en reprendre un déjà joué. Le programme se ferme une fois tous les fichiers mp3 joués.
Mais j'ai toujours mon PB : je dois mettre les fichiers musicaux dans le dossier musique ET dans le repertoire de travail ! C'est lourd en Mo !
Le programme plante (erreur 1 et "Impossible de charger le fichier musical" dans le stderr) si j'enlève les fichiers mp3 du répertoire de travail.
#include <stdlib.h>
#include <stdio.h>
#include <SDL.h>
#include <SDL_image.h>
#include <fmod.h>
#include <SDL_ttf.h>
#include <dirent.h>
#include <string.h>
#include <math.h>
#include <time.h>
#define LARGEUR_SPECTRE 2048
#define LARGEUR_FENETRE 1024
#define HAUTEUR_FENETRE 500
#define DELAI_RAFFRAICHISSEMENT 10
#define RATIO 255/HAUTEUR_FENETRE
#define NUMEROMIN 4
//==============================
//==========prototypes==========
//==============================
void setPixel(SDL_Surface *surface,int x,int y,Uint32 pixel);
void MinSec(int t,int *m,int *s);
//=======================================
//==========fonction principale==========
//=======================================
int main(int argc, char *argv[])
{ //=================================================
//==========initialisations avant lecteur==========
//=================================================
//---------------------------------------------
//----------initialisations générales----------
//---------------------------------------------
int i,j,k,m;
int jouerMorceau=1;
int tempsPrecedent=0,tempsActuel=0;
int tempsPrecedentMusique=0,tempsActuelMusique=0;
int choixMusique=0;
int nbreFichiersLus=0,dejaLu=0;
int indiceFichierLu[50]={0};
int numeroMax=0;
srand(time(NULL));
//---------------------------------------
//----------initialisations SDL----------
//---------------------------------------
if (SDL_Init(SDL_INIT_VIDEO)==-1)
{
fprintf(stderr,"Erreur initialisation SDL : %s\n",SDL_GetError());
exit(EXIT_FAILURE);
}
SDL_Surface *ecran=NULL;
SDL_Surface *texteTitre=NULL,*surfaceTexteDureeTotale=NULL,*surfaceTexteDureeJouee=NULL;
ecran=SDL_SetVideoMode(LARGEUR_FENETRE,HAUTEUR_FENETRE,32,SDL_HWSURFACE);
if(ecran==NULL)
{
fprintf(stderr,"Erreur de chargement du mode video : %s\n",SDL_GetError());
exit(EXIT_FAILURE);
}
SDL_WM_SetCaption("ROCK MUSIC PLAYER",NULL);
SDL_Color couleurRouge={255,125,0};
SDL_Event evenement;
SDL_Rect positionTexte;
SDL_Rect positionTexteDuree;
SDL_Rect positionTextePositionTemps;
positionTexte.x=400;
positionTexte.y=50;
positionTexteDuree.x=400;
positionTexteDuree.y=100;
positionTextePositionTemps.x=400;
positionTextePositionTemps.y=130;
//----------------------------------------
//----------initialisations FMOD----------
//----------------------------------------
int minutes,secondes;
int minutesJouees,secondesJouees;
FMOD_SYSTEM *systeme;
FMOD_System_Create(&systeme);
FMOD_System_Init(systeme,2,FMOD_INIT_NORMAL,NULL);
FMOD_SOUND *musique=NULL;
float spectre[LARGEUR_SPECTRE];
int hauteurBarre=0;
//-------------------------------------------
//----------initialisations SDL_ttf----------
//-------------------------------------------
if (TTF_Init()==-1)
{
fprintf(stderr,"Erreur initialisation SDL_ttf %s\n",TTF_GetError());
exit (EXIT_FAILURE);
}
TTF_Font *police=NULL,*policeDuree=NULL;
police=TTF_OpenFont("comic.TTF",30);
if(police==NULL)
{
fprintf(stderr,"Erreur ouverture police de caracteres");
exit(EXIT_FAILURE);
}
policeDuree=TTF_OpenFont("comic.TTF",20);
if(policeDuree==NULL)
{
fprintf(stderr,"Erreur ouverture police de caracteres");
exit(EXIT_FAILURE);
}
DIR *repertoire=NULL;
repertoire=opendir("musiques");
if(repertoire==NULL)
{
perror("Erreur d'ouverture du repertoire");
exit(EXIT_FAILURE);
}
struct dirent *fichierLu=NULL;
while((fichierLu=readdir(repertoire))!=NULL)
numeroMax++;
numeroMax-=2;
if(closedir(repertoire)==-1)
{
perror("Erreur de fermeture du repertoire");
exit(EXIT_FAILURE);
}
//======================================================
//==========début du fonctionnement du lecteur==========
//======================================================
while(jouerMorceau)
{
//------------------------------------------
//----------initialisations dirent----------
//------------------------------------------
DIR *repertoire=NULL;
char nomDuFichier[50];
int numeroChoisi;
repertoire=opendir("musiques/");
if(repertoire==NULL)
{
perror("Erreur d'ouverture du repertoire");
exit(EXIT_FAILURE);
}
struct dirent *fichierLu=NULL;
//--------------------------
//----------dirent----------
//--------------------------
while(!choixMusique)
{
dejaLu=0;
numeroChoisi=(rand()%(numeroMax+3-NUMEROMIN+1))+NUMEROMIN;
for(m=0;m<nbreFichiersLus;m++)
{
if(indiceFichierLu[m]==numeroChoisi)
dejaLu++;
}
if(dejaLu==0)
choixMusique=1;
}
choixMusique=0;
indiceFichierLu[nbreFichiersLus]=numeroChoisi;
for(k=1;k<numeroChoisi;k++)
{
fichierLu=readdir(repertoire);
if(fichierLu==NULL)
{
fprintf(stderr,"Erreur de lecture du fichier");
exit(EXIT_FAILURE);
}
}
//----------suppression du .mp3 pour l'affichage----------
strcpy(nomDuFichier,fichierLu->d_name);
for(k=0;k<strlen(nomDuFichier);k++)
{
if(nomDuFichier[k]=='.')
nomDuFichier[k]='\0';
}
//------------------------
//----------FMOD----------
//------------------------
//----------récupération de la durée totale----------
FMOD_System_CreateSound(systeme,fichierLu->d_name,FMOD_SOFTWARE|FMOD_2D|FMOD_CREATESTREAM,0,&musique);
if(musique==NULL)
{
fprintf(stderr,"Impossible de charger le fichier musical \n");
exit(EXIT_FAILURE);
}
unsigned int dureeTotale=0;
char texteDureeTotale[50]="";
FMOD_Sound_GetLength(musique,&dureeTotale,FMOD_TIMEUNIT_MS);
MinSec(dureeTotale,&minutes,&secondes);
sprintf(texteDureeTotale,"Total Time : %d min %d sec",minutes,secondes);
//----------mode de lecture et canal----------
FMOD_Sound_SetLoopCount(musique,0);
FMOD_System_PlaySound(systeme,FMOD_CHANNEL_FREE,musique,0,NULL);
FMOD_CHANNEL *canal;
FMOD_System_GetChannel(systeme,1,&canal);
//----------initialisation pour récupération durée jouée----------
unsigned int dureeJouee=0;
char texteDureeJouee[50]="";
int continuerLectureMorceau=1;
//---------------------------
//----------SDL_ttf----------
//---------------------------
texteTitre=TTF_RenderText_Solid(police,nomDuFichier,couleurRouge);
surfaceTexteDureeTotale=TTF_RenderText_Solid(policeDuree,texteDureeTotale,couleurRouge);
//--------------------------------------------------
//----------boucle de lecture d'un morceau----------
//--------------------------------------------------
while(continuerLectureMorceau)
{
SDL_PollEvent(&evenement);
switch(evenement.type)
{
case(SDL_QUIT):
continuerLectureMorceau=0;
jouerMorceau=0;
break;
default:
break;
}
SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,0,0,0));
tempsActuelMusique=SDL_GetTicks();
if((tempsActuelMusique-tempsPrecedentMusique)>=dureeTotale)
{
tempsPrecedentMusique=tempsActuelMusique;
nbreFichiersLus++;
if(nbreFichiersLus>=numeroMax)
jouerMorceau=0;
continuerLectureMorceau=0;
}
tempsActuel=SDL_GetTicks();
if(tempsActuel-tempsPrecedent<DELAI_RAFFRAICHISSEMENT)
SDL_Delay(DELAI_RAFFRAICHISSEMENT-(tempsActuel-tempsPrecedent));
tempsPrecedent=tempsActuel;
FMOD_Channel_GetSpectrum(canal,spectre,LARGEUR_FENETRE,0,FMOD_DSP_FFT_WINDOW_RECT);
SDL_LockSurface(ecran);
for(i=0;i<LARGEUR_SPECTRE/4-1;i++)
{
hauteurBarre=sqrt(spectre[i])*3*HAUTEUR_FENETRE;
if(hauteurBarre>HAUTEUR_FENETRE)
hauteurBarre=HAUTEUR_FENETRE;
for(j=HAUTEUR_FENETRE-hauteurBarre;j<HAUTEUR_FENETRE;j++)
{
setPixel(ecran,2*i,j,SDL_MapRGB(ecran->format,255-j*RATIO,j*RATIO,0));
setPixel(ecran,2*i+1,j,SDL_MapRGB(ecran->format,255-j*RATIO,j*RATIO,0));
}
}
FMOD_Channel_GetPosition(canal,&dureeJouee,FMOD_TIMEUNIT_MS);
MinSec(dureeJouee,&minutesJouees,&secondesJouees);
sprintf(texteDureeJouee,"Played Time : %d min %d sec",minutesJouees,secondesJouees);
surfaceTexteDureeJouee=TTF_RenderText_Solid(policeDuree,texteDureeJouee,couleurRouge);
SDL_UnlockSurface(ecran);
SDL_BlitSurface(texteTitre,NULL,ecran,&positionTexte);
SDL_BlitSurface(surfaceTexteDureeTotale,NULL,ecran,&positionTexteDuree);
SDL_BlitSurface(surfaceTexteDureeJouee,NULL,ecran,&positionTextePositionTemps);
SDL_Flip(ecran);
}
FMOD_Sound_Release(musique);
if(closedir(repertoire)==-1)
{
perror("Erreur de fermeture du repertoire");
exit(EXIT_FAILURE);
}
}
FMOD_System_Close(systeme);
FMOD_System_Release(systeme);
TTF_CloseFont(police);
TTF_Quit();
SDL_FreeSurface(texteTitre);
SDL_Quit();
return EXIT_SUCCESS;
}
//=============================
//==========fonctions==========
//=============================
//-------------------------------------------------------
//----------fonction qui affiche un pixel (x,y)----------
//-------------------------------------------------------
void setPixel(SDL_Surface *surface,int x,int y,Uint32 pixel)
{
int bpp=surface->format->BytesPerPixel;
Uint8 *p=(Uint8 *)surface->pixels+y*surface->pitch+x*bpp;
switch(bpp)
{
case 1:
*p=pixel;
break;
case 2:
*(Uint16 *)p=pixel;
break;
case 3:
if(SDL_BYTEORDER==SDL_BIG_ENDIAN)
{
p[0]=(pixel>>16)&0xff;
p[1]=(pixel>>8)&0xff;
p[2]=pixel&0xff;
}
else
{
p[0]=pixel&0xff;
p[1]=(pixel>>8)&0xff;
p[2]=(pixel>>16)&0xff;
}
break;
case 4:
*(Uint32 *)p=pixel;
break;
default:
break;
}
}
//------------------------------------------------------------
//----------fonction qui convertit des ms en min,sec----------
//------------------------------------------------------------
void MinSec(int t,int *m,int *s)
{
*s=t/1000;
*m=*s/60;
*s=*s%60;
}
Tu as peut-être relooké ton programme, mais un main() de 240 lignes . Fais des fonctions !
Pour ton problème: c'est sans doute (comme souvent) ton ide qui te joue des tours, suivant que tu compile en debug ou release, ou encore que tu n' exécutes pas ton programme à partir de l'ide.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Bonhomme !! | Jeu de plateforme : Prototype.
Bonhomme !! | Jeu de plateforme : Prototype.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent