process_clicky.c (3657B)
1 #include "process_clicky.h" 2 #include "audio.h" 3 #include "eeconfig.h" 4 #include <stdlib.h> 5 6 #ifdef AUDIO_CLICKY 7 8 # ifndef AUDIO_CLICKY_DELAY_DURATION 9 # define AUDIO_CLICKY_DELAY_DURATION 1 10 # endif // !AUDIO_CLICKY_DELAY_DURATION 11 # ifndef AUDIO_CLICKY_FREQ_DEFAULT 12 # define AUDIO_CLICKY_FREQ_DEFAULT 440.0f 13 # endif // !AUDIO_CLICKY_FREQ_DEFAULT 14 # ifndef AUDIO_CLICKY_FREQ_MIN 15 # define AUDIO_CLICKY_FREQ_MIN 65.0f 16 # endif // !AUDIO_CLICKY_FREQ_MIN 17 # ifndef AUDIO_CLICKY_FREQ_MAX 18 # define AUDIO_CLICKY_FREQ_MAX 1500.0f 19 # endif // !AUDIO_CLICKY_FREQ_MAX 20 # ifndef AUDIO_CLICKY_FREQ_FACTOR 21 # define AUDIO_CLICKY_FREQ_FACTOR 1.18921f 22 # endif // !AUDIO_CLICKY_FREQ_FACTOR 23 # ifndef AUDIO_CLICKY_FREQ_RANDOMNESS 24 # define AUDIO_CLICKY_FREQ_RANDOMNESS 0.05f 25 # endif // !AUDIO_CLICKY_FREQ_RANDOMNESS 26 27 float clicky_freq = AUDIO_CLICKY_FREQ_DEFAULT; 28 float clicky_rand = AUDIO_CLICKY_FREQ_RANDOMNESS; 29 30 // the first "note" is an intentional delay; the 2nd and 3rd notes are the "clicky" 31 float clicky_song[][2] = {{0.0f, AUDIO_CLICKY_DELAY_DURATION}, {AUDIO_CLICKY_FREQ_DEFAULT, 3}, {AUDIO_CLICKY_FREQ_DEFAULT, 1}}; // 3 and 1 --> durations 32 33 extern audio_config_t audio_config; 34 35 # ifndef NO_MUSIC_MODE 36 extern bool music_activated; 37 extern bool midi_activated; 38 # endif // !NO_MUSIC_MODE 39 40 void clicky_play(void) { 41 # ifndef NO_MUSIC_MODE 42 if (music_activated || midi_activated || !audio_config.enable) return; 43 # endif // !NO_MUSIC_MODE 44 clicky_song[1][0] = 2.0f * clicky_freq * (1.0f + clicky_rand * (((float)rand()) / ((float)(RAND_MAX)))); 45 clicky_song[2][0] = clicky_freq * (1.0f + clicky_rand * (((float)rand()) / ((float)(RAND_MAX)))); 46 PLAY_SONG(clicky_song); 47 } 48 49 void clicky_freq_up(void) { 50 float new_freq = clicky_freq * AUDIO_CLICKY_FREQ_FACTOR; 51 if (new_freq < AUDIO_CLICKY_FREQ_MAX) { 52 clicky_freq = new_freq; 53 } 54 } 55 56 void clicky_freq_down(void) { 57 float new_freq = clicky_freq / AUDIO_CLICKY_FREQ_FACTOR; 58 if (new_freq > AUDIO_CLICKY_FREQ_MIN) { 59 clicky_freq = new_freq; 60 } 61 } 62 63 void clicky_freq_reset(void) { 64 clicky_freq = AUDIO_CLICKY_FREQ_DEFAULT; 65 } 66 67 void clicky_toggle(void) { 68 audio_config.clicky_enable ^= 1; 69 eeconfig_update_audio(&audio_config); 70 } 71 72 void clicky_on(void) { 73 audio_config.clicky_enable = 1; 74 eeconfig_update_audio(&audio_config); 75 } 76 77 void clicky_off(void) { 78 audio_config.clicky_enable = 0; 79 eeconfig_update_audio(&audio_config); 80 } 81 82 bool is_clicky_on(void) { 83 return (audio_config.clicky_enable != 0); 84 } 85 86 bool process_clicky(uint16_t keycode, keyrecord_t *record) { 87 if (keycode == QK_AUDIO_CLICKY_TOGGLE && record->event.pressed) { 88 clicky_toggle(); 89 } 90 91 if (keycode == QK_AUDIO_CLICKY_ON && record->event.pressed) { 92 clicky_on(); 93 } 94 if (keycode == QK_AUDIO_CLICKY_OFF && record->event.pressed) { 95 clicky_off(); 96 } 97 98 if (keycode == QK_AUDIO_CLICKY_RESET && record->event.pressed) { 99 clicky_freq_reset(); 100 } 101 102 if (keycode == QK_AUDIO_CLICKY_UP && record->event.pressed) { 103 clicky_freq_up(); 104 } 105 if (keycode == QK_AUDIO_CLICKY_DOWN && record->event.pressed) { 106 clicky_freq_down(); 107 } 108 109 if (audio_config.enable && audio_config.clicky_enable) { 110 if (record->event.pressed) { // Leave this separate so it's easier to add upstroke sound 111 if (keycode != QK_AUDIO_ON && keycode != QK_AUDIO_OFF) { // DO NOT PLAY if audio will be disabled, and causes issuse on ARM 112 clicky_play(); 113 } 114 } 115 } 116 return true; 117 } 118 119 #endif // AUDIO_CLICKY