mirror of https://github.com/commaai/openpilot.git
92 lines
2.5 KiB
C++
92 lines
2.5 KiB
C++
#include <stdlib.h>
|
|
#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();
|
|
}
|
|
|