136 lines
2.9 KiB
C++
136 lines
2.9 KiB
C++
#include "AudioSource.hpp"
|
|
#include "Vector3.hpp"
|
|
#include "elements/Transformable.hpp"
|
|
|
|
float TSE::AudioSource::GetMinDistance()
|
|
{
|
|
return minDistance;
|
|
}
|
|
|
|
float TSE::AudioSource::GetMaxDistance()
|
|
{
|
|
return maxDistance;
|
|
}
|
|
|
|
bool TSE::AudioSource::GetGlobal()
|
|
{
|
|
return global;
|
|
}
|
|
|
|
void TSE::AudioSource::SetGlobal(bool v)
|
|
{
|
|
if(global != v)
|
|
{
|
|
auto it = sounds.begin();
|
|
for (int j = 0; j < sounds.size(); j++)
|
|
{
|
|
it->second;
|
|
ma_sound_set_spatialization_enabled(it->second, !v);
|
|
it++;
|
|
}
|
|
}
|
|
global = v;
|
|
}
|
|
|
|
void TSE::AudioSource::SetMinDistance(float v)
|
|
{
|
|
minDistance = v;
|
|
auto it = sounds.begin();
|
|
for (int j = 0; j < sounds.size(); j++)
|
|
{
|
|
it->second;
|
|
ma_sound_set_min_distance(it->second, minDistance);
|
|
it++;
|
|
}
|
|
}
|
|
|
|
void TSE::AudioSource::SetMaxDistance(float v)
|
|
{
|
|
maxDistance = v;
|
|
auto it = sounds.begin();
|
|
for (int j = 0; j < sounds.size(); j++)
|
|
{
|
|
it->second;
|
|
ma_sound_set_max_distance(it->second, maxDistance);
|
|
it++;
|
|
}
|
|
}
|
|
|
|
void TSE::AudioSource::AddClip(AudioClip *clip)
|
|
{
|
|
clips[clip->name] = clip;
|
|
ma_sound* s = clip->GetAudioSound();
|
|
ma_sound_set_spatialization_enabled(s, !global);
|
|
ma_sound_set_attenuation_model(s, ma_attenuation_model_linear);
|
|
ma_sound_set_rolloff(s, 1.0f);
|
|
ma_sound_set_min_distance(s, minDistance);
|
|
ma_sound_set_max_distance(s, maxDistance);
|
|
ma_sound_set_min_gain(s, 0.0f);
|
|
ma_sound_set_max_gain(s, 1.0f);
|
|
sounds[clip->name] = s;
|
|
}
|
|
|
|
void TSE::AudioSource::RemoveClip(std::string name)
|
|
{
|
|
if(currentlyPlaying == name) StopPlaying();
|
|
clips[name]->DestroyAudioSound(sounds[name]);
|
|
clips.erase(name);
|
|
sounds.erase(name);
|
|
}
|
|
|
|
void TSE::AudioSource::StartClip(std::string name, bool forceRestart)
|
|
{
|
|
if(currentlyPlaying != name){
|
|
StopPlaying();
|
|
}
|
|
else if(forceRestart)
|
|
{
|
|
ma_sound_seek_to_pcm_frame(sounds[name], 0);
|
|
}
|
|
ma_sound_start(sounds[name]);
|
|
currentlyPlaying = name;
|
|
}
|
|
|
|
void TSE::AudioSource::StopPlaying()
|
|
{
|
|
if(currentlyPlaying == "") return;
|
|
ma_sound_stop(sounds[currentlyPlaying]);
|
|
ma_sound_seek_to_pcm_frame(sounds[currentlyPlaying], 0);
|
|
currentlyPlaying = "";
|
|
}
|
|
|
|
void TSE::AudioSource::PausePlaying()
|
|
{
|
|
if(currentlyPlaying == "") return;
|
|
ma_sound_stop(sounds[currentlyPlaying]);
|
|
}
|
|
|
|
TSE::AudioClip *TSE::AudioSource::GetClipAt(int i)
|
|
{
|
|
auto it = clips.begin();
|
|
for (int j = 0; j < i; j++)
|
|
{
|
|
it++;
|
|
}
|
|
return it->second;
|
|
}
|
|
|
|
TSE::AudioSource::~AudioSource()
|
|
{
|
|
int count = clips.size();
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
std::string name = GetClipAt(0)->name;
|
|
RemoveClip(name);
|
|
}
|
|
}
|
|
|
|
void TSE::AudioSource::OnUpdate()
|
|
{
|
|
if(!global)
|
|
{
|
|
Vector3 pos = baseObject->GetGlobalPosition();
|
|
ma_sound_set_position(sounds[currentlyPlaying], pos.x, pos.y, -pos.z);
|
|
}
|
|
}
|