Stop sounds when suspended (#11553)

* fix stopping audio on suspend vs. startup sound

* trim firmware size

* fix stuck audio on startup (ARM)
master
Joshua Diamond 2021-01-31 17:25:55 -05:00 committed by GitHub
parent db11a2a1fd
commit ae4ee7553a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 56 additions and 4 deletions

View File

@ -83,6 +83,7 @@ void increase_tempo(uint8_t tempo_change);
void decrease_tempo(uint8_t tempo_change); void decrease_tempo(uint8_t tempo_change);
void audio_init(void); void audio_init(void);
void audio_startup(void);
#ifdef PWM_AUDIO #ifdef PWM_AUDIO
void play_sample(uint8_t* s, uint16_t l, bool r); void play_sample(uint8_t* s, uint16_t l, bool r);

View File

@ -227,7 +227,9 @@ void audio_init() {
audio_initialized = true; audio_initialized = true;
} }
}
void audio_startup() {
if (audio_config.enable) { if (audio_config.enable) {
PLAY_SONG(startup_song); PLAY_SONG(startup_song);
} }

View File

@ -281,6 +281,12 @@ void audio_init() {
dacStart(&DACD1, &dac1cfg1); dacStart(&DACD1, &dac1cfg1);
dacStart(&DACD2, &dac1cfg2); dacStart(&DACD2, &dac1cfg2);
/*
* Start the note timer
*/
gptStart(&GPTD8, &gpt8cfg1);
gptStartContinuous(&GPTD8, 2U);
/* /*
* Starting GPT6/7 driver, it is used for triggering the DAC. * Starting GPT6/7 driver, it is used for triggering the DAC.
*/ */
@ -295,10 +301,12 @@ void audio_init() {
audio_initialized = true; audio_initialized = true;
stop_all_notes();
}
void audio_startup() {
if (audio_config.enable) { if (audio_config.enable) {
PLAY_SONG(startup_song); 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); } bool is_audio_on(void) { return (audio_config.enable != 0); }
void audio_toggle(void) { void audio_toggle(void) {
if (audio_config.enable) {
stop_all_notes();
}
audio_config.enable ^= 1; audio_config.enable ^= 1;
eeconfig_update_audio(audio_config.raw); eeconfig_update_audio(audio_config.raw);
if (audio_config.enable) { if (audio_config.enable) {

View File

@ -29,6 +29,11 @@
#define CPU_PRESCALER 8 #define CPU_PRESCALER 8
#ifndef STARTUP_SONG
# define STARTUP_SONG SONG(STARTUP_SOUND)
#endif
float startup_song[][2] = STARTUP_SONG;
// Timer Abstractions // Timer Abstractions
// TIMSK3 - Timer/Counter #3 Interrupt Mask Register // TIMSK3 - Timer/Counter #3 Interrupt Mask Register
@ -155,6 +160,12 @@ void audio_init() {
audio_initialized = true; audio_initialized = true;
} }
void audio_startup() {
if (audio_config.enable) {
PLAY_SONG(startup_song);
}
}
void stop_all_notes() { void stop_all_notes() {
if (!audio_initialized) { if (!audio_initialized) {
audio_init(); audio_init();

View File

@ -656,6 +656,26 @@ void matrix_init_quantum() {
} }
void matrix_scan_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) #if defined(AUDIO_ENABLE) && !defined(NO_MUSIC_MODE)
matrix_scan_music(); matrix_scan_music();
#endif #endif

View File

@ -97,8 +97,7 @@ static void power_down(uint8_t wdto) {
led_set(leds_off); led_set(leds_off);
# ifdef AUDIO_ENABLE # ifdef AUDIO_ENABLE
// This sometimes disables the start-up noise, so it's been disabled stop_all_notes();
// stop_all_notes();
# endif /* AUDIO_ENABLE */ # endif /* AUDIO_ENABLE */
# if defined(RGBLIGHT_SLEEP) && defined(RGBLIGHT_ENABLE) # if defined(RGBLIGHT_SLEEP) && defined(RGBLIGHT_ENABLE)
rgblight_suspend(); rgblight_suspend();
@ -157,6 +156,7 @@ __attribute__((weak)) void suspend_wakeup_init_user(void) {}
* FIXME: needs doc * FIXME: needs doc
*/ */
__attribute__((weak)) void suspend_wakeup_init_kb(void) { suspend_wakeup_init_user(); } __attribute__((weak)) void suspend_wakeup_init_kb(void) { suspend_wakeup_init_user(); }
/** \brief run immediately after wakeup /** \brief run immediately after wakeup
* *
* FIXME: needs doc * FIXME: needs doc

View File

@ -12,6 +12,10 @@
#include "led.h" #include "led.h"
#include "wait.h" #include "wait.h"
#ifdef AUDIO_ENABLE
# include "audio.h"
#endif /* AUDIO_ENABLE */
#ifdef BACKLIGHT_ENABLE #ifdef BACKLIGHT_ENABLE
# include "backlight.h" # include "backlight.h"
#endif #endif
@ -65,6 +69,9 @@ void suspend_power_down(void) {
#if defined(RGBLIGHT_SLEEP) && defined(RGBLIGHT_ENABLE) #if defined(RGBLIGHT_SLEEP) && defined(RGBLIGHT_ENABLE)
rgblight_suspend(); rgblight_suspend();
#endif #endif
#ifdef AUDIO_ENABLE
stop_all_notes();
#endif /* AUDIO_ENABLE */
suspend_power_down_kb(); suspend_power_down_kb();
// on AVR, this enables the watchdog for 15ms (max), and goes to // on AVR, this enables the watchdog for 15ms (max), and goes to