#include #include "sound.hpp" #include "common/swaglog.h" typedef struct { AudibleAlert alert; const char* uri; bool loop; } sound_file; extern "C"{ #include "slplay.h" } int last_volume = 0; void set_volume(int volume) { if (last_volume != volume) { char volume_change_cmd[64]; sprintf(volume_change_cmd, "service call audio 3 i32 3 i32 %d i32 1 &", volume); // 5 second timeout at 60fps int volume_changed = system(volume_change_cmd); last_volume = volume; } } sound_file sound_table[] = { { cereal::CarControl::HUDControl::AudibleAlert::CHIME_DISENGAGE, "../assets/sounds/disengaged.wav", false }, { cereal::CarControl::HUDControl::AudibleAlert::CHIME_ENGAGE, "../assets/sounds/engaged.wav", false }, { cereal::CarControl::HUDControl::AudibleAlert::CHIME_WARNING1, "../assets/sounds/warning_1.wav", false }, { cereal::CarControl::HUDControl::AudibleAlert::CHIME_WARNING2, "../assets/sounds/warning_2.wav", false }, { cereal::CarControl::HUDControl::AudibleAlert::CHIME_WARNING2_REPEAT, "../assets/sounds/warning_2.wav", true }, { cereal::CarControl::HUDControl::AudibleAlert::CHIME_WARNING_REPEAT, "../assets/sounds/warning_repeat.wav", true }, { cereal::CarControl::HUDControl::AudibleAlert::CHIME_ERROR, "../assets/sounds/error.wav", false }, { cereal::CarControl::HUDControl::AudibleAlert::CHIME_PROMPT, "../assets/sounds/error.wav", false }, { cereal::CarControl::HUDControl::AudibleAlert::NONE, NULL, false }, }; sound_file* get_sound_file(AudibleAlert alert) { for (sound_file *s = sound_table; s->alert != cereal::CarControl::HUDControl::AudibleAlert::NONE; s++) { if (s->alert == alert) { return s; } } return NULL; } void play_alert_sound(AudibleAlert alert) { sound_file* sound = get_sound_file(alert); char* error = NULL; slplay_play(sound->uri, sound->loop, &error); if(error) { LOGW("error playing sound: %s", error); } } void stop_alert_sound(AudibleAlert alert) { sound_file* sound = get_sound_file(alert); char* error = NULL; slplay_stop_uri(sound->uri, &error); if(error) { LOGW("error stopping sound: %s", error); } } void ui_sound_init() { char *error = NULL; slplay_setup(&error); if (error) goto fail; for (sound_file *s = sound_table; s->alert != cereal::CarControl::HUDControl::AudibleAlert::NONE; s++) { slplay_create_player_for_uri(s->uri, &error); if (error) goto fail; } return; fail: LOGW(error); exit(1); } void ui_sound_destroy() { slplay_destroy(); }