djremix
29-05-2014, 17:40
Buonasera a tutti,
sono alle prese con un progetto. Ho recuperato e messo assieme codice per la creazione di un file wav con determinate caratteristiche e per la lettura delle caratteristiche generali di un file wav. Il tutto è in linguaggio C.
Il problema è che utilizzando questo codice:
#include <stdio.h>
#include <stdint.h>
struct T_RIFF {
uint8_t ChunkID[4];
uint32_t ChunkSize;
uint8_t Format[4];
};
struct T_fmt {
uint8_t Subchunk1ID[4];
uint32_t Subchunk1Size;
uint16_t AudioFormat;
uint16_t NumChannels;
uint32_t SampleRate;
uint32_t ByteRate;
uint16_t BlockAlign;
uint16_t BitsPerSample;
};
struct T_data_nosamples {
uint8_t Subchunk2ID[4];
uint32_t Subchunk2Size;
};
struct T_data {
uint8_t Subchunk2ID[4];
uint32_t Subchunk2Size;
};
struct T_WAVE {
struct T_RIFF RIFFheader;
struct T_fmt fmtheader;
struct T_data dataheader;
};
main() {
struct T_WAVE WAVE;
printf("Inserisci il percorso del file: ");
char percorso[50];
scanf("%s",percorso);
FILE* stream = fopen(percorso,"r");
if (stream==NULL)
printf ("Il file non esiste! \n");
else {
fread(&WAVE,1,44,stream);
uint32_t Samplesize, Sample;
printf ("Grandezza blocco: %d byte\n\n",WAVE.RIFFheader.ChunkSize);
printf ("Grandezza blocco fmt: %d byte\n",WAVE.fmtheader.Subchunk1Size);
printf ("Formato audio: %d\n",WAVE.fmtheader.AudioFormat);
printf ("Numero di canali: %d\n",WAVE.fmtheader.NumChannels);
printf ("Frequenza di campionamento: %d Hz\n",WAVE.fmtheader.SampleRate);
printf ("Frequenza di byte: %d byte/s\n",WAVE.fmtheader.ByteRate);
printf ("Allineamento blocco: %d\n",WAVE.fmtheader.BlockAlign);
printf ("Bits per campione: %d\n\n",WAVE.fmtheader.BitsPerSample);
printf ("Grandezza blocco data: %d byte\n\n",WAVE.dataheader.Subchunk2Size);
float durata = (float) WAVE.dataheader.Subchunk2Size/WAVE.fmtheader.ByteRate;
int durataAppr = WAVE.dataheader.Subchunk2Size/WAVE.fmtheader.ByteRate;
printf ("Durata in secondi: %d s\n",durataAppr);
uint32_t SampleSize = WAVE.fmtheader.BitsPerSample / 8;
uint32_t numcampioni = (uint32_t) durata * WAVE.fmtheader.SampleRate;
//processa16bit(WAVE.fmtheader.NumChannels,SampleSize,numcampioni,stream);
fclose(stream);
}
system("pause");
return 0;
}
leggo le caratteristiche generali del file wav ma non la frequenza del suono contenuto (che dovrebbe essere nella parte "dati" del file). Come si potrebbe fare ?
Grazie mille.
sono alle prese con un progetto. Ho recuperato e messo assieme codice per la creazione di un file wav con determinate caratteristiche e per la lettura delle caratteristiche generali di un file wav. Il tutto è in linguaggio C.
Il problema è che utilizzando questo codice:
#include <stdio.h>
#include <stdint.h>
struct T_RIFF {
uint8_t ChunkID[4];
uint32_t ChunkSize;
uint8_t Format[4];
};
struct T_fmt {
uint8_t Subchunk1ID[4];
uint32_t Subchunk1Size;
uint16_t AudioFormat;
uint16_t NumChannels;
uint32_t SampleRate;
uint32_t ByteRate;
uint16_t BlockAlign;
uint16_t BitsPerSample;
};
struct T_data_nosamples {
uint8_t Subchunk2ID[4];
uint32_t Subchunk2Size;
};
struct T_data {
uint8_t Subchunk2ID[4];
uint32_t Subchunk2Size;
};
struct T_WAVE {
struct T_RIFF RIFFheader;
struct T_fmt fmtheader;
struct T_data dataheader;
};
main() {
struct T_WAVE WAVE;
printf("Inserisci il percorso del file: ");
char percorso[50];
scanf("%s",percorso);
FILE* stream = fopen(percorso,"r");
if (stream==NULL)
printf ("Il file non esiste! \n");
else {
fread(&WAVE,1,44,stream);
uint32_t Samplesize, Sample;
printf ("Grandezza blocco: %d byte\n\n",WAVE.RIFFheader.ChunkSize);
printf ("Grandezza blocco fmt: %d byte\n",WAVE.fmtheader.Subchunk1Size);
printf ("Formato audio: %d\n",WAVE.fmtheader.AudioFormat);
printf ("Numero di canali: %d\n",WAVE.fmtheader.NumChannels);
printf ("Frequenza di campionamento: %d Hz\n",WAVE.fmtheader.SampleRate);
printf ("Frequenza di byte: %d byte/s\n",WAVE.fmtheader.ByteRate);
printf ("Allineamento blocco: %d\n",WAVE.fmtheader.BlockAlign);
printf ("Bits per campione: %d\n\n",WAVE.fmtheader.BitsPerSample);
printf ("Grandezza blocco data: %d byte\n\n",WAVE.dataheader.Subchunk2Size);
float durata = (float) WAVE.dataheader.Subchunk2Size/WAVE.fmtheader.ByteRate;
int durataAppr = WAVE.dataheader.Subchunk2Size/WAVE.fmtheader.ByteRate;
printf ("Durata in secondi: %d s\n",durataAppr);
uint32_t SampleSize = WAVE.fmtheader.BitsPerSample / 8;
uint32_t numcampioni = (uint32_t) durata * WAVE.fmtheader.SampleRate;
//processa16bit(WAVE.fmtheader.NumChannels,SampleSize,numcampioni,stream);
fclose(stream);
}
system("pause");
return 0;
}
leggo le caratteristiche generali del file wav ma non la frequenza del suono contenuto (che dovrebbe essere nella parte "dati" del file). Come si potrebbe fare ?
Grazie mille.