M quantum/audio/audio.h => quantum/audio/audio.h +1 -0
@@ 83,6 83,7 @@ void increase_tempo(uint8_t tempo_change);
void decrease_tempo(uint8_t tempo_change);
void audio_init(void);
+void audio_startup(void);
#ifdef PWM_AUDIO
void play_sample(uint8_t* s, uint16_t l, bool r);
M quantum/audio/audio_avr.c => quantum/audio/audio_avr.c +2 -0
@@ 227,7 227,9 @@ void audio_init() {
audio_initialized = true;
}
+}
+void audio_startup() {
if (audio_config.enable) {
PLAY_SONG(startup_song);
}
M quantum/audio/audio_chibios.c => quantum/audio/audio_chibios.c +13 -2
@@ 282,6 282,12 @@ void audio_init() {
dacStart(&DACD2, &dac1cfg2);
/*
+ * Start the note timer
+ */
+ gptStart(&GPTD8, &gpt8cfg1);
+ gptStartContinuous(&GPTD8, 2U);
+
+ /*
* Starting GPT6/7 driver, it is used for triggering the DAC.
*/
START_CHANNEL_1();
@@ 295,10 301,12 @@ void audio_init() {
audio_initialized = true;
+ stop_all_notes();
+}
+
+void audio_startup() {
if (audio_config.enable) {
PLAY_SONG(startup_song);
- } else {
- stop_all_notes();
}
}
@@ 638,6 646,9 @@ bool is_playing_notes(void) { return playing_notes; }
bool is_audio_on(void) { return (audio_config.enable != 0); }
void audio_toggle(void) {
+ if (audio_config.enable) {
+ stop_all_notes();
+ }
audio_config.enable ^= 1;
eeconfig_update_audio(audio_config.raw);
if (audio_config.enable) {
M quantum/audio/audio_pwm.c => quantum/audio/audio_pwm.c +11 -0
@@ 29,6 29,11 @@
#define CPU_PRESCALER 8
+#ifndef STARTUP_SONG
+# define STARTUP_SONG SONG(STARTUP_SOUND)
+#endif
+float startup_song[][2] = STARTUP_SONG;
+
// Timer Abstractions
// TIMSK3 - Timer/Counter #3 Interrupt Mask Register
@@ 155,6 160,12 @@ void audio_init() {
audio_initialized = true;
}
+void audio_startup() {
+ if (audio_config.enable) {
+ PLAY_SONG(startup_song);
+ }
+}
+
void stop_all_notes() {
if (!audio_initialized) {
audio_init();
M quantum/quantum.c => quantum/quantum.c +20 -0
@@ 656,6 656,26 @@ void matrix_init_quantum() {
}
void matrix_scan_quantum() {
+#if defined(AUDIO_ENABLE)
+ // There are some tasks that need to be run a little bit
+ // after keyboard startup, or else they will not work correctly
+ // because of interaction with the USB device state, which
+ // may still be in flux...
+ //
+ // At the moment the only feature that needs this is the
+ // startup song.
+ static bool delayed_tasks_run = false;
+ static uint16_t delayed_task_timer = 0;
+ if (!delayed_tasks_run) {
+ if (!delayed_task_timer) {
+ delayed_task_timer = timer_read();
+ } else if (timer_elapsed(delayed_task_timer) > 300) {
+ audio_startup();
+ delayed_tasks_run = true;
+ }
+ }
+#endif
+
#if defined(AUDIO_ENABLE) && !defined(NO_MUSIC_MODE)
matrix_scan_music();
#endif
M tmk_core/common/avr/suspend.c => tmk_core/common/avr/suspend.c +2 -2
@@ 97,8 97,7 @@ static void power_down(uint8_t wdto) {
led_set(leds_off);
# ifdef AUDIO_ENABLE
- // This sometimes disables the start-up noise, so it's been disabled
- // stop_all_notes();
+ stop_all_notes();
# endif /* AUDIO_ENABLE */
# if defined(RGBLIGHT_SLEEP) && defined(RGBLIGHT_ENABLE)
rgblight_suspend();
@@ 157,6 156,7 @@ __attribute__((weak)) void suspend_wakeup_init_user(void) {}
* FIXME: needs doc
*/
__attribute__((weak)) void suspend_wakeup_init_kb(void) { suspend_wakeup_init_user(); }
+
/** \brief run immediately after wakeup
*
* FIXME: needs doc
M tmk_core/common/chibios/suspend.c => tmk_core/common/chibios/suspend.c +7 -0
@@ 12,6 12,10 @@
#include "led.h"
#include "wait.h"
+#ifdef AUDIO_ENABLE
+# include "audio.h"
+#endif /* AUDIO_ENABLE */
+
#ifdef BACKLIGHT_ENABLE
# include "backlight.h"
#endif
@@ 65,6 69,9 @@ void suspend_power_down(void) {
#if defined(RGBLIGHT_SLEEP) && defined(RGBLIGHT_ENABLE)
rgblight_suspend();
#endif
+#ifdef AUDIO_ENABLE
+ stop_all_notes();
+#endif /* AUDIO_ENABLE */
suspend_power_down_kb();
// on AVR, this enables the watchdog for 15ms (max), and goes to