#include #include #include #include using namespace std; #include "Wave.hpp" Wave::Wave() { //Vérifi que tout est correct pour la taille des types checkTypesSize(); is_data8_allocated = false; // Tableau non encore alloué is_data16_allocated = false; // Tableau non encore alloué } Wave::Wave(short* data16, // Tableau de données long int data_nb, // Nombre de données short channels_nb, // Nombre de canaux (1 pour mono ou 2 pour stéréo) int sampling_freq) { // Fréquence d'échantillonnage (en Hertz)(classique en musique : 44100 Hz) int i; // Vérifi que tout est correct pour la taille des types checkTypesSize(); // Nombre de données (*this).data_nb = data_nb; // Tableau de donées lorsque l'on est sur des données 16 bits (*this).data16 = new short[data_nb]; for (i=0; i>(8*i); //little-endian : increasing numeric significance with increasing memory addresses } // format : format de fichier (1: PCM, ...) for (i=0; i<2; i++, pos++) { //Bit de poids faible en premier header[pos] = (( 255 << (8*i) ) & format)>>(8*i); //little-endian : increasing numeric significance with increasing memory addresses } // channels_nb : Nombre de canaux (1 pour mono ou 2 pour stéréo) for (i=0; i<2; i++, pos++) { //Bit de poids faible en premier header[pos] = (( 255 << (8*i) ) & channels_nb)>>(8*i); //little-endian : increasing numeric significance with increasing memory addresses } // sampling_freq : fréquence d'échantillonge for (i=0; i<4; i++, pos++) { //Bit de poids faible en premier header[pos] = (( 255 << (8*i) ) & sampling_freq)>>(8*i); //little-endian : increasing numeric significance with increasing memory addresses } // bytes_per_second : nombre d'octets par seconde de musique for (i=0; i<4; i++, pos++) { //Bit de poids faible en premier header[pos] = (( 255 << (8*i) ) & bytes_per_second)>>(8*i); //little-endian : increasing numeric significance with increasing memory addresses } // bytes_per_sample : nombre d'octets par échantillon for (i=0; i<2; i++, pos++) { //Bit de poids faible en premier header[pos] = (( 255 << (8*i) ) & bytes_per_sample)>>(8*i); //little-endian : increasing numeric significance with increasing memory addresses } // depth : nombre de bits par donnée (8 ou 16) for (i=0; i<2; i++, pos++) { //Bit de poids faible en premier header[pos] = (( 255 << (8*i) ) & depth)>>(8*i); //little-endian : increasing numeric significance with increasing memory addresses } //chunk données : constante "data" for (i=0; i<4; i++, pos++) { header[pos] = data_id[i]; // Constante "data" } // data_size : nombre d'octet restant (i.e = taille du fichier moins 44 octets) for (i=0; i<4; i++, pos++) { //Bit de poids faible en premier header[pos] = (( 255 << (8*i) ) & data_size)>>(8*i); //little-endian : increasing numeric significance with increasing memory addresses } // ECRITURE DU HEADER if (fwrite (header, 1, 44, fd) != 44) { cout<<"Wave::write: Erreur, impossible d'écrire dans le fichier "<>file_type[i]; // Constante "RIFF" i.e identification du format // cout<>str_tmp[i]; // //Bit de poids faible en premier // file_size +=(int)pow(256, i)*(int)str_tmp[i]; //little-endian : increasing numeric significance with increasing memory addresses // } // cout<<"Wave::read: Le nombre d'octets restant à lire est : "<>file_id[i]; // Identifiant "WAVE" // cout<>chunk_id[i]; // Identifiant "fmt " // cout<<(int)chunk_id[i]<>str_tmp[i]; // cout<<(int)str_tmp[i]<>str_tmp[i]; // //Bit de poids faible en premier // format +=(int)pow(256, i)*(int)str_tmp[i]; //little-endian : increasing numeric significance with increasing memory addresses // } // cout<<"Wave::read: Le format est (1=PCM) : "<>channels_nb; // Nombre de canaux (1 pour mono ou 2 pour stéréo) //// cout<<"Wave::read: Le nombre de canaux est : "<>sampling_freq; // Fréquence d'échantillonnage (en Hertz) //// cout<<"Wave::read: La fréquence d'échantillonge est : "<>bytes_per_second; // Nombre d'octets par seconde de musique //// cout<<"Wave::read: Le nombre d'octets par seconde est : "<>bytes_per_sample; // Nombre d'octets par échantillon //// cout<<"Wave::read: Le nombre d'octets par échantillon est : "<>depth; // Nombre de bits par donnée (8 ou 16) //// cout<<"Wave::read: Le nombre de bits par donnée est : "<>data_id[i]; // Constante "data" //// cout<>data_size; // nombre d'octet restant (i.e = taille du fichier moins 44 octets) //// //// //LECTURE DES DONNEES //// switch (depth) { //// case 8: //// samples_nb = data_size; //// data = new short[samples_nb]; //// char c; //// for (i=0; i>c; //Lecture de 8 bits //// data[i] = (short)c; //// } //// break; //// case 16: //// samples_nb = data_size/2; //// data = new short[samples_nb]; //// for (i=0; i>data[i]; //Lecture de 16 bits //// } //// break; //// default: //// cout<<"Wave::read: Erreur, la profondeur (depth = "<>c; //// /*TEST*/} //// /////* ifs>>chunk_size; // Nombre d'octets utilisés pour définir en détail le chunk //// ifs>>format; // Format de fichier (1: PCM, ...) //// cout<<"Wave::read: Le format est (1=PCM) : "<>channels_nb; // Nombre de canaux (1 pour mono ou 2 pour stéréo) //// cout<<"Wave::read: Le nombre de canaux est : "<>sampling_freq; // Fréquence d'échantillonnage (en Hertz) //// cout<<"Wave::read: La fréquence d'échantillonge est : "<>bytes_per_second; // Nombre d'octets par seconde de musique //// cout<<"Wave::read: Le nombre d'octets par seconde est : "<>bytes_per_sample; // Nombre d'octets par échantillon //// cout<<"Wave::read: Le nombre d'octets par échantillon est : "<>depth; // Nombre de bits par donnée (8 ou 16) //// cout<<"Wave::read: Le nombre de bits par donnée est : "<>data_id[i]; // Constante "data" //// cout<>data_size; // nombre d'octet restant (i.e = taille du fichier moins 44 octets) //// //// //LECTURE DES DONNEES //// switch (depth) { //// case 8: //// samples_nb = data_size; //// data = new short[samples_nb]; //// char c; //// for (i=0; i>c; //Lecture de 8 bits //// data[i] = (short)c; //// } //// break; //// case 16: //// samples_nb = data_size/2; //// data = new short[samples_nb]; //// for (i=0; i>data[i]; //Lecture de 16 bits //// } //// break; //// default: //// cout<<"Wave::read: Erreur, la profondeur (depth = "<