qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

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