Files
armorpaint/base/sources/ts/speaker_object.ts
T
luboslenco 3faf6b3d73 Cleanup
2025-09-01 21:31:59 +02:00

125 lines
2.9 KiB
TypeScript

///if arm_audio
type speaker_object_t = {
base?: object_t;
data?: speaker_data_t;
paused?: bool;
sound?: sound_t;
channels?: audio_channel_t[];
volume?: f32;
};
function speaker_object_create(data: speaker_data_t): speaker_object_t {
let raw: speaker_object_t = {};
raw.paused = false;
raw.channels = [];
raw.base = object_create(false);
raw.base.ext = raw;
raw.base.ext_type = "speaker_object_t";
raw.data = data;
array_push(scene_speakers, raw);
if (data.sound == "") {
return raw;
}
raw.sound = data_get_sound(data.sound);
sys_notify_on_next_frame(_speaker_object_create_on_init, raw);
return raw;
}
function _speaker_object_create_on_init(raw: speaker_object_t) {
if (raw.base.visible && raw.data.play_on_start) {
speaker_object_play(raw);
}
}
function speaker_object_play(raw: speaker_object_t) {
if (raw.sound == null || raw.data.muted) {
return;
}
if (raw.paused) {
for (let i: i32 = 0; i < raw.channels.length; ++i) {
let c: audio_channel_t = raw.channels[i];
// audio_play(c);
}
raw.paused = false;
return;
}
let channel: audio_channel_t = null; // audio_channel(raw.sound, raw.data.loop, raw.data.stream);
if (channel != null) {
array_push(raw.channels, channel);
if (raw.data.attenuation > 0 && raw.channels.length == 1) {
sys_notify_on_update(speaker_object_update, raw);
}
}
}
function speaker_object_pause(raw: speaker_object_t) {
for (let i: i32 = 0; i < raw.channels.length; ++i) {
let c: audio_channel_t = raw.channels[i];
// audio_pause(c);
}
raw.paused = true;
}
function speaker_object_stop(raw: speaker_object_t) {
for (let i: i32 = 0; i < raw.channels.length; ++i) {
let c: audio_channel_t = raw.channels[i];
// audio_stop(c);
}
array_splice(raw.channels, 0, raw.channels.length);
}
function speaker_object_update(raw: speaker_object_t) {
if (raw.paused) {
return;
}
for (let i: i32 = 0; i < raw.channels.length; ++i) {
let c: audio_channel_t = raw.channels[i];
// if (c.finished) {
// array_remove(raw.channels, c);
// }
}
if (raw.channels.length == 0) {
sys_remove_update(speaker_object_update);
return;
}
if (raw.data.attenuation > 0) {
let distance: f32 = vec4_dist(mat4_get_loc(scene_camera.base.transform.world), mat4_get_loc(raw.base.transform.world));
raw.volume = 1.0 / (1.0 + raw.data.attenuation * (distance - 1.0));
raw.volume *= raw.data.volume;
}
else {
raw.volume = raw.data.volume;
}
for (let i: i32 = 0; i < raw.channels.length; ++i) {
let c: audio_channel_t = raw.channels[i];
// c.volume = raw.volume;
}
}
function speaker_object_remove(raw: speaker_object_t) {
speaker_object_stop(raw);
array_remove(scene_speakers, raw);
object_remove_super(raw.base);
}
function speaker_data_get_raw_by_name(datas: speaker_data_t[], name: string): speaker_data_t {
if (name == "") {
return datas[0];
}
for (let i: i32 = 0; i < datas.length; ++i) {
if (datas[i].name == name) {
return datas[i];
}
}
return null;
}
///end