Hi everyone,
I'm new to game development and have a little c/c++ experience.
The other day i was following this tutorial of XCode GLUT C++ on Youtube:
The above video is about loading a .WAV file using OpenAL in c++.
The youtuber was coding with reference to Microsoft's WAVE PCM soundfile format here:
https://ccrma.stanford.edu/courses/422/projects/WaveFormat/
I have been following his code and explanations but i encountered a problem that i think he didn't.
My sound file is not the same, i got a free mario_01.wav from:
http://www.talkingwav.com/nintendo_wav_sounds.html
According to the soundfile format the AudioFormat should be 1 (Linear Quantization), but i keep getting the value of 85 which indicates it is compressed.
How do i solve this problem?
Should i decompress the file? If yes, how?
Should i get another sound file? how to get the correct AudioFormat ?
Any other way?
Any corrections to the code below?
The following code is the method to load the wave file, the variable AudioFormat is concerned with the issue the issue:
Sound* Sound::loadWAVE(const char* filename) {
FILE* fp = NULL;
fp = fopen(filename, "r");
if (!fp) {
cout << "Could NOT open: " << filename << "!" << endl;
fclose(fp);
return NULL;
}
char* ChunkID = new char[4];
fread(ChunkID, 4, sizeof(char), fp);
if (strcmp(ChunkID, "RIFF")) {
delete [] ChunkID;
cout << "Not RIFF!" << endl;
fclose(fp);
return NULL;
}
fseek(fp, 8, SEEK_SET);
char* Format = new char[4];
fread(Format, 4, sizeof(char), fp);
if (strcmp(Format, "WAVE")) {
delete [] ChunkID;
delete [] Format;
cout << "Not WAVE!" << endl;
fclose(fp);
return NULL;
}
char* SubChunk1ID = new char[4];
fread(SubChunk1ID, 4, sizeof(char), fp);
if (strcmp(SubChunk1ID, "fmt ")) {
delete [] ChunkID;
delete [] Format;
delete [] SubChunk1ID;
cout << "Corrupt SubChunk1ID!" << endl;
fclose(fp);
return NULL;
}
unsigned int SubChunk1Size;
fread(&SubChunk1Size, 1, sizeof(unsigned int), fp);
unsigned int SubChunk2Location = (unsigned int)ftell(fp) + SubChunk1Size;
// -------------------------------------- THIS PART
unsigned short AudioFormat;
fread(&AudioFormat, 1, sizeof(unsigned short), fp);
if (AudioFormat != 1) { // AudioFormat = 85, should be 1
delete [] ChunkID;
delete [] Format;
delete [] SubChunk1ID;
cout << "Audio is NOT PCM!" << endl;
fclose(fp);
return NULL;
}
// --------------------------------------
unsigned short NumChannels;
fread(&NumChannels, 1, sizeof(unsigned short), fp);
unsigned int SampleRate;
fread(&SampleRate, 1, sizeof(unsigned int), fp);
fseek(fp, 34, SEEK_SET);
unsigned short BitsPerSample;
fread(&BitsPerSample, 1, sizeof(unsigned short), fp);
int ALFormat;
if (NumChannels == 1 && BitsPerSample == 8) {
ALFormat = AL_FORMAT_MONO8;
} else if (NumChannels == 1 && BitsPerSample == 16) {
ALFormat = AL_FORMAT_MONO16;
} else if (NumChannels == 2 && BitsPerSample == 8) {
ALFormat = AL_FORMAT_STEREO8;
} else if (NumChannels == 2 && BitsPerSample == 16) {
ALFormat = AL_FORMAT_STEREO16;
} else {
delete [] ChunkID;
delete [] Format;
delete [] SubChunk1ID;
cout << "Audio is Not correctly formatted!" << endl;
fclose(fp);
return NULL;
}
fseek(fp, SubChunk2Location, SEEK_SET);
char* SubChunk2ID = new char[4];
fread(SubChunk2ID, 4, sizeof(char), fp);
if (strcmp(SubChunk2ID, "data")) {
delete [] ChunkID;
delete [] Format;
delete [] SubChunk1ID;
delete [] SubChunk2ID;
cout << "Corrupt SubChunk2ID!" << endl;
fclose(fp);
return NULL;
}
unsigned int SubChunk2Size;
fread(&SubChunk2Size, 1, sizeof(unsigned int), fp);
unsigned char* Data = new unsigned char[SubChunk2Size];
fread(Data, SubChunk2Size, sizeof(unsigned char), fp);
delete [] ChunkID;
delete [] Format;
delete [] SubChunk1ID;
delete [] SubChunk2ID;
fclose(fp);
return new Sound(ALFormat, SampleRate, Data, SubChunk2Size);
}
Thank you in advance for your patience and help!