Files
libstorm-nvgt/volume_controls.nvgt
2026-02-16 19:49:29 -05:00

97 lines
2.8 KiB
Plaintext

#include "sound_pool.nvgt"
funcdef void volume_controls_apply_callback(float volumeDb);
float volumeControlsMaxDb = 0.0f;
float volumeControlsMinDb = -60.0f;
float volumeControlsStepDb = 3.0f;
float volumeControlsCurrentDb = 0.0f;
volume_controls_apply_callback@ volumeControlsApplyCallback = null;
void volume_controls_set_apply_callback(volume_controls_apply_callback@ callback) {
@volumeControlsApplyCallback = @callback;
}
void volume_controls_configure(float minDb = -60.0f, float maxDb = 0.0f, float stepDb = 3.0f, float initialDb = 0.0f) {
volumeControlsMinDb = minDb;
volumeControlsMaxDb = maxDb;
if (volumeControlsMaxDb < volumeControlsMinDb) {
float temp = volumeControlsMaxDb;
volumeControlsMaxDb = volumeControlsMinDb;
volumeControlsMinDb = temp;
}
if (stepDb <= 0.0f) {
stepDb = 1.0f;
}
volumeControlsStepDb = stepDb;
volume_controls_set_current_db(initialDb, false);
}
int volume_controls_percent_from_db(float volumeDb) {
float range = volumeControlsMaxDb - volumeControlsMinDb;
if (range <= 0.0f) return 100;
float normalized = (volumeDb - volumeControlsMinDb) / range;
int volumePercent = int(normalized * 100.0f + 0.5f);
if (volumePercent < 0) volumePercent = 0;
if (volumePercent > 100) volumePercent = 100;
return volumePercent;
}
void volume_controls_apply(float volumeDb) {
if (@volumeControlsApplyCallback !is null) {
volumeControlsApplyCallback(volumeDb);
return;
}
// Default engine-global apply behavior when no callback is provided.
sound_master_volume = volumeDb;
}
void volume_controls_set_current_db(float volumeDb, bool announce = true) {
float clamped = volumeDb;
if (clamped > volumeControlsMaxDb) clamped = volumeControlsMaxDb;
if (clamped < volumeControlsMinDb) clamped = volumeControlsMinDb;
if (clamped == volumeControlsCurrentDb) return;
volumeControlsCurrentDb = clamped;
volume_controls_apply(volumeControlsCurrentDb);
if (announce) {
int volumePercent = volume_controls_percent_from_db(volumeControlsCurrentDb);
screen_reader_speak("Volume " + volumePercent + ".", true);
}
}
void volume_controls_init_at_max(bool announce = false) {
volume_controls_set_current_db(volumeControlsMaxDb, announce);
}
float volume_controls_get_current_db() {
return volumeControlsCurrentDb;
}
void volume_controls_handle_keys(int downKey = KEY_PAGEDOWN, int upKey = KEY_PAGEUP, bool announce = true) {
if (key_pressed(downKey)) {
volume_controls_set_current_db(volumeControlsCurrentDb - volumeControlsStepDb, announce);
}
if (key_pressed(upKey)) {
volume_controls_set_current_db(volumeControlsCurrentDb + volumeControlsStepDb, announce);
}
}
void safe_destroy_sound_in_pool(sound_pool@ poolRef, int &inout handle) {
if (handle == -1) return;
if (@poolRef is null) {
handle = -1;
return;
}
if (poolRef.sound_is_active(handle)) {
poolRef.destroy_sound(handle);
}
handle = -1;
}