#include "main.h" static SDL_CD *CDAudio = NULL; static int i; static int enCours = FAUX, enPause = FAUX; static int erreur = FAUX; /* pour savoir s'il y a une erreurs à l'ouverture */ static int vide; /* pour savoir si le lecteur est vide ou non */ static int cdJoue = 0; /* Le lecteur cd qui se joue, par defaut, le 0 */ static int mode = NORMAL; /* le mode de lecture, SHUFFLE (1) NORMAL (0)*/ static int pisteJoue[SDL_MAX_TRACKS+1]; static int pisteEnCoursShuffle = 0; void lecteurCD(void) { /* La police qu'on va utiliser */ TTF_Font *police = TTF_OpenFont("data/Essai.ttf", 12); SDL_Color vert = { 4, 170, 4 }; SDL_Color rouge = { 255, 0, 0 }; SDL_Color noir = { 0, 0, 0 }; SDL_Surface *texte; /* On récupère le nombre de lecteur CD présent sur l'ordi */ int nbLecteurCD = SDL_CDNumDrives(); struct { int numero; char noms[256]; SDL_Rect positionGraphique; } CD[MAX]; /* Le programme accepte 8 lecteurs CD maximum */ if (nbLecteurCD > MAX) nbLecteurCD = MAX; for(i=0;ih; SDL_BlitSurface(texte, NULL, ecran, &CD[i].positionGraphique); } SDL_Flip(ecran); /* boucle principale */ int done = FAUX; while (!done) { /* attente d'évenement */ SDL_Event event; while (SDL_PollEvent(&event)) { /* on regarde */ switch (event.type) { /* si la fenêtre est quitté on se barre */ case SDL_QUIT: { done = VRAI; SDL_CDStop(CDAudio); SDL_CDClose(CDAudio); } break; /* on regarde les touches pressées */ case SDL_KEYDOWN: { /* si c'est sur ESC, on se barre */ switch(event.key.keysym.sym) { case SDLK_ESCAPE: { done = VRAI; SDL_CDStop(CDAudio); SDL_CDClose(CDAudio); } break; case SDLK_LEFT: pistePrecedente(); break; case SDLK_RIGHT: pisteSuivante(); break; case SDLK_SPACE: jouePause(); break; } break; } /* La souris relachée */ case SDL_MOUSEBUTTONUP: { /* on regarde pour le choix du lecteur */ for(i=0; i< nbLecteurCD; i++) { if ( (event.button.x >= POSITION_1ER_LECTEUR_X) && (event.button.x <= POSITION_1ER_LECTEUR_X+texte->w) && (event.button.y >= POSITION_1ER_LECTEUR_Y + i*texte->h) && (event.button.y <= (POSITION_1ER_LECTEUR_Y + i*texte->h) +texte->h) ) { /* on efface l'ancien lecteur en recopiant la même */ /* chose, mais en noir */ position.x = POSITION_AFFICHAGE_LECTEUR_X; position.y = POSITION_AFFICHAGE_LECTEUR_Y; texte = TTF_RenderText_Shaded(police, SDL_CDName(cdJoue), noir, noir); SDL_BlitSurface(texte, NULL, ecran, &position); SDL_Flip(ecran); /* on arrête et ferme le lecteur s'il était ouvert */ if (CDAudio!=NULL) { SDL_CDStop(CDAudio); enCours = FAUX; enPause = FAUX; SDL_CDClose(CDAudio); } /* on definit le nouveau lecteur */ cdJoue = i; /* et on affiche le nom du CD */ position.x = POSITION_AFFICHAGE_LECTEUR_X; position.y = POSITION_AFFICHAGE_LECTEUR_Y; texte = TTF_RenderText_Shaded(police, SDL_CDName(cdJoue), vert, noir); SDL_BlitSurface(texte, NULL, ecran, &position); SDL_Flip(ecran); /* on ouvre le nouveau CD */ if ((CDAudio = SDL_CDOpen(cdJoue)) == NULL) { /* Message d'erreur si ça ne s'ouvre pas */ position.y = POSITION_AFFICHAGE_LECTEUR_Y+texte->h; texte = TTF_RenderText_Shaded(police, "Impossible d'ouvrir le lecteur de CD-ROM.", vert, noir); SDL_BlitSurface(texte, NULL, ecran, &position); SDL_Flip(ecran); erreur = VRAI; } /* fin du IF erreur ouverture CD */ /* au cas ou cela fonctionne on efface le texte, s'il y a */ else { /* on enlève l'ancien message d'erreur */ if (erreur == VRAI) { position.x = POSITION_AFFICHAGE_LECTEUR_X; position.y = POSITION_AFFICHAGE_LECTEUR_Y+texte->h; texte = TTF_RenderText_Shaded(police, "Impossible d'ouvrir le lecteur de CD-ROM.", noir, noir); SDL_BlitSurface(texte, NULL, ecran, &position); SDL_Flip(ecran); erreur = FAUX; } /* maintenant on vérifie qu'il y a bien un CD inséré */ /* s'il est vide : */ if (CD_INDRIVE(SDL_CDStatus(CDAudio)) == 0) { /* on affiche le message d'erreur */ position.x = POSITION_AFFICHAGE_LECTEUR_X; position.y = POSITION_AFFICHAGE_LECTEUR_Y+texte->h; texte = TTF_RenderText_Shaded(police, "Ce lecteur est vide.", vert, noir); SDL_BlitSurface(texte, NULL, ecran, &position); SDL_Flip(ecran); vide = VRAI; } /* fin du IF vérif de présence de CD */ else { /* Sinon, on efface le message d'erreur */ position.x = POSITION_AFFICHAGE_LECTEUR_X; position.y = POSITION_AFFICHAGE_LECTEUR_Y+texte->h; texte = TTF_RenderText_Shaded(police, "Ce lecteur est vide.", noir, noir); SDL_BlitSurface(texte, NULL, ecran, &position); SDL_Flip(ecran); vide = FAUX; } /* fin du else verif présence cd */ } /* fin du else */ } /* fin du IF choix du lecteur */ } /* fin du for pour l'affichage du lecteur par defaut */ /* on regarde pour la lecture du CD */ /* pour le bouton play/pause */ if ( (event.button.x >= POSITION_1ER_BOUTONS_LECTURE_X+boutons->w) && (event.button.x <= POSITION_1ER_BOUTONS_LECTURE_X+boutons->w*2) && (event.button.y >= POSITION_1ER_BOUTONS_LECTURE_Y ) && (event.button.y <= POSITION_1ER_BOUTONS_LECTURE_Y+boutons->h) ) { jouePause(); } /* fin du if play/pause */ if ( (event.button.x >= POSITION_1ER_BOUTONS_LECTURE_X+boutons->w) && (event.button.x <= POSITION_1ER_BOUTONS_LECTURE_X+boutons->w*2) && (event.button.y >= POSITION_1ER_BOUTONS_LECTURE_Y-boutons->h ) && (event.button.y <= POSITION_1ER_BOUTONS_LECTURE_Y) ) { ejection(); } /* fin du if ejection */ if ( (event.button.x >= POSITION_1ER_BOUTONS_LECTURE_X) && (event.button.x <= POSITION_1ER_BOUTONS_LECTURE_X+boutons->w) && (event.button.y >= POSITION_1ER_BOUTONS_LECTURE_Y ) && (event.button.y <= POSITION_1ER_BOUTONS_LECTURE_Y+boutons->h) ) { if (mode == NORMAL) pistePrecedente(); /* TODO SHUFFLE */ } /* fin du IF revenir avant */ if ( (event.button.x >= POSITION_1ER_BOUTONS_LECTURE_X+boutons->w*2) && (event.button.x <= POSITION_1ER_BOUTONS_LECTURE_X+boutons->w*3) && (event.button.y >= POSITION_1ER_BOUTONS_LECTURE_Y ) && (event.button.y <= POSITION_1ER_BOUTONS_LECTURE_Y+boutons->h) ) { if (mode == NORMAL) pisteSuivante(); /* TODO SHUFFLE */ } /* fin du IF aller après */ if ( (event.button.x >= POSITION_1ER_BOUTONS_MODE_X) && (event.button.x <= POSITION_1ER_BOUTONS_MODE_X+boutons->w) && (event.button.y >= POSITION_1ER_BOUTONS_MODE_Y ) && (event.button.y <= POSITION_1ER_BOUTONS_MODE_Y+boutons->h) ) { mode = SHUFFLE; generationDuShuffle(CDAudio); /* TODO*/ } /* mode Shuffle */ if ( (event.button.x >= POSITION_1ER_BOUTONS_MODE_X) && (event.button.x <= POSITION_1ER_BOUTONS_MODE_X+boutons->w) && (event.button.y >= POSITION_1ER_BOUTONS_MODE_Y ) && (event.button.y <= POSITION_1ER_BOUTONS_MODE_Y+boutons->h) ) { mode = NORMAL; joueleCD(CDAudio, 0); } /* mode Normal */ break; }/* fin du case */ } /* fin du switch */ } /* fin du proc. de message */ } /* fin de la boucle principale */ } void jouePause(void) { if (CD_INDRIVE(SDL_CDStatus(CDAudio)) != CD_TRAYEMPTY) { /* Si la piste se joue et qu'on appuye sur le bouton */ /* alors on met en pause */ if ( (enCours == VRAI) && (enPause == FAUX) ) { SDL_CDPause(CDAudio); enPause = VRAI; } else if ( (enCours == VRAI) && (enPause == VRAI) ) { SDL_CDResume(CDAudio); enPause = FAUX; } else { joueleCD(CDAudio, CDAudio->cur_track); enCours = VRAI; enPause = FAUX; } } } void pistePrecedente(void) { if((CDAudio->cur_track - 1) < 0) CDAudio->cur_track = CDAudio->numtracks-1; else CDAudio->cur_track -= 1; joueleCD(CDAudio, CDAudio->cur_track); } void pisteSuivante(void) { if( (CDAudio->cur_track + 1) > (CDAudio->numtracks - 1)) CDAudio->cur_track = 0; else CDAudio->cur_track += 1; joueleCD(CDAudio, CDAudio->cur_track); } void ejection(void) { /* on arrête et ferme le lecteur s'il était ouvert */ if (CDAudio!=NULL) { SDL_CDStop(CDAudio); enCours = FAUX; enPause = FAUX; } SDL_CDEject(CDAudio); } void joueleCD(SDL_CD *leCD, int pisteDebut) { int fin = 0; SDL_CDPlayTracks(leCD, pisteDebut, leCD->cur_frame, fin, fin); } /* pour shuffle */ /* pas fini. TODO */ void generationDuShuffle(SDL_CD *leCD) { int i, j; int lapiste; int test; srand(time(NULL)); for (i = 0; i < leCD->numtracks; ) { lapiste = (int)((double)rand() / ((double)RAND_MAX + 1) * leCD->numtracks ); test = 0; for (j = 0; j < i ; j++) { if ( lapiste == pisteJoue[j] ) { test +=1; } } if (test == 0) { pisteJoue[i] = lapiste; i++; } } for (i = 0; i < leCD->numtracks;i++) { fprintf(stdout, "%d\n", pisteJoue[i]); } CDAudio->cur_track = pisteJoue[0]; }