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.
		
		
		
		
			
				
					86 lines
				
				2.2 KiB
			
		
		
			
		
	
	
					86 lines
				
				2.2 KiB
			| 
								 
											6 years ago
										 
									 | 
							
								#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"
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void set_volume(int 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);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sound_file sound_table[] = {
							 | 
						||
| 
								 | 
							
								  { cereal_CarControl_HUDControl_AudibleAlert_chimeDisengage, "../assets/sounds/disengaged.wav", false },
							 | 
						||
| 
								 | 
							
								  { cereal_CarControl_HUDControl_AudibleAlert_chimeEngage, "../assets/sounds/engaged.wav", false },
							 | 
						||
| 
								 | 
							
								  { cereal_CarControl_HUDControl_AudibleAlert_chimeWarning1, "../assets/sounds/warning_1.wav", false },
							 | 
						||
| 
								 | 
							
								  { cereal_CarControl_HUDControl_AudibleAlert_chimeWarning2, "../assets/sounds/warning_2.wav", false },
							 | 
						||
| 
								 | 
							
								  { cereal_CarControl_HUDControl_AudibleAlert_chimeWarningRepeat, "../assets/sounds/warning_repeat.wav", true },
							 | 
						||
| 
								 | 
							
								  { cereal_CarControl_HUDControl_AudibleAlert_chimeError, "../assets/sounds/error.wav", false },
							 | 
						||
| 
								 | 
							
								  { cereal_CarControl_HUDControl_AudibleAlert_chimePrompt, "../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();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 |