shithub: m8c

Download patch

ref: 522c173084a23013912cf518c9fdafa18748632e
parent: 0d8e8d4045f94018ea4d5b22a937632cfc04967a
author: laamaa <jonne.kokkonen@gmail.com>
date: Fri Jun 28 11:45:41 EDT 2024

add possibility to toggle audio with a key

--- a/src/audio.c
+++ b/src/audio.c
@@ -8,11 +8,25 @@
 static SDL_AudioDeviceID devid_in = 0;
 static SDL_AudioDeviceID devid_out = 0;
 
+static unsigned int audio_paused = 0;
+static unsigned int audio_initialized = 0;
+
+void toggle_audio(unsigned int audio_buffer_size, const char *output_device_name) {
+  if (!audio_initialized) {
+    audio_init(audio_buffer_size, output_device_name);
+    return;
+  }
+  audio_paused = !audio_paused;
+  SDL_PauseAudioDevice(devid_in, audio_paused);
+  SDL_PauseAudioDevice(devid_out, audio_paused);
+  SDL_Log(audio_paused ? "Audio paused" : "Audio resumed");
+}
+
 void audio_cb_in(void *userdata, uint8_t *stream, int len) {
   SDL_QueueAudio(devid_out, stream, len);
 }
 
-int audio_init(int audio_buffer_size, const char *output_device_name) {
+int audio_init(unsigned int audio_buffer_size, const char *output_device_name) {
 
   int i = 0;
   int m8_device_id = -1;
@@ -75,14 +89,22 @@
   SDL_PauseAudioDevice(devid_in, 0);
   SDL_PauseAudioDevice(devid_out, 0);
 
+  audio_paused = 0;
+  audio_initialized = 1;
+
   return 1;
 }
 
 void audio_destroy() {
+  if (!audio_initialized)
+    return;
   SDL_Log("Closing audio devices");
   SDL_PauseAudioDevice(devid_in, 1);
   SDL_PauseAudioDevice(devid_out, 1);
   SDL_CloseAudioDevice(devid_in);
   SDL_CloseAudioDevice(devid_out);
+
+  audio_initialized = 0;
 }
+
 #endif
--- a/src/audio.h
+++ b/src/audio.h
@@ -3,7 +3,8 @@
 #ifndef AUDIO_H
 #define AUDIO_H
 
-int audio_init(int audio_buffer_size, const char *output_device_name);
+int audio_init(unsigned int audio_buffer_size, const char *output_device_name);
+void toggle_audio(unsigned int audio_buffer_size, const char *output_device_name);
 void audio_destroy();
 
 #endif
--- a/src/config.c
+++ b/src/config.c
@@ -51,6 +51,7 @@
   c.key_jazz_dec_octave = SDL_SCANCODE_KP_DIVIDE;
   c.key_jazz_inc_velocity = SDL_SCANCODE_KP_MINUS;
   c.key_jazz_dec_velocity = SDL_SCANCODE_KP_PLUS;
+  c.key_toggle_audio = SDL_SCANCODE_F12;
 
   c.gamepad_up = SDL_CONTROLLER_BUTTON_DPAD_UP;
   c.gamepad_left = SDL_CONTROLLER_BUTTON_DPAD_LEFT;
@@ -85,7 +86,7 @@
 
   SDL_Log("Writing config file to %s", config_path);
 
-  const unsigned int INI_LINE_COUNT = 48;
+  const unsigned int INI_LINE_COUNT = 50;
   const unsigned int LINELEN = 50;
 
   // Entries for the config file
@@ -107,6 +108,7 @@
   snprintf(ini_values[initPointer++], LINELEN, "audio_device_name=%s\n",
            conf->audio_device_name ? conf->audio_device_name : "Default");
   snprintf(ini_values[initPointer++], LINELEN, "[keyboard]\n");
+  snprintf(ini_values[initPointer++], LINELEN, ";Ref: https://wiki.libsdl.org/SDL2/SDL_Scancode\n");
   snprintf(ini_values[initPointer++], LINELEN, "key_up=%d\n", conf->key_up);
   snprintf(ini_values[initPointer++], LINELEN, "key_left=%d\n", conf->key_left);
   snprintf(ini_values[initPointer++], LINELEN, "key_down=%d\n", conf->key_down);
@@ -129,6 +131,8 @@
            conf->key_jazz_inc_velocity);
   snprintf(ini_values[initPointer++], LINELEN, "key_jazz_dec_velocity=%d\n",
            conf->key_jazz_dec_velocity);
+  snprintf(ini_values[initPointer++], LINELEN, "key_toggle_audio=%d\n",
+           conf->key_toggle_audio);
   snprintf(ini_values[initPointer++], LINELEN, "[gamepad]\n");
   snprintf(ini_values[initPointer++], LINELEN, "gamepad_up=%d\n", conf->gamepad_up);
   snprintf(ini_values[initPointer++], LINELEN, "gamepad_left=%d\n", conf->gamepad_left);
@@ -277,6 +281,7 @@
   const char *key_jazz_dec_octave = ini_get(ini, "keyboard", "key_jazz_dec_octave");
   const char *key_jazz_inc_velocity = ini_get(ini, "keyboard", "key_jazz_inc_velocity");
   const char *key_jazz_dec_velocity = ini_get(ini, "keyboard", "key_jazz_dec_velocity");
+  const char *key_toggle_audio = ini_get(ini, "keyboard", "key_toggle_audio");
 
   if (key_up)
     conf->key_up = SDL_atoi(key_up);
@@ -314,6 +319,8 @@
     conf->key_jazz_inc_velocity = SDL_atoi(key_jazz_inc_velocity);
   if (key_jazz_dec_velocity)
     conf->key_jazz_dec_velocity = SDL_atoi(key_jazz_dec_velocity);
+  if (key_toggle_audio)
+    conf->key_jazz_dec_velocity = SDL_atoi(key_toggle_audio);
 }
 
 void read_gamepad_config(ini_t *ini, config_params_s *conf) {
--- a/src/config.h
+++ b/src/config.h
@@ -35,6 +35,7 @@
   int key_jazz_dec_octave;
   int key_jazz_inc_velocity;
   int key_jazz_dec_velocity;
+  int key_toggle_audio;
 
   int gamepad_up;
   int gamepad_left;
--- a/src/input.c
+++ b/src/input.c
@@ -33,7 +33,7 @@
 static uint8_t keycode = 0; // value of the pressed key
 static int num_joysticks = 0;
 
-input_msg_s key = {normal, 0};
+static input_msg_s key = {normal, 0};
 
 uint8_t toggle_input_keyjazz() {
   keyjazz_enabled = !keyjazz_enabled;
@@ -252,6 +252,9 @@
     key.value = key_opt | key_edit;
   } else if (event->key.keysym.scancode == conf->key_reset) {
     key = (input_msg_s){special, msg_reset_display};
+  } else if (event->key.keysym.scancode == conf->key_toggle_audio) {
+    key = (input_msg_s){special, msg_toggle_audio};
+
   } else {
     key.value = 0;
   }
@@ -382,6 +385,10 @@
   // Keyboard events. Special events are handled within SDL_KEYDOWN.
   case SDL_KEYDOWN:
 
+    if (event.key.repeat > 0) {
+      break;
+    }
+
     // ALT+ENTER toggles fullscreen
     if (event.key.keysym.sym == SDLK_RETURN && (event.key.keysym.mod & KMOD_ALT) > 0) {
       toggle_fullscreen();
@@ -389,13 +396,13 @@
     }
 
     // ALT+F4 quits program
-    if (event.key.keysym.sym == SDLK_F4 && (event.key.keysym.mod & KMOD_ALT) > 0) {
+    else if (event.key.keysym.sym == SDLK_F4 && (event.key.keysym.mod & KMOD_ALT) > 0) {
       key = (input_msg_s){special, msg_quit};
       break;
     }
 
     // ESC = toggle keyjazz
-    if (event.key.keysym.sym == SDLK_ESCAPE) {
+    else if (event.key.keysym.sym == SDLK_ESCAPE) {
       display_keyjazz_overlay(toggle_input_keyjazz(), keyjazz_base_octave, keyjazz_velocity);
     }
 
@@ -425,6 +432,7 @@
     if (event.type == SDL_KEYDOWN) {
       keycode = key.value;
     } else {
+      key.value = 0;
       keycode = 0;
     }
     break;
--- a/src/input.h
+++ b/src/input.h
@@ -21,7 +21,11 @@
 
 typedef enum input_type_t { normal, keyjazz, special } input_type_t;
 
-typedef enum special_messages_t { msg_quit = 1, msg_reset_display = 2 } special_messages_t;
+typedef enum special_messages_t {
+  msg_quit = 1,
+  msg_reset_display = 2,
+  msg_toggle_audio = 3
+} special_messages_t;
 
 typedef struct input_msg_s {
   input_type_t type;
--- a/src/main.c
+++ b/src/main.c
@@ -216,6 +216,9 @@
           case msg_reset_display:
             reset_display();
             break;
+          case msg_toggle_audio:
+            toggle_audio(conf.audio_buffer_size, conf.audio_device_name);
+            break;
           default:
             break;
           }
--- a/src/usb_audio.c
+++ b/src/usb_audio.c
@@ -193,4 +193,8 @@
   return 1;
 }
 
+void toggle_audio(unsigned int audio_buffer_size, const char *output_device_name) {
+  SDL_Log("Libusb audio toggling not implemented yet");
+}
+
 #endif
--