/**
 * @file lecture.c
 *
 * Ce module implémente les fonctions du fichier lecture.h
 *
 * @version 1
 * @author Quentin, Guy
 * @date Mai 2014
 */

#include "lecture.h"

void lireTick (FMOD_SYSTEM* system, Motif* m, int tmp, FMOD_SOUND* sample[], FMOD_CHANNEL* chan[], int nbrPortees, int tempo) {    // On va lire les ticks (plus petite division temporelle de la playlist) de haut en bas

	//int tempsPrecedent = SDL_GetTicks();

	for (int chaine = 0; chaine < nbrPortees; chaine++) {    // On va lire les chaines une à une par numéro croissant
		if (m != NULL) {
			if (getInstrument(m,0,tmp) == -1) FMOD_Channel_Stop(chan[0]);           // Si la note est un silence, la chaine s'arrête
			else {
				if (getNote(m,0,tmp) != 0) {

					FMOD_Channel_Stop(chan[chaine]); 
					FMOD_System_PlaySound(system, FMOD_CHANNEL_FREE, sample[getInstrument(m,chaine,tmp)], 0, &chan[chaine]);

					//Ici on va s'occuper du pitch
					FMOD_DSP *pitch;
					FMOD_System_CreateDSPByType(system, FMOD_DSP_TYPE_PITCHSHIFT, &pitch);
					FMOD_DSP_SetParameter(pitch, FMOD_DSP_PITCHSHIFT_PITCH, 2.0);
					FMOD_Channel_AddDSP(chan[chaine], pitch, 0); // C'est quoi chan1 ??? Je l'ai remplacé par chan[1], vu que chan1 est as déclaré...
					// On va passer une bonne journée...
				}
			}
		}
	}
	/* while (SDL_GetTicks() - tempsPrecedent < 125) {} // Si 125 ms se sont écoulées (il faudra régler ce temps sur le tempo)
	   tempsPrecedent = tempsPrecedent + 125;
	   Avouez que ce serait con qu'on ait besoin de SDL juste pour la temporisation
	   alors qu'on peut utiliser la fonction native usleep pour ça, et beaucoup plus simplement. */
	usleep(60000000/tempo);
}



void lecture (int nombreChaines, int tempo, Motif* melodie[]) {

	FMOD_SYSTEM *system;

	FMOD_RESULT resultat;


	FMOD_System_Create(&system);
	FMOD_System_Init(system, 8, FMOD_INIT_NORMAL, NULL);    //Le deuxième argument donne le nombre de canaux à utiliser (nombre de chaines)


	//INITIALISATION SAMPLES ET CHANNELS

	FMOD_CHANNEL **chan = malloc(nombreChaines*sizeof(FMOD_CHANNEL*));          // On ouvre le nombre de chaines nécessaires dans le mixer

	FMOD_SOUND *sample[5];                      // On charge les samples avec un message d'erreur en cas d'échec

	resultat = FMOD_System_CreateStream(system, "lecture/0.wav", FMOD_SOFTWARE | FMOD_2D | FMOD_LOOP_NORMAL, 0, &sample[0]);
	if (resultat != FMOD_OK)
	{
		fprintf(stderr, "Impossible de lire le fichier audio\n");
		exit(EXIT_FAILURE);
	}

	resultat = FMOD_System_CreateStream(system, "lecture/1.wav", FMOD_SOFTWARE | FMOD_2D | FMOD_LOOP_NORMAL, 0, &sample[1]);
	if (resultat != FMOD_OK)
	{
		fprintf(stderr, "Impossible de lire le fichier audio\n");
		exit(EXIT_FAILURE);
	}

	resultat = FMOD_System_CreateStream(system, "lecture/2.wav", FMOD_SOFTWARE | FMOD_2D | FMOD_LOOP_NORMAL, 0, &sample[2]);
	if (resultat != FMOD_OK)
	{
		fprintf(stderr, "Impossible de lire le fichier audio\n");
		exit(EXIT_FAILURE);
	}

	resultat = FMOD_System_CreateStream(system, "lecture/3.wav", FMOD_SOFTWARE | FMOD_2D | FMOD_LOOP_NORMAL, 0, &sample[3]);
	if (resultat != FMOD_OK)
	{
		fprintf(stderr, "Impossible de lire le fichier audio\n");
		exit(EXIT_FAILURE);
	}

	resultat = FMOD_System_CreateStream(system, "lecture/4.wav", FMOD_SOFTWARE | FMOD_2D | FMOD_LOOP_NORMAL, 0, &sample[4]);
	if (resultat != FMOD_OK)
	{
		fprintf(stderr, "Impossible de lire le fichier audio\n");
		exit(EXIT_FAILURE);
	}


	//Lecture des motifs
	for (courant = 0; courant < taille; courant++) {
		for (int i = 0; i < melodie[courant] -> nbrTmp; i++) {
			printf("lecture temps %d : N=%d I=%d\n",i,getNote(melodie[courant],0,i),getInstrument(melodie[courant],0,i));
			lireTick (system, melodie[courant], i, sample, chan, nombreChaines, tempo);
		}
	}

	//On relache le système FMOD
	for (int i = 0; i <= nombreChaines; i++) {
		FMOD_Sound_Release(sample[i]);
	}
	FMOD_System_Close(system);
	FMOD_System_Release(system);
}
