mirror of
https://github.com/firewalkwithm3/qmk_firmware.git
synced 2024-11-22 19:40:29 +08:00
Stop sounds when suspended (#11553)
* fix stopping audio on suspend vs. startup sound * trim firmware size * fix stuck audio on startup (ARM)
This commit is contained in:
parent
db11a2a1fd
commit
ae4ee7553a
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue