SOUNDEMITTER COMPLETE!?!?!?
This commit is contained in:
@@ -57,7 +57,7 @@ void GameWorld::Initialize()
|
|||||||
//AddSystem("CollisionSystem");
|
//AddSystem("CollisionSystem");
|
||||||
//AddSystem("ParticleSystem");
|
//AddSystem("ParticleSystem");
|
||||||
AddSystem("PlayerSystem");
|
AddSystem("PlayerSystem");
|
||||||
//AddSystem("SoundSystem");
|
AddSystem("SoundSystem");
|
||||||
AddSystem("RenderSystem");
|
AddSystem("RenderSystem");
|
||||||
|
|
||||||
std::shared_ptr<Components::Transform> transform;
|
std::shared_ptr<Components::Transform> transform;
|
||||||
@@ -70,6 +70,14 @@ void GameWorld::Initialize()
|
|||||||
transform->Position = glm::vec3(0.f, 0.f, 0.f);
|
transform->Position = glm::vec3(0.f, 0.f, 0.f);
|
||||||
model = AddComponent<Components::Model>(ent, "Model");
|
model = AddComponent<Components::Model>(ent, "Model");
|
||||||
model->ModelFile = "ship.obj";
|
model->ModelFile = "ship.obj";
|
||||||
|
auto soundEmitter = AddComponent<Components::SoundEmitter>(ent, "SoundEmitter");
|
||||||
|
soundEmitter->Gain = 1;
|
||||||
|
soundEmitter->MaxDistance = 10;
|
||||||
|
soundEmitter->Loop = true;
|
||||||
|
soundEmitter->ReferenceDistance = 0.1;
|
||||||
|
soundEmitter->Pitch = 1;
|
||||||
|
GetSystem<Systems::SoundSystem>("SoundSystem")->PlaySound(soundEmitter, "hallelujah.wav");
|
||||||
|
|
||||||
|
|
||||||
ent = CreateEntity();
|
ent = CreateEntity();
|
||||||
SetProperty(ent, "Name", std::string("Camera"));
|
SetProperty(ent, "Name", std::string("Camera"));
|
||||||
@@ -90,7 +98,7 @@ void GameWorld::RegisterSystems()
|
|||||||
//m_SystemFactory.Register("CollisionSystem", [this]() { return new Systems::CollisionSystem(this); });
|
//m_SystemFactory.Register("CollisionSystem", [this]() { return new Systems::CollisionSystem(this); });
|
||||||
//m_SystemFactory.Register("ParticleSystem", [this]() { return new Systems::ParticleSystem(this); });
|
//m_SystemFactory.Register("ParticleSystem", [this]() { return new Systems::ParticleSystem(this); });
|
||||||
m_SystemFactory.Register("PlayerSystem", [this]() { return new Systems::PlayerSystem(this); });
|
m_SystemFactory.Register("PlayerSystem", [this]() { return new Systems::PlayerSystem(this); });
|
||||||
//m_SystemFactory.Register("SoundSystem", [this]() { return new Systems::SoundSystem(this); });
|
m_SystemFactory.Register("SoundSystem", [this]() { return new Systems::SoundSystem(this); });
|
||||||
m_SystemFactory.Register("RenderSystem", [this]() { return new Systems::RenderSystem(this, m_Renderer); });
|
m_SystemFactory.Register("RenderSystem", [this]() { return new Systems::RenderSystem(this, m_Renderer); });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
@@ -26,7 +26,7 @@ public:
|
|||||||
void UpdateEntity(double dt, EntityID entity, EntityID parent) override;
|
void UpdateEntity(double dt, EntityID entity, EntityID parent) override;
|
||||||
void OnComponentCreated(std::string type, std::shared_ptr<Component> component) override;
|
void OnComponentCreated(std::string type, std::shared_ptr<Component> component) override;
|
||||||
void PlaySound(std::shared_ptr<Components::SoundEmitter> emitter, std::string fileName);
|
void PlaySound(std::shared_ptr<Components::SoundEmitter> emitter, std::string fileName);
|
||||||
void LoadFile(const char* fileName);
|
ALuint LoadFile(std::string fileName);
|
||||||
ALuint CreateSource();
|
ALuint CreateSource();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -39,10 +39,10 @@ private:
|
|||||||
DWORD sampleRate, avgBytesPerSec;
|
DWORD sampleRate, avgBytesPerSec;
|
||||||
short bytesPerSample, bitsPerSample;
|
short bytesPerSample, bitsPerSample;
|
||||||
DWORD dataSize;
|
DWORD dataSize;
|
||||||
unsigned char* buf;
|
|
||||||
|
|
||||||
std::map<Component*, ALuint> source;
|
std::map<Component*, ALuint> source;
|
||||||
std::map<std::string, ALuint> buffer; // string = fileName
|
std::map<std::string, ALuint> m_BufferCache; // string = fileName
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,6 +71,8 @@ void Systems::SoundSystem::UpdateEntity(double dt, EntityID entity, EntityID par
|
|||||||
|
|
||||||
void Systems::SoundSystem::PlaySound(std::shared_ptr<Components::SoundEmitter> emitter, std::string fileName)
|
void Systems::SoundSystem::PlaySound(std::shared_ptr<Components::SoundEmitter> emitter, std::string fileName)
|
||||||
{
|
{
|
||||||
|
ALuint buffer = LoadFile(fileName);
|
||||||
|
alSourcei(source[emitter.get()], AL_BUFFER, buffer);
|
||||||
alSourcePlay(source[emitter.get()]);
|
alSourcePlay(source[emitter.get()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,24 +82,33 @@ void Systems::SoundSystem::OnComponentCreated(std::string type, std::shared_ptr<
|
|||||||
source[component.get()] = CreateSource();
|
source[component.get()] = CreateSource();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Systems::SoundSystem::LoadFile(const char* fileName)
|
ALuint Systems::SoundSystem::LoadFile(std::string fileName)
|
||||||
{
|
{
|
||||||
|
if (m_BufferCache.find(fileName) != m_BufferCache.end())
|
||||||
|
return m_BufferCache[fileName];
|
||||||
|
|
||||||
FILE *fp = NULL;
|
FILE *fp = NULL;
|
||||||
fp = fopen(strcat("Sounds/", fileName), "rb");
|
fp = fopen(strcat("Sounds/", fileName.c_str()), "rb");
|
||||||
|
|
||||||
//CHECK FOR VALID WAVE-FILE
|
//CHECK FOR VALID WAVE-FILE
|
||||||
fread(type, sizeof(char), 4, fp);
|
fread(type, sizeof(char), 4, fp);
|
||||||
if(type[0]!='R' || type[1]!='I' || type[2]!='F' || type[3]!='F')
|
if(type[0]!='R' || type[1]!='I' || type[2]!='F' || type[3]!='F') {
|
||||||
return LOG_ERROR("ERROR: No RIFF in WAVE-file");
|
LOG_ERROR("ERROR: No RIFF in WAVE-file");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
fread(&size, sizeof(DWORD), 1, fp);
|
fread(&size, sizeof(DWORD), 1, fp);
|
||||||
fread(type, sizeof(char), 4, fp);
|
fread(type, sizeof(char), 4, fp);
|
||||||
if(type[0]!='W' || type[1]!='A' || type[2]!='V' || type[3]!='E')
|
if(type[0]!='W' || type[1]!='A' || type[2]!='V' || type[3]!='E') {
|
||||||
return LOG_ERROR("ERROR: Not WAVE-file");
|
LOG_ERROR("ERROR: Not WAVE-file");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
fread(type, sizeof(char), 4, fp);
|
fread(type, sizeof(char), 4, fp);
|
||||||
if(type[0]!='f' || type[1]!='m' || type[2]!='t' || type[3]!=' ')
|
if(type[0]!='f' || type[1]!='m' || type[2]!='t' || type[3]!=' ') {
|
||||||
return LOG_ERROR("ERROR: No fmt in WAVE-file");
|
LOG_ERROR("ERROR: No fmt in WAVE-file");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
//READ THE DATA FROM WAVE-FILE
|
//READ THE DATA FROM WAVE-FILE
|
||||||
fread(&chunkSize, sizeof(DWORD), 1, fp);
|
fread(&chunkSize, sizeof(DWORD), 1, fp);
|
||||||
@@ -110,26 +121,19 @@ void Systems::SoundSystem::LoadFile(const char* fileName)
|
|||||||
|
|
||||||
fread(type, sizeof(char), 4, fp);
|
fread(type, sizeof(char), 4, fp);
|
||||||
if(type[0]!='d' || type[1]!='a' || type[2]!='t' || type[3]!='a')
|
if(type[0]!='d' || type[1]!='a' || type[2]!='t' || type[3]!='a')
|
||||||
return LOG_ERROR("ERROR: WAVE-file Missing data");
|
{
|
||||||
|
LOG_ERROR("ERROR: WAVE-file Missing data");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
fread(&dataSize, sizeof(DWORD), 1, fp);
|
fread(&dataSize, sizeof(DWORD), 1, fp);
|
||||||
|
|
||||||
buf = new unsigned char[dataSize];
|
unsigned char* buf = new unsigned char[dataSize];
|
||||||
fread(buf, sizeof(BYTE), dataSize, fp);
|
fread(buf, sizeof(BYTE), dataSize, fp);
|
||||||
|
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
}
|
|
||||||
|
|
||||||
ALuint Systems::SoundSystem::CreateSource()
|
// Create buffer
|
||||||
{
|
|
||||||
ALuint source;
|
|
||||||
ALuint buffer;
|
|
||||||
ALuint frequency = sampleRate;
|
|
||||||
ALuint format = 0;
|
ALuint format = 0;
|
||||||
|
|
||||||
alGenBuffers(1, &buffer);
|
|
||||||
alGenBuffers(1, &source);
|
|
||||||
|
|
||||||
if(bitsPerSample == 8)
|
if(bitsPerSample == 8)
|
||||||
{
|
{
|
||||||
if(channels == 1)
|
if(channels == 1)
|
||||||
@@ -137,7 +141,6 @@ ALuint Systems::SoundSystem::CreateSource()
|
|||||||
else if(channels == 2)
|
else if(channels == 2)
|
||||||
format = AL_FORMAT_STEREO8;
|
format = AL_FORMAT_STEREO8;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(bitsPerSample == 16)
|
if(bitsPerSample == 16)
|
||||||
{
|
{
|
||||||
if (channels == 1)
|
if (channels == 1)
|
||||||
@@ -145,8 +148,18 @@ ALuint Systems::SoundSystem::CreateSource()
|
|||||||
else if (channels == 2)
|
else if (channels == 2)
|
||||||
format = AL_FORMAT_STEREO16;
|
format = AL_FORMAT_STEREO16;
|
||||||
}
|
}
|
||||||
|
ALuint buffer;
|
||||||
|
alGenBuffers(1, &buffer);
|
||||||
|
alBufferData(buffer, format, buf, dataSize, sampleRate);
|
||||||
|
|
||||||
alBufferData(buffer, format, buf, dataSize, frequency);
|
m_BufferCache[fileName] = buffer;
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
ALuint Systems::SoundSystem::CreateSource()
|
||||||
|
{
|
||||||
|
ALuint source;
|
||||||
|
alGenBuffers(1, &source);
|
||||||
|
|
||||||
return source;
|
return source;
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user