Refactoring SoundSystem and its events, components
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
dd::Systems::SoundSystem::~SoundSystem()
|
||||
{
|
||||
alcCloseDevice(m_Device);
|
||||
}
|
||||
};
|
||||
|
||||
void dd::Systems::SoundSystem::Initialize()
|
||||
{
|
||||
@@ -19,41 +19,26 @@ void dd::Systems::SoundSystem::Initialize()
|
||||
else {
|
||||
LOG_ERROR("OpenAL failed to initialize.");
|
||||
}
|
||||
|
||||
alGetError();
|
||||
|
||||
//Probably unnecessary. vec3(0) probably default.
|
||||
const ALfloat pos[3] = {0, 0, 0};
|
||||
//alListenerfv(AL_POSITION, pos);
|
||||
|
||||
m_SFXMasterVolume = 1.f;
|
||||
m_BGMMasterVolume = 1.f;
|
||||
|
||||
//Subscribe to events
|
||||
EVENT_SUBSCRIBE_MEMBER(m_EContact, &SoundSystem::OnContact);
|
||||
EVENT_SUBSCRIBE_MEMBER(m_EPlaySFX, &SoundSystem::OnPlaySound);
|
||||
EVENT_SUBSCRIBE_MEMBER(m_EStopSound, &SoundSystem::OnStopSound);
|
||||
EVENT_SUBSCRIBE_MEMBER(m_EMasterVolume, &SoundSystem::OnMasterVolume);
|
||||
|
||||
|
||||
//Todo: Move this
|
||||
{
|
||||
dd::Events::PlaySound e;
|
||||
e.path = "Sounds/BGM/under-the-sea-instrumental.wav";
|
||||
e.isAmbient = true;
|
||||
e.FilePath = "Sounds/BGM/under-the-sea-instrumental.wav";
|
||||
e.IsAmbient = true;
|
||||
EventBroker->Publish(e);
|
||||
}
|
||||
{
|
||||
dd::Events::PlaySound e;
|
||||
e.path = "Sounds/BGM/water-flowing.wav";
|
||||
e.volume = 0.3f;
|
||||
e.isAmbient = true;
|
||||
EventBroker->Publish(e);
|
||||
}
|
||||
{
|
||||
dd::Events::MasterVolume e;
|
||||
e.isAmbient = true;
|
||||
e.gain = 1.f;
|
||||
e.FilePath = "Sounds/BGM/water-flowing.wav";
|
||||
e.Gain = 0.3f;
|
||||
e.IsAmbient = true;
|
||||
EventBroker->Publish(e);
|
||||
}
|
||||
}
|
||||
@@ -63,7 +48,7 @@ void dd::Systems::SoundSystem::Update(double dt)
|
||||
//Clean up none-active sources
|
||||
//Only used for SFX's. BGM's are handled on stop sound.
|
||||
std::vector<ALuint> deleteList;
|
||||
for (auto item : m_SFXSourcesToBuffers) {
|
||||
for (auto& item : m_SFXSourcesToBuffers) {
|
||||
ALint sourceState;
|
||||
alGetSourcei(item.first, AL_SOURCE_STATE, &sourceState);
|
||||
if (sourceState == AL_STOPPED) {
|
||||
@@ -89,7 +74,7 @@ ALuint dd::Systems::SoundSystem::CreateSource()
|
||||
bool dd::Systems::SoundSystem::OnPlaySound(const dd::Events::PlaySound &event)
|
||||
{
|
||||
//Loading and binding sound buffer to source
|
||||
Sound *sound = ResourceManager::Load<Sound>(event.path);
|
||||
Sound *sound = ResourceManager::Load<Sound>(event.FilePath);
|
||||
if (sound == nullptr) {
|
||||
return false;
|
||||
}
|
||||
@@ -99,21 +84,21 @@ bool dd::Systems::SoundSystem::OnPlaySound(const dd::Events::PlaySound &event)
|
||||
|
||||
//Sound settings
|
||||
float relativeVolume = 1.f;
|
||||
if (event.isAmbient) {
|
||||
if (event.IsAmbient) {
|
||||
alSourcei(source, AL_LOOPING, AL_TRUE);
|
||||
relativeVolume = m_BGMMasterVolume;
|
||||
m_BGMSourcesToBuffers[source] = sound;
|
||||
|
||||
}
|
||||
else if (!event.isAmbient)
|
||||
else if (!event.IsAmbient)
|
||||
{
|
||||
m_SFXSourcesToBuffers[source] = sound;
|
||||
alSourcei(source, AL_LOOPING, AL_FALSE);
|
||||
relativeVolume = m_SFXMasterVolume;
|
||||
}
|
||||
|
||||
alSourcef(source, AL_GAIN, (event.volume * relativeVolume));
|
||||
alSourcef(source, AL_PITCH, event.pitch);
|
||||
alSourcef(source, AL_GAIN, (event.Gain * relativeVolume));
|
||||
alSourcef(source, AL_PITCH, event.Pitch);
|
||||
|
||||
|
||||
//Play
|
||||
@@ -123,53 +108,52 @@ bool dd::Systems::SoundSystem::OnPlaySound(const dd::Events::PlaySound &event)
|
||||
|
||||
bool dd::Systems::SoundSystem::OnStopSound(const dd::Events::StopSound &event)
|
||||
{
|
||||
|
||||
//TODO: Delete sources for bgms
|
||||
ALuint itemToDelete;
|
||||
for (auto item : m_BGMSourcesToBuffers)
|
||||
ALuint itemToDeleted;
|
||||
for (auto& item : m_BGMSourcesToBuffers)
|
||||
{
|
||||
if (item.second->Path() == event.path) {
|
||||
itemToDelete = item.first;
|
||||
if (item.second->Path() == event.FilePath) {
|
||||
itemToDeleted = item.first;
|
||||
break;
|
||||
}
|
||||
}
|
||||
alSourceStop(itemToDelete);
|
||||
alDeleteSources(1, &itemToDelete);
|
||||
m_BGMSourcesToBuffers.erase(itemToDelete);
|
||||
alSourceStop(itemToDeleted);
|
||||
alDeleteSources(1, &itemToDeleted);
|
||||
m_BGMSourcesToBuffers.erase(itemToDeleted);
|
||||
|
||||
//Should not because SFX's should be very short.
|
||||
//Should not happen because SFX's should be very short.
|
||||
for (auto item : m_SFXSourcesToBuffers)
|
||||
{
|
||||
if (item.second->Path() == event.path) {
|
||||
if (item.second->Path() == event.FilePath) {
|
||||
alSourceStop(item.first);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool dd::Systems::SoundSystem::OnMasterVolume(const dd::Events::MasterVolume &event)
|
||||
{
|
||||
//TODO: Make the volume depend on the value given when stored.
|
||||
//TODO: .. now it ONLY uses the master volume
|
||||
if (event.isAmbient) {
|
||||
m_BGMMasterVolume = event.gain;
|
||||
for (auto item : m_BGMSourcesToBuffers)
|
||||
//TODO: Make the Gain depend on the value given when stored.
|
||||
//TODO: .. now it ONLY uses the master Gain
|
||||
if (event.IsAmbient) {
|
||||
m_BGMMasterVolume = event.Gain;
|
||||
for (auto& item : m_BGMSourcesToBuffers)
|
||||
{
|
||||
alSourcef(item.first, AL_GAIN, event.gain);
|
||||
alSourcef(item.first, AL_GAIN, event.Gain);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else if (!event.isAmbient) {
|
||||
m_SFXMasterVolume = event.gain;
|
||||
for (auto item : m_SFXSourcesToBuffers)
|
||||
else if (!event.IsAmbient) {
|
||||
m_SFXMasterVolume = event.Gain;
|
||||
for (auto& item : m_SFXSourcesToBuffers)
|
||||
{
|
||||
alSourcef(item.first, AL_GAIN, event.gain);
|
||||
alSourcef(item.first, AL_GAIN, event.Gain);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//On contact: play the sound given in the CCOllisionSound.
|
||||
bool dd::Systems::SoundSystem::OnContact(const dd::Events::Contact &event)
|
||||
{
|
||||
//Check which entity has the collisionSound component.
|
||||
@@ -182,18 +166,13 @@ bool dd::Systems::SoundSystem::OnContact(const dd::Events::Contact &event)
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
dd::Events::StopSound e;
|
||||
e.path = "Sounds/BGM/water-flowing.wav";
|
||||
EventBroker->Publish(e);
|
||||
}
|
||||
|
||||
//Send play-sound event
|
||||
dd::Events::PlaySound e;
|
||||
e.path = collisionSound->filePath;
|
||||
e.isAmbient = false;
|
||||
e.FilePath = collisionSound->FilePath;
|
||||
e.IsAmbient = false;
|
||||
EventBroker->Publish(e);
|
||||
//return true;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user