97 lines
2.8 KiB
Plaintext
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;
|
|
}
|