at master 3.7 kB view raw
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 27float clicky_freq = AUDIO_CLICKY_FREQ_DEFAULT; 28float clicky_rand = AUDIO_CLICKY_FREQ_RANDOMNESS; 29 30// the first "note" is an intentional delay; the 2nd and 3rd notes are the "clicky" 31float clicky_song[][2] = {{0.0f, AUDIO_CLICKY_DELAY_DURATION}, {AUDIO_CLICKY_FREQ_DEFAULT, 3}, {AUDIO_CLICKY_FREQ_DEFAULT, 1}}; // 3 and 1 --> durations 32 33extern audio_config_t audio_config; 34 35# ifndef NO_MUSIC_MODE 36extern bool music_activated; 37extern bool midi_activated; 38# endif // !NO_MUSIC_MODE 39 40void 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 49void 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 56void 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 63void clicky_freq_reset(void) { 64 clicky_freq = AUDIO_CLICKY_FREQ_DEFAULT; 65} 66 67void clicky_toggle(void) { 68 audio_config.clicky_enable ^= 1; 69 eeconfig_update_audio(&audio_config); 70} 71 72void clicky_on(void) { 73 audio_config.clicky_enable = 1; 74 eeconfig_update_audio(&audio_config); 75} 76 77void clicky_off(void) { 78 audio_config.clicky_enable = 0; 79 eeconfig_update_audio(&audio_config); 80} 81 82bool is_clicky_on(void) { 83 return (audio_config.clicky_enable != 0); 84} 85 86bool 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