summary refs log tree commit diff
diff options
context:
space:
mode:
authorJoshua Diamond <josh@windowoffire.com>2021-01-31 17:25:55 -0500
committerGitHub <noreply@github.com>2021-02-01 09:25:55 +1100
commitae4ee7553abfaa2149fcea04c3cbee20f3b8c7a5 (patch)
tree8baafbc7332a9ed95e5ff35de3f9ed5f21826f4f
parentdb11a2a1fd7a7ff9c458e8ec9e963a61a1192bf3 (diff)
Stop sounds when suspended (#11553)
* fix stopping audio on suspend vs. startup sound

* trim firmware size

* fix stuck audio on startup (ARM)
-rw-r--r--quantum/audio/audio.h1
-rw-r--r--quantum/audio/audio_avr.c2
-rw-r--r--quantum/audio/audio_chibios.c15
-rw-r--r--quantum/audio/audio_pwm.c11
-rw-r--r--quantum/quantum.c20
-rw-r--r--tmk_core/common/avr/suspend.c4
-rw-r--r--tmk_core/common/chibios/suspend.c7
7 files changed, 56 insertions, 4 deletions
diff --git a/quantum/audio/audio.h b/quantum/audio/audio.h
index bc00cd19e6..dccf03d5f6 100644
--- a/quantum/audio/audio.h
+++ b/quantum/audio/audio.h
@@ -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);
diff --git a/quantum/audio/audio_avr.c b/quantum/audio/audio_avr.c
index 5a96bf6439..1bac43bb43 100644
--- a/quantum/audio/audio_avr.c
+++ b/quantum/audio/audio_avr.c
@@ -227,7 +227,9 @@ void audio_init() {
 
         audio_initialized = true;
     }
+}
 
+void audio_startup() {
     if (audio_config.enable) {
         PLAY_SONG(startup_song);
     }
diff --git a/quantum/audio/audio_chibios.c b/quantum/audio/audio_chibios.c
index 1863ae140b..dddb8f1357 100644
--- a/quantum/audio/audio_chibios.c
+++ b/quantum/audio/audio_chibios.c
@@ -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) {
diff --git a/quantum/audio/audio_pwm.c b/quantum/audio/audio_pwm.c
index 545aef6dd7..d93ac4bb40 100644
--- a/quantum/audio/audio_pwm.c
+++ b/quantum/audio/audio_pwm.c
@@ -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();
diff --git a/quantum/quantum.c b/quantum/quantum.c
index 22aa528387..5e0cde8a25 100644
--- a/quantum/quantum.c
+++ b/quantum/quantum.c
@@ -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
diff --git a/tmk_core/common/avr/suspend.c b/tmk_core/common/avr/suspend.c
index 86c3df040a..9db0e0064a 100644
--- a/tmk_core/common/avr/suspend.c
+++ b/tmk_core/common/avr/suspend.c
@@ -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
diff --git a/tmk_core/common/chibios/suspend.c b/tmk_core/common/chibios/suspend.c
index 796056019f..49e20641fb 100644
--- a/tmk_core/common/chibios/suspend.c
+++ b/tmk_core/common/chibios/suspend.c
@@ -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