Accueil ⇒ Informatique ⇒ Bibliothèques ⇒ SDL ⇒ Leçon 7 : Lecture CD

Leçon 7 : Lecture CD

L'accès aux périphériques manque cruellement dans la plupart des librairies multimedia disponnibles. SDL corrige le tir en vous proposant d'accèder sans problème au(x) lecteur(s) de CD-ROM.

Ouvrir le lecteur

Pour commencer, nous allons créer les objets à utiliser et lister les lecteurs de CD-ROM. Voici un exemple de code qui fonctionne :

#include <SDL.h>

// Objet CD Audio
SDL_CD *AudioCD = NULL;

int main(void)
{
int iNbrLecteursCD = 0;

// Initialisation de SDL_CDROM
if (SDL_Init(SDL_INIT_CDROM) < 0)
return 0;

// Récupération du nombre de lecteurs
iNbrLecteursCD = SDL_CDNumDrives();
printf("Nombre de lecteurs CD : %d\n",iNbrLecteursCD);

// Nom du lecteur 0
printf("Ouverture du lecteur : '%s'\n",
SDL_CDName(0));

// Ouverture du lecteur 0
AudioCD = SDL_CDOpen(0);
if (AudioCD == NULL) {
printf("Echec de l'ouverture du lecteur : %s\n",
SDL_GetError());
return 0;
}

// Lecture des pistes

// Fermeture du CD
if (AudioCD!=NULL)
SDL_CDClose(AudioCD);

return 0;
}

Explications. Pour accèder aux lecteurs CD avec SDL on passe par les objets SDL_CD, qui doivent être utilisés en dynamique. Dans la fonction principale, on déclare une variable iNbrLecteursCD qui contiendra le nombre de lecteurs CD disponnibles : à partir de cela vous pourrez, plus tard, faire choisir à l'utilisateur quel lecteur il compte utiliser. On initialise ensuite la partie CD-ROM de SDL et avec la partie TIMERS. En effet, la lecture de CD Audio se fait en arrière plan, d'où le besoin d'utiliser les timers et le multithreading. Ceci fait, on récupère le nombre de lecteurs disponnibles dans iNbrLecteursCD grâce à la fonction int SDL_CDNumDrives(). Ceci fait, on considère que l'utilisateur à choisi d'ouvrir le lecteur 0. Tout d'abord on récupère son nom, ceci fait facilement via la fonction const char* SDL_CDName(int numero_du_lecteur) qui retourne une chaîne de caractères (le nom du lecteur).

Une fois le nom affiché en sortie on ouvre le lecteur CD dans l'objet AudioCD via la fonction SDL_CD SDL_CDOpen(int numero_du_lecteur). Désormais, le lecteur CD est ouvert et on peut accèder aux pistes audio de celui-ci via l'objet AudioCD (nous verrons cela plus bas). Ne pas oublier de fermer le lecteur CD avec la fonction void SDL_CDClose(SDL_CD lecteur_a_fermer) avant la fin de l'exécution du programme. Maintenant que le lecteur est ouvert et initialisé nous allons apprendre à l'utiliser.

Jouer un CD audio

Avant de commencer il nous faut connaître la structure d'une piste audio dans SDL, nommée SDL_CDtrack. Elle comporte les champs suivants :

typedef struct {
Uint8 id;
Uint8 type;
Uint32 lenght;
Uint32 offset;
} SDL_CDtrack;

id contient le numéro de la piste et type le type de données (audio, data...) Dans notre cas il faudra que (type == SDL_AUDIO_TRACK), dans le cas contraire le type serait SDL_DATA_TRACK. lenght contient la longueur de la piste... en frames! En gros, une frame fait 2 ko, mais pour obtenir la longueur de la piste en secondes vous pouvez utiliser la constante CD_FPS de SDL ainsi : iDureePisteSecondes = SDL_CDtrack.lenght/CD_FPS; offset contient le numéro de frame où est positionné le début de la piste, ce qui nous servire à déterminer le début et la fin de chaque piste. Forts de savoir ceci, nous allons lire une piste audio, mais avant toutes choses il faudra s'assurer que le lecteur est prêt à la lire. Pour cela on utilise les objets de type CDstatus et la fonction CDStatus SDL_CDStatus(SDL_CD *cdrom), qui renvoit les status suivants :

Vous pouvez aussi utiliser la macro CD_INDRIVE qui prendre comme paramètre le statut du lecteur CD renvoyé par SDL_CDStatus : elle renvoie 0 si le lecteur est vide. Désormais nous pouvons lire une piste avec la fonction suivante.

void PlayCDTrack(SDL_CD *lecteur, int piste)
{
if (CD_INDRIVE(SDL_CDStatus(lecteur)) == 0)
printf("Le lecteur %s est vide.\n",SDL_CDName(lecteur->id));
else if (lecteur->track[piste].type != SDL_AUDIO_TRACK)
printf("La piste n'est pas une piste audio!\n");
else if (SDL_CDPlay(lecteur, lecteur->track[piste].offset, lecteur->track[piste].length) == 0)
printf("Lecture de la piste %d en cours sur le lecteur %s.\n",
piste, SDL_CDName(lecteur->id));
else {
printf("Erreur de lecture: %s",SDL_GetError());
exit(0);
}
}

La fonction prend comme argument l'objet SDL_CD à lire (je rapelle qu'on utilise cet objet en dynamique) et le numéro de la piste à lire. Pour lire une piste on utilise la fonction SDL_CDPlay(...) qui prend comme argument l'objet, l'offset de la piste à lire et la longueur length de piste à lire (en CD_FPS, pour lire 10 secondes entrer CD_FPS*10 par exemple). Ici on lit toute la piste en partant du début mais vous pouvez modifier ces paramètres si vous le désirez. Si le lecteur est vide on affiche un message d'erreur. Sinon on joue la piste, et si la fonction SDL_CDPlay(...) ne renvoie pas la valeur 0 (en cas d'erreur) on affiche un message d'erreur avant de quitter. Rien de plus simple! Je précise que si la longueur de la piste à lire est supérieure à la longueur réelle de cette piste la piste suivante sera jouée : par exemple, si la piste 2 dure 2min30 et que vous entrez 2min50 en paramètre length à SDL_CDPlay(...) 20 secondes de la piste 3 seront jouées. Il existe également cinq autres fonctions à connaître pour utiliser des CD Audio avec SDL :

Conclusion

Voilà, vous en savez désormais assez pour commencer à lire des CD AUdio dans vos programmes avec SDL. N'oubliez pas de libérer les ressources allouées pour vos objets SDL_CD avec la fonction SDL_CDClose(...). Bonne chance, et bon code ;)