You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							91 lines
						
					
					
						
							2.5 KiB
						
					
					
				
			
		
		
	
	
							91 lines
						
					
					
						
							2.5 KiB
						
					
					
				#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();
 | 
						|
}
 | 
						|
 | 
						|
 |