Skip to content

Commit 71e91da

Browse files
authored
Merge pull request #156 from laamaa/toggle_audio
add possibility to toggle audio with a key
2 parents 0d8e8d4 + 522c173 commit 71e91da

File tree

8 files changed

+57
-7
lines changed

8 files changed

+57
-7
lines changed

src/audio.c

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,25 @@
88
static SDL_AudioDeviceID devid_in = 0;
99
static SDL_AudioDeviceID devid_out = 0;
1010

11+
static unsigned int audio_paused = 0;
12+
static unsigned int audio_initialized = 0;
13+
14+
void toggle_audio(unsigned int audio_buffer_size, const char *output_device_name) {
15+
if (!audio_initialized) {
16+
audio_init(audio_buffer_size, output_device_name);
17+
return;
18+
}
19+
audio_paused = !audio_paused;
20+
SDL_PauseAudioDevice(devid_in, audio_paused);
21+
SDL_PauseAudioDevice(devid_out, audio_paused);
22+
SDL_Log(audio_paused ? "Audio paused" : "Audio resumed");
23+
}
24+
1125
void audio_cb_in(void *userdata, uint8_t *stream, int len) {
1226
SDL_QueueAudio(devid_out, stream, len);
1327
}
1428

15-
int audio_init(int audio_buffer_size, const char *output_device_name) {
29+
int audio_init(unsigned int audio_buffer_size, const char *output_device_name) {
1630

1731
int i = 0;
1832
int m8_device_id = -1;
@@ -75,14 +89,22 @@ int audio_init(int audio_buffer_size, const char *output_device_name) {
7589
SDL_PauseAudioDevice(devid_in, 0);
7690
SDL_PauseAudioDevice(devid_out, 0);
7791

92+
audio_paused = 0;
93+
audio_initialized = 1;
94+
7895
return 1;
7996
}
8097

8198
void audio_destroy() {
99+
if (!audio_initialized)
100+
return;
82101
SDL_Log("Closing audio devices");
83102
SDL_PauseAudioDevice(devid_in, 1);
84103
SDL_PauseAudioDevice(devid_out, 1);
85104
SDL_CloseAudioDevice(devid_in);
86105
SDL_CloseAudioDevice(devid_out);
106+
107+
audio_initialized = 0;
87108
}
109+
88110
#endif

src/audio.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
#ifndef AUDIO_H
44
#define AUDIO_H
55

6-
int audio_init(int audio_buffer_size, const char *output_device_name);
6+
int audio_init(unsigned int audio_buffer_size, const char *output_device_name);
7+
void toggle_audio(unsigned int audio_buffer_size, const char *output_device_name);
78
void audio_destroy();
89

910
#endif

src/config.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ config_params_s init_config() {
5151
c.key_jazz_dec_octave = SDL_SCANCODE_KP_DIVIDE;
5252
c.key_jazz_inc_velocity = SDL_SCANCODE_KP_MINUS;
5353
c.key_jazz_dec_velocity = SDL_SCANCODE_KP_PLUS;
54+
c.key_toggle_audio = SDL_SCANCODE_F12;
5455

5556
c.gamepad_up = SDL_CONTROLLER_BUTTON_DPAD_UP;
5657
c.gamepad_left = SDL_CONTROLLER_BUTTON_DPAD_LEFT;
@@ -85,7 +86,7 @@ void write_config(config_params_s *conf) {
8586

8687
SDL_Log("Writing config file to %s", config_path);
8788

88-
const unsigned int INI_LINE_COUNT = 48;
89+
const unsigned int INI_LINE_COUNT = 50;
8990
const unsigned int LINELEN = 50;
9091

9192
// Entries for the config file
@@ -107,6 +108,7 @@ void write_config(config_params_s *conf) {
107108
snprintf(ini_values[initPointer++], LINELEN, "audio_device_name=%s\n",
108109
conf->audio_device_name ? conf->audio_device_name : "Default");
109110
snprintf(ini_values[initPointer++], LINELEN, "[keyboard]\n");
111+
snprintf(ini_values[initPointer++], LINELEN, ";Ref: https://wiki.libsdl.org/SDL2/SDL_Scancode\n");
110112
snprintf(ini_values[initPointer++], LINELEN, "key_up=%d\n", conf->key_up);
111113
snprintf(ini_values[initPointer++], LINELEN, "key_left=%d\n", conf->key_left);
112114
snprintf(ini_values[initPointer++], LINELEN, "key_down=%d\n", conf->key_down);
@@ -129,6 +131,8 @@ void write_config(config_params_s *conf) {
129131
conf->key_jazz_inc_velocity);
130132
snprintf(ini_values[initPointer++], LINELEN, "key_jazz_dec_velocity=%d\n",
131133
conf->key_jazz_dec_velocity);
134+
snprintf(ini_values[initPointer++], LINELEN, "key_toggle_audio=%d\n",
135+
conf->key_toggle_audio);
132136
snprintf(ini_values[initPointer++], LINELEN, "[gamepad]\n");
133137
snprintf(ini_values[initPointer++], LINELEN, "gamepad_up=%d\n", conf->gamepad_up);
134138
snprintf(ini_values[initPointer++], LINELEN, "gamepad_left=%d\n", conf->gamepad_left);
@@ -277,6 +281,7 @@ void read_key_config(ini_t *ini, config_params_s *conf) {
277281
const char *key_jazz_dec_octave = ini_get(ini, "keyboard", "key_jazz_dec_octave");
278282
const char *key_jazz_inc_velocity = ini_get(ini, "keyboard", "key_jazz_inc_velocity");
279283
const char *key_jazz_dec_velocity = ini_get(ini, "keyboard", "key_jazz_dec_velocity");
284+
const char *key_toggle_audio = ini_get(ini, "keyboard", "key_toggle_audio");
280285

281286
if (key_up)
282287
conf->key_up = SDL_atoi(key_up);
@@ -314,6 +319,8 @@ void read_key_config(ini_t *ini, config_params_s *conf) {
314319
conf->key_jazz_inc_velocity = SDL_atoi(key_jazz_inc_velocity);
315320
if (key_jazz_dec_velocity)
316321
conf->key_jazz_dec_velocity = SDL_atoi(key_jazz_dec_velocity);
322+
if (key_toggle_audio)
323+
conf->key_jazz_dec_velocity = SDL_atoi(key_toggle_audio);
317324
}
318325

319326
void read_gamepad_config(ini_t *ini, config_params_s *conf) {

src/config.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ typedef struct config_params_s {
3535
int key_jazz_dec_octave;
3636
int key_jazz_inc_velocity;
3737
int key_jazz_dec_velocity;
38+
int key_toggle_audio;
3839

3940
int gamepad_up;
4041
int gamepad_left;

src/input.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ uint8_t keyjazz_velocity = 0x64;
3333
static uint8_t keycode = 0; // value of the pressed key
3434
static int num_joysticks = 0;
3535

36-
input_msg_s key = {normal, 0};
36+
static input_msg_s key = {normal, 0};
3737

3838
uint8_t toggle_input_keyjazz() {
3939
keyjazz_enabled = !keyjazz_enabled;
@@ -252,6 +252,9 @@ static input_msg_s handle_normal_keys(SDL_Event *event, config_params_s *conf, u
252252
key.value = key_opt | key_edit;
253253
} else if (event->key.keysym.scancode == conf->key_reset) {
254254
key = (input_msg_s){special, msg_reset_display};
255+
} else if (event->key.keysym.scancode == conf->key_toggle_audio) {
256+
key = (input_msg_s){special, msg_toggle_audio};
257+
255258
} else {
256259
key.value = 0;
257260
}
@@ -382,20 +385,24 @@ void handle_sdl_events(config_params_s *conf) {
382385
// Keyboard events. Special events are handled within SDL_KEYDOWN.
383386
case SDL_KEYDOWN:
384387

388+
if (event.key.repeat > 0) {
389+
break;
390+
}
391+
385392
// ALT+ENTER toggles fullscreen
386393
if (event.key.keysym.sym == SDLK_RETURN && (event.key.keysym.mod & KMOD_ALT) > 0) {
387394
toggle_fullscreen();
388395
break;
389396
}
390397

391398
// ALT+F4 quits program
392-
if (event.key.keysym.sym == SDLK_F4 && (event.key.keysym.mod & KMOD_ALT) > 0) {
399+
else if (event.key.keysym.sym == SDLK_F4 && (event.key.keysym.mod & KMOD_ALT) > 0) {
393400
key = (input_msg_s){special, msg_quit};
394401
break;
395402
}
396403

397404
// ESC = toggle keyjazz
398-
if (event.key.keysym.sym == SDLK_ESCAPE) {
405+
else if (event.key.keysym.sym == SDLK_ESCAPE) {
399406
display_keyjazz_overlay(toggle_input_keyjazz(), keyjazz_base_octave, keyjazz_velocity);
400407
}
401408

@@ -425,6 +432,7 @@ void handle_sdl_events(config_params_s *conf) {
425432
if (event.type == SDL_KEYDOWN) {
426433
keycode = key.value;
427434
} else {
435+
key.value = 0;
428436
keycode = 0;
429437
}
430438
break;

src/input.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,11 @@ typedef enum input_buttons_t {
2121

2222
typedef enum input_type_t { normal, keyjazz, special } input_type_t;
2323

24-
typedef enum special_messages_t { msg_quit = 1, msg_reset_display = 2 } special_messages_t;
24+
typedef enum special_messages_t {
25+
msg_quit = 1,
26+
msg_reset_display = 2,
27+
msg_toggle_audio = 3
28+
} special_messages_t;
2529

2630
typedef struct input_msg_s {
2731
input_type_t type;

src/main.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,9 @@ int main(int argc, char *argv[]) {
216216
case msg_reset_display:
217217
reset_display();
218218
break;
219+
case msg_toggle_audio:
220+
toggle_audio(conf.audio_buffer_size, conf.audio_device_name);
221+
break;
219222
default:
220223
break;
221224
}

src/usb_audio.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,4 +193,8 @@ int audio_destroy() {
193193
return 1;
194194
}
195195

196+
void toggle_audio(unsigned int audio_buffer_size, const char *output_device_name) {
197+
SDL_Log("Libusb audio toggling not implemented yet");
198+
}
199+
196200
#endif

0 commit comments

Comments
 (0)