diff options
| author | Jack Humbert <jack.humb@gmail.com> | 2017-09-06 12:37:57 -0400 |
|---|---|---|
| committer | Jack Humbert <jack.humb@gmail.com> | 2017-09-06 12:37:57 -0400 |
| commit | 994592f9859303f71ac6c2384d37557d3e5fc736 (patch) | |
| tree | d7fa544ca85cbc219aa4ef060c8423798bf1d508 | |
| parent | 4d5eeb3d7d366d3f120059b6d64a3145591df7a3 (diff) | |
| download | qmk_firmware-994592f9859303f71ac6c2384d37557d3e5fc736.tar.gz qmk_firmware-994592f9859303f71ac6c2384d37557d3e5fc736.zip | |
add audio on/off audios
| -rw-r--r-- | quantum/audio/audio.c | 85 | ||||
| -rw-r--r-- | quantum/audio/song_list.h | 8 |
2 files changed, 57 insertions, 36 deletions
diff --git a/quantum/audio/audio.c b/quantum/audio/audio.c index 8e8570d26..e85326ff4 100644 --- a/quantum/audio/audio.c +++ b/quantum/audio/audio.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include "print.h" | 23 | #include "print.h" |
| 24 | #include "audio.h" | 24 | #include "audio.h" |
| 25 | #include "keymap.h" | 25 | #include "keymap.h" |
| 26 | #include "wait.h" | ||
| 26 | 27 | ||
| 27 | #include "eeconfig.h" | 28 | #include "eeconfig.h" |
| 28 | 29 | ||
| @@ -122,14 +123,19 @@ bool glissando = true; | |||
| 122 | #ifndef STARTUP_SONG | 123 | #ifndef STARTUP_SONG |
| 123 | #define STARTUP_SONG SONG(STARTUP_SOUND) | 124 | #define STARTUP_SONG SONG(STARTUP_SOUND) |
| 124 | #endif | 125 | #endif |
| 126 | #ifndef AUDIO_ON_SONG | ||
| 127 | #define AUDIO_ON_SONG SONG(AUDIO_ON_SOUND) | ||
| 128 | #endif | ||
| 129 | #ifndef AUDIO_OFF_SONG | ||
| 130 | #define AUDIO_OFF_SONG SONG(AUDIO_OFF_SOUND) | ||
| 131 | #endif | ||
| 125 | float startup_song[][2] = STARTUP_SONG; | 132 | float startup_song[][2] = STARTUP_SONG; |
| 133 | float audio_on_song[][2] = AUDIO_ON_SONG; | ||
| 134 | float audio_off_song[][2] = AUDIO_OFF_SONG; | ||
| 126 | 135 | ||
| 127 | void audio_init() | 136 | void audio_init() |
| 128 | { | 137 | { |
| 129 | 138 | ||
| 130 | if (audio_initialized) | ||
| 131 | return; | ||
| 132 | |||
| 133 | // Check EEPROM | 139 | // Check EEPROM |
| 134 | if (!eeconfig_is_enabled()) | 140 | if (!eeconfig_is_enabled()) |
| 135 | { | 141 | { |
| @@ -137,46 +143,49 @@ void audio_init() | |||
| 137 | } | 143 | } |
| 138 | audio_config.raw = eeconfig_read_audio(); | 144 | audio_config.raw = eeconfig_read_audio(); |
| 139 | 145 | ||
| 140 | // Set port PC6 (OC3A and /OC4A) as output | 146 | if (!audio_initialized) { |
| 141 | 147 | ||
| 142 | #ifdef C6_AUDIO | 148 | // Set port PC6 (OC3A and /OC4A) as output |
| 143 | DDRC |= _BV(PORTC6); | ||
| 144 | #else | ||
| 145 | DDRC |= _BV(PORTC6); | ||
| 146 | PORTC &= ~_BV(PORTC6); | ||
| 147 | #endif | ||
| 148 | 149 | ||
| 149 | #ifdef B5_AUDIO | 150 | #ifdef C6_AUDIO |
| 150 | DDRB |= _BV(PORTB5); | 151 | DDRC |= _BV(PORTC6); |
| 151 | #else | 152 | #else |
| 152 | DDRB |= _BV(PORTB5); | 153 | DDRC |= _BV(PORTC6); |
| 153 | PORTB &= ~_BV(PORTB5); | 154 | PORTC &= ~_BV(PORTC6); |
| 154 | #endif | 155 | #endif |
| 155 | 156 | ||
| 156 | #ifdef C6_AUDIO | 157 | #ifdef B5_AUDIO |
| 157 | DISABLE_AUDIO_COUNTER_3_ISR; | 158 | DDRB |= _BV(PORTB5); |
| 158 | #endif | 159 | #else |
| 159 | 160 | DDRB |= _BV(PORTB5); | |
| 160 | #ifdef B5_AUDIO | 161 | PORTB &= ~_BV(PORTB5); |
| 161 | DISABLE_AUDIO_COUNTER_1_ISR; | 162 | #endif |
| 162 | #endif | ||
| 163 | 163 | ||
| 164 | // TCCR3A / TCCR3B: Timer/Counter #3 Control Registers | 164 | #ifdef C6_AUDIO |
| 165 | // Compare Output Mode (COM3An) = 0b00 = Normal port operation, OC3A disconnected from PC6 | 165 | DISABLE_AUDIO_COUNTER_3_ISR; |
| 166 | // Waveform Generation Mode (WGM3n) = 0b1110 = Fast PWM Mode 14 (Period = ICR3, Duty Cycle = OCR3A) | 166 | #endif |
| 167 | // Clock Select (CS3n) = 0b010 = Clock / 8 | 167 | |
| 168 | #ifdef B5_AUDIO | ||
| 169 | DISABLE_AUDIO_COUNTER_1_ISR; | ||
| 170 | #endif | ||
| 168 | 171 | ||
| 169 | #ifdef C6_AUDIO | 172 | // TCCR3A / TCCR3B: Timer/Counter #3 Control Registers |
| 170 | TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30); | 173 | // Compare Output Mode (COM3An) = 0b00 = Normal port operation, OC3A disconnected from PC6 |
| 171 | TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30); | 174 | // Waveform Generation Mode (WGM3n) = 0b1110 = Fast PWM Mode 14 (Period = ICR3, Duty Cycle = OCR3A) |
| 172 | #endif | 175 | // Clock Select (CS3n) = 0b010 = Clock / 8 |
| 173 | 176 | ||
| 174 | #ifdef B5_AUDIO | 177 | #ifdef C6_AUDIO |
| 175 | TCCR1A = (0 << COM1A1) | (0 << COM1A0) | (1 << WGM11) | (0 << WGM10); | 178 | TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30); |
| 176 | TCCR1B = (1 << WGM13) | (1 << WGM12) | (0 << CS12) | (1 << CS11) | (0 << CS10); | 179 | TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30); |
| 177 | #endif | 180 | #endif |
| 178 | 181 | ||
| 179 | audio_initialized = true; | 182 | #ifdef B5_AUDIO |
| 183 | TCCR1A = (0 << COM1A1) | (0 << COM1A0) | (1 << WGM11) | (0 << WGM10); | ||
| 184 | TCCR1B = (1 << WGM13) | (1 << WGM12) | (0 << CS12) | (1 << CS11) | (0 << CS10); | ||
| 185 | #endif | ||
| 186 | |||
| 187 | audio_initialized = true; | ||
| 188 | } | ||
| 180 | 189 | ||
| 181 | if (audio_config.enable) { | 190 | if (audio_config.enable) { |
| 182 | PLAY_SONG(startup_song); | 191 | PLAY_SONG(startup_song); |
| @@ -720,9 +729,13 @@ void audio_on(void) { | |||
| 720 | audio_config.enable = 1; | 729 | audio_config.enable = 1; |
| 721 | eeconfig_update_audio(audio_config.raw); | 730 | eeconfig_update_audio(audio_config.raw); |
| 722 | audio_on_user(); | 731 | audio_on_user(); |
| 732 | PLAY_SONG(audio_on_song); | ||
| 723 | } | 733 | } |
| 724 | 734 | ||
| 725 | void audio_off(void) { | 735 | void audio_off(void) { |
| 736 | PLAY_SONG(audio_off_song); | ||
| 737 | wait_ms(100); | ||
| 738 | stop_all_notes(); | ||
| 726 | audio_config.enable = 0; | 739 | audio_config.enable = 0; |
| 727 | eeconfig_update_audio(audio_config.raw); | 740 | eeconfig_update_audio(audio_config.raw); |
| 728 | } | 741 | } |
diff --git a/quantum/audio/song_list.h b/quantum/audio/song_list.h index f355d371b..5ad543ca7 100644 --- a/quantum/audio/song_list.h +++ b/quantum/audio/song_list.h | |||
| @@ -127,6 +127,14 @@ | |||
| 127 | E__NOTE(_GS6), \ | 127 | E__NOTE(_GS6), \ |
| 128 | E__NOTE(_A6 ), | 128 | E__NOTE(_A6 ), |
| 129 | 129 | ||
| 130 | #define AUDIO_ON_SOUND \ | ||
| 131 | E__NOTE(_A5 ), \ | ||
| 132 | E__NOTE(_A6 ), | ||
| 133 | |||
| 134 | #define AUDIO_OFF_SOUND \ | ||
| 135 | E__NOTE(_A6 ), \ | ||
| 136 | E__NOTE(_A5 ), | ||
| 137 | |||
| 130 | #define MUSIC_SCALE_SOUND MUSIC_ON_SOUND | 138 | #define MUSIC_SCALE_SOUND MUSIC_ON_SOUND |
| 131 | 139 | ||
| 132 | #define MUSIC_OFF_SOUND \ | 140 | #define MUSIC_OFF_SOUND \ |
