97 lines
2.2 KiB
C++
97 lines
2.2 KiB
C++
#include "PrecompiledHeader.h"
|
|
#include "Sound.h"
|
|
|
|
Sound::Sound(std::string path)
|
|
{
|
|
m_Buffer = 0;
|
|
m_Buffer = LoadFile(path);
|
|
}
|
|
|
|
ALuint Sound::LoadFile(std::string path)
|
|
{
|
|
char type[4];
|
|
unsigned long size, chunkSize;
|
|
short formatType, channels;
|
|
unsigned long sampleRate, avgBytesPerSec;
|
|
short bytesPerSample, bitsPerSample;
|
|
unsigned long dataSize;
|
|
|
|
FILE* fp = NULL;
|
|
fp = fopen(path.c_str(), "rb");
|
|
|
|
if (fp == NULL)
|
|
{
|
|
LOG_ERROR("Failed to load sound file \"%s\"", path.c_str());
|
|
return 0;
|
|
}
|
|
|
|
//CHECK FOR VALID WAVE-FILE
|
|
fread(type, sizeof(char), 4, fp);
|
|
if (type[0] != 'R' || type[1] != 'I' || type[2] != 'F' || type[3] != 'F')
|
|
{
|
|
LOG_ERROR("ERROR: No RIFF in WAVE-file");
|
|
return 0;
|
|
}
|
|
|
|
fread(&size, sizeof(unsigned long), 1, fp);
|
|
fread(type, sizeof(char), 4, fp);
|
|
if (type[0] != 'W' || type[1] != 'A' || type[2] != 'V' || type[3] != 'E')
|
|
{
|
|
LOG_ERROR("ERROR: Not WAVE-file");
|
|
return 0;
|
|
}
|
|
|
|
fread(type, sizeof(char), 4, fp);
|
|
if (type[0] != 'f' || type[1] != 'm' || type[2] != 't' || type[3] != ' ')
|
|
{
|
|
LOG_ERROR("ERROR: No fmt in WAVE-file");
|
|
return 0;
|
|
}
|
|
|
|
//READ THE DATA FROM WAVE-FILE
|
|
fread(&chunkSize, sizeof(unsigned long), 1, fp);
|
|
fread(&formatType, sizeof(short), 1, fp);
|
|
fread(&channels, sizeof(short), 1, fp);
|
|
fread(&sampleRate, sizeof(unsigned long), 1, fp);
|
|
fread(&avgBytesPerSec, sizeof(unsigned long), 1, fp);
|
|
fread(&bytesPerSample, sizeof(short), 1, fp);
|
|
fread(&bitsPerSample, sizeof(short), 1, fp);
|
|
|
|
fread(type, sizeof(char), 4, fp);
|
|
if (type[0] != 'd' || type[1] != 'a' || type[2] != 't' || type[3] != 'a')
|
|
{
|
|
LOG_ERROR("ERROR: WAVE-file Missing data");
|
|
return 0;
|
|
}
|
|
|
|
fread(&dataSize, sizeof(unsigned long), 1, fp);
|
|
|
|
unsigned char* buf = new unsigned char[dataSize];
|
|
fread(buf, sizeof(unsigned char), dataSize, fp);
|
|
fclose(fp);
|
|
|
|
// Create buffer
|
|
ALuint format = 0;
|
|
if (bitsPerSample == 8)
|
|
{
|
|
if (channels == 1)
|
|
format = AL_FORMAT_MONO8;
|
|
else if (channels == 2)
|
|
format = AL_FORMAT_STEREO8;
|
|
}
|
|
if (bitsPerSample == 16)
|
|
{
|
|
if (channels == 1)
|
|
format = AL_FORMAT_MONO16;
|
|
else if (channels == 2)
|
|
format = AL_FORMAT_STEREO16;
|
|
}
|
|
|
|
ALuint buffer;
|
|
alGenBuffers(1, &buffer);
|
|
alBufferData(buffer, format, buf, dataSize, sampleRate);
|
|
delete[] buf;
|
|
|
|
return buffer;
|
|
}
|