Il Sat, 30 Jan 2010 19:50:48 +0100, Moi ha scritto:
What is the definition of c ?
short int c;
If c is a signed short, why do you use %d as a format (%d expects an
int). use %hd if c is a short.
Also, I believe the sample frequency for .wav files is 44KHz, which
means that a typical music frequency takes in the order of 100
cycles for a full cycle. If the first sample is negative, I'd expect
the next ~~ 50 cycles to be negative, too.
I counted negative and positive values, and they were all negatives.
BTW: post some complete code.
BTW2: use hexdump or octdump to verify your program's logic. Just
visually skip the file header.
This is the code
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned long uint32;
typedef enum {false,true} boolean;
typedef struct
{
unsigned char chunkID[4]; // Contiene le lettere "RIFF" in
formato ASCII form (0x52494646 formato big-endian)
unsigned int ChunkSize; // 36 + SubChunk2Size, o più
precisamente:
// 4 + (8 + SubChunk1Size) + (8 + SubChunk2Size)
// Questa è la dimensione del resto del chunk
che segue questo numero.Questa è la dimensione dell'intero file
// in bytes meno 8 bytes per i due campi non
inclusi in queto conteggio
// ChunkID e ChunkSize.
unsigned char Format[4]; // Contiene le lettere
"WAVE"(0x57415645 formato big-endian).
unsigned char Subchunk1ID[4]; // Contiene le lettere "fmt
" (0x666d7420 formato big-endian).
unsigned int Subchunk1Size; // 16 for PCM. This is the size of the
rest of the Subchunk which follows this number
short int AudioFormat; // PCM = 1 (i.e. Linear quantization)
// Values other than 1 indicate someform of
compression.
short int NumChannels; // Mono = 1, Stereo += 2, etc.
int SampleRate; // 8000, 44100, etc.
int ByteRate; // = SampleRate * NumChannels * BitsPerSample/8
short int BlockAlign; // = NumChannels * BitsPerSample/8
// The number of bytes for one sample including
all channels
short int BitsPerSample;// 8 bits += 8, 16 bits += 16, etc.
short int Extra;
unsigned char Data[4]; // Contains the letters "data" (0x64617461 big-
endian form).
unsigned int DataSize ; // = NumSamples * NumChannels *
BitsPerSample/8 This is the number of bytes in the data.
} __attribute__ (( packed )) RIFF_HEADER;
boolean ispadded(RIFF_HEADER *header);
int main(int argc, char *argv[])
{
RIFF_HEADER *header;
FILE *fp;
int i;
int num_neg=0;
int num_pos=0;
short int c;
char *filename;
char *dati;
if(argc>1)
{
printf("Lunghezza argv[1]: %d\n",strlen(argv[1]));
filename=(char *)(malloc(strlen(argv[1])+1));
strcpy(filename,argv[1]);
printf("Filename:%s\n",filename);
fp=fopen(filename,"rb");
}
header=(RIFF_HEADER *)malloc(sizeof(RIFF_HEADER));
printf("Header Size=%d\n",sizeof(RIFF_HEADER));
fread(header,sizeof(RIFF_HEADER),1,fp);
printf("Is Padded %d\n",ispadded(header));
printf("ChunkID:%4.4s\n",header->chunkID);
printf("ChunkSize:%u\n",header->ChunkSize);
printf("Format:%4.4s\n",header->Format);
printf("Subchunk1ID:%4.4s\n", header->Subchunk1ID);
printf("Subchunk1Size:%u\n",header->Subchunk1Size);
printf("AudioFormat:%d\n",header->AudioFormat);
printf("NumChannels:%d\n",header->NumChannels);
printf("SampleRate:%d\n",header->SampleRate);
printf("ByteRate:%d\n",header->ByteRate);
printf("BlockAlign:%d\n",header->BlockAlign);
printf("BitsPerSample:%d\n",header->BitsPerSample);
printf("Extra:%d\n",header->Extra);
printf("Data:%4.4s\n",header->Data);
printf("DataSize:%u\n",(header->DataSize));
dati=(char *) malloc(header->DataSize+1);
if(dati==NULL) printf("Errore. memoria insufficiente!\n");
i=0;
//if (fread(dati,header->DataSize,1,fp)>0) printf("Lettura eseguita
correttamente\n");
//else
//printf("Lettura non eseguita correttamente\n");
//printf("strlen(dati)=%d\n",strlen(dati));
//dati[strlen(dati)+1]='\0';
//printf("strlen(dati)=%d\n",strlen(dati));
//fread(&c,sizeof(int),1,fp);
while(fread(&c,sizeof(short int),1,fp)>0)
{
if (c>0) num_pos++;
else
num_neg++;
printf("%hd\n",c);
}
printf("\n Neg:%d Pos:%d\n",num_neg, num_pos);
//while(*dati!='\0'){
//for (i=0;i<header->DataSize;i++)
//printf("\t i=%d dati=%d",i,dati
);
return 0;
}
boolean ispadded(RIFF_HEADER *header)
{
short int sizeofheaders=sizeof(RIFF_HEADER);
short int size_of_fields=0;
size_of_fields+=sizeof(header->chunkID);
size_of_fields+=sizeof(header->ChunkSize);
size_of_fields+=sizeof(header->Format);
size_of_fields+=sizeof(header->Subchunk1ID);
size_of_fields+=sizeof(header->Subchunk1Size);
size_of_fields+=sizeof(header->AudioFormat);
size_of_fields+=sizeof(header->NumChannels);
size_of_fields+=sizeof(header->SampleRate);
size_of_fields+=sizeof(header->ByteRate);
size_of_fields+=sizeof(header->BlockAlign);
size_of_fields+=sizeof(header->BitsPerSample);
size_of_fields+=sizeof(header->Data);
size_of_fields+=sizeof(header->DataSize);
size_of_fields+=sizeof(header->Extra);
printf("Header size=%d fields size=%d\n",sizeofheaders,size_of_fields);
return (sizeofheaders==size_of_fields);
}