KRAudioSource now using KRNodeProperty

This commit is contained in:
2025-11-24 18:36:32 -08:00
parent 14ee6f0419
commit eb4b2fcbfa
2 changed files with 49 additions and 107 deletions

View File

@@ -42,15 +42,15 @@ using namespace hydra;
void KRAudioSource::InitNodeInfo(KrNodeInfo* nodeInfo)
{
KRNode::InitNodeInfo(nodeInfo);
nodeInfo->audio_source.enable_obstruction = true;
nodeInfo->audio_source.enable_occlusion = true;
nodeInfo->audio_source.gain = 1.0f;
nodeInfo->audio_source.enable_obstruction = decltype(m_enable_obstruction)::defaultVal;
nodeInfo->audio_source.enable_occlusion = decltype(m_enable_occlusion)::defaultVal;
nodeInfo->audio_source.gain = decltype(m_gain)::defaultVal;
nodeInfo->audio_source.is_3d = true;
nodeInfo->audio_source.looping = false;
nodeInfo->audio_source.pitch = 1.0f;
nodeInfo->audio_source.reference_distance = 1.0f;
nodeInfo->audio_source.reverb = 0.0f;
nodeInfo->audio_source.rolloff_factor = 2.0f;
nodeInfo->audio_source.looping = decltype(m_looping)::defaultVal;
nodeInfo->audio_source.pitch = decltype(m_pitch)::defaultVal;
nodeInfo->audio_source.reference_distance = decltype(m_referenceDistance)::defaultVal;
nodeInfo->audio_source.reverb = decltype(m_reverb)::defaultVal;
nodeInfo->audio_source.rolloff_factor = decltype(m_rolloffFactor)::defaultVal;
nodeInfo->audio_source.sample = -1;
}
@@ -58,17 +58,7 @@ KRAudioSource::KRAudioSource(KRScene& scene, std::string name) : KRNode(scene, n
{
m_currentBufferFrame = 0;
m_playing = false;
m_is3d = true;
m_isPrimed = false;
m_gain = 1.0f;
m_pitch = 1.0f;
m_looping = false;
m_referenceDistance = 1.0f;
m_reverb = 0.0f;
m_rolloffFactor = 2.0f;
m_enable_occlusion = true;
m_enable_obstruction = true;
m_start_audio_frame = -1;
m_paused_audio_frame = 0;
@@ -90,79 +80,31 @@ std::string KRAudioSource::getElementName()
tinyxml2::XMLElement* KRAudioSource::saveXML(tinyxml2::XMLNode* parent)
{
tinyxml2::XMLElement* e = KRNode::saveXML(parent);
e->SetAttribute("sample", m_sample.getName().c_str());
e->SetAttribute("gain", m_gain);
e->SetAttribute("pitch", m_pitch);
e->SetAttribute("looping", m_looping ? "true" : "false");
e->SetAttribute("is3d", m_is3d ? "true" : "false");
e->SetAttribute("reference_distance", m_referenceDistance);
e->SetAttribute("reverb", m_reverb);
e->SetAttribute("rolloff_factor", m_rolloffFactor);
e->SetAttribute("enable_occlusion", m_enable_occlusion ? "true" : "false");
e->SetAttribute("enable_obstruction", m_enable_obstruction ? "true" : "false");
m_sample.save(e);
m_gain.save(e);
m_pitch.save(e);
m_looping.save(e);
m_is3d.save(e);
m_referenceDistance.save(e);
m_reverb.save(e);
m_rolloffFactor.save(e);
m_enable_occlusion.save(e);
m_enable_obstruction.save(e);
return e;
}
void KRAudioSource::loadXML(tinyxml2::XMLElement* e)
{
const char* szAudioSampleName = e->Attribute("sample");
if (szAudioSampleName == nullptr) {
m_sample.clear();
} else {
m_sample.set(szAudioSampleName);
}
float gain = 1.0f;
if (e->QueryFloatAttribute("gain", &gain) != tinyxml2::XML_SUCCESS) {
gain = 1.0f;
}
setGain(gain);
float pitch = 1.0f;
if (e->QueryFloatAttribute("pitch", &pitch) != tinyxml2::XML_SUCCESS) {
pitch = 1.0f;
}
setPitch(m_pitch);
bool looping = false;
if (e->QueryBoolAttribute("looping", &looping) != tinyxml2::XML_SUCCESS) {
looping = false;
}
setLooping(looping);
bool is3d = true;
if (e->QueryBoolAttribute("is3d", &is3d) != tinyxml2::XML_SUCCESS) {
is3d = true;
}
setIs3D(is3d);
float reference_distance = 1.0f;
if (e->QueryFloatAttribute("reference_distance", &reference_distance) != tinyxml2::XML_SUCCESS) {
reference_distance = 1.0f;
}
setReferenceDistance(reference_distance);
float reverb = 0.0f;
if (e->QueryFloatAttribute("reverb", &reverb) != tinyxml2::XML_SUCCESS) {
reverb = 0.0f;
}
setReverb(reverb);
float rolloff_factor = 2.0f;
if (e->QueryFloatAttribute("rolloff_factor", &rolloff_factor) != tinyxml2::XML_SUCCESS) {
rolloff_factor = 2.0f;
}
setRolloffFactor(rolloff_factor);
m_enable_obstruction = true;
if (e->QueryBoolAttribute("enable_obstruction", &m_enable_obstruction) != tinyxml2::XML_SUCCESS) {
m_enable_obstruction = true;
}
m_enable_occlusion = true;
if (e->QueryBoolAttribute("enable_occlusion", &m_enable_occlusion) != tinyxml2::XML_SUCCESS) {
m_enable_occlusion = true;
}
m_sample.load(e);
m_gain.load(e);
m_pitch.load(e);
m_looping.load(e);
m_is3d.load(e);
m_referenceDistance.load(e);
m_reverb.load(e);
m_rolloffFactor.load(e);
m_enable_obstruction.load(e);
m_enable_occlusion.load(e);
KRNode::loadXML(e);
}
@@ -170,8 +112,8 @@ void KRAudioSource::loadXML(tinyxml2::XMLElement* e)
void KRAudioSource::prime()
{
if (!m_isPrimed) {
m_sample.bind(&getContext());
if (m_sample.isBound()) {
m_sample.val.bind(&getContext());
if (m_sample.val.isBound()) {
// Prime the buffer queue
m_nextBufferIndex = 0;
for (int i = 0; i < KRENGINE_AUDIO_BUFFERS_PER_SOURCE; i++) {
@@ -185,9 +127,9 @@ void KRAudioSource::prime()
void KRAudioSource::queueBuffer()
{
KRAudioBuffer* buffer = m_sample.get()->getBuffer(m_nextBufferIndex);
KRAudioBuffer* buffer = m_sample.val.get()->getBuffer(m_nextBufferIndex);
m_audioBuffers.push(buffer);
m_nextBufferIndex = (m_nextBufferIndex + 1) % m_sample.get()->getBufferCount();
m_nextBufferIndex = (m_nextBufferIndex + 1) % m_sample.val.get()->getBufferCount();
}
void KRAudioSource::render(RenderInfo& ri)
@@ -364,18 +306,18 @@ bool KRAudioSource::isPlaying()
void KRAudioSource::setSample(const std::string& sound_name)
{
m_sample.set(sound_name);
m_sample.val.set(sound_name);
}
std::string KRAudioSource::getSample()
{
return m_sample.getName();
return m_sample.val.getName();
}
KRAudioSample* KRAudioSource::getAudioSample()
{
m_sample.bind(&getContext());
return m_sample.get();
m_sample.val.bind(&getContext());
return m_sample.val.get();
}
void KRAudioSource::advanceFrames(int frame_count)

View File

@@ -133,24 +133,24 @@ private:
int m_currentBufferFrame; // Siren Audio Engine frame number within current buffer
void advanceBuffer();
KRAudioSampleBinding m_sample;
unsigned int m_sourceID;
float m_gain;
float m_pitch;
bool m_looping;
KRNODE_PROPERTY(KRAudioSampleBinding, m_sample, nullptr, "sample");
KRNODE_PROPERTY(float, m_gain, 1.f, "gain");
KRNODE_PROPERTY(float, m_pitch, 1.f, "pitch");
KRNODE_PROPERTY(bool, m_looping, false, "looping");
KRNODE_PROPERTY(bool, m_is3d, true, "is3d");
// 3d only properties:
KRNODE_PROPERTY(float, m_referenceDistance, 1.f, "reference_distance");
KRNODE_PROPERTY(float, m_reverb, 0.f, "reverb"); // 0.0 (dry) - 1.0 (wet) (0-100% dry/wet mix, 0.0 default)
KRNODE_PROPERTY(float, m_rolloffFactor, 2.f, "rolloff_factor");
KRNODE_PROPERTY(bool, m_enable_occlusion, true, "enable_occlusion");
KRNODE_PROPERTY(bool, m_enable_obstruction, true, "enable_obstruction");
std::queue<KRAudioBuffer*> m_audioBuffers;
int m_nextBufferIndex;
bool m_playing;
bool m_is3d;
bool m_isPrimed;
void prime();
void queueBuffer();
// 3d only properties:
float m_referenceDistance;
float m_reverb; // type ALfloat 0.0 (dry) - 1.0 (wet) (0-100% dry/wet mix, 0.0 default)
float m_rolloffFactor;
bool m_enable_occlusion;
bool m_enable_obstruction;
};