From a1837d2d8088ec8b7334106ec3c1929a1c1b08fd Mon Sep 17 00:00:00 2001 From: Dana Conrad Date: Sat, 8 Nov 2025 15:12:58 +0000 Subject: [PATCH] usbaudio: block playback while usbaudio is active Needed due to us commandeering the AUDIO DSP "channel" for USBAudio. If/When we add another DSP channel, this can be reverted. Works, but still goes to a "blank" WPS screen for a split second before cancelling out. Change-Id: I5fb8a1e226b4d3e46c86c59d593d807f49d7a35f --- apps/playback.c | 15 +++++++++++++++ firmware/usbstack/usb_audio.c | 10 ++++++++++ firmware/usbstack/usb_audio.h | 3 +++ 3 files changed, 28 insertions(+) diff --git a/apps/playback.c b/apps/playback.c index 381c474415..8a32772865 100644 --- a/apps/playback.c +++ b/apps/playback.c @@ -65,6 +65,12 @@ #include /* For strncasecmp() */ #endif +#ifdef USB_ENABLE_AUDIO +#include "usbstack/usb_audio.h" +#include "splash.h" +#include "lang.h" +#endif + /* TODO: The audio thread really is doing multitasking of acting like a consumer and producer of tracks. It may be advantageous to better logically separate the two functions. I won't go that far just yet. */ @@ -2978,6 +2984,15 @@ static void audio_on_track_changed(void) static void audio_start_playback(const struct audio_resume_info *resume_info, unsigned int flags) { +/* NOTE: if USBAudio ever gets its own DSP channel, this block can go away! */ +#ifdef USB_ENABLE_AUDIO + if (usb_audio_get_active()) + { + splash(HZ*2, str(LANG_USB_DAC_ACTIVE)); + queue_reply(&audio_queue, 0); + return; + } +#endif static struct audio_resume_info resume = { 0, 0 }; enum play_status old_status = play_status; diff --git a/firmware/usbstack/usb_audio.c b/firmware/usbstack/usb_audio.c index 321f4405c1..de67cdf366 100644 --- a/firmware/usbstack/usb_audio.c +++ b/firmware/usbstack/usb_audio.c @@ -398,6 +398,9 @@ int buffers_filled_max_last; static int last_frame = 0; static int frames_dropped = 0; +/* for blocking normal playback */ +static bool usbaudio_active = false; + /* Schematic view of the RX situation: * (in case NR_BUFFERS = 4) * @@ -1181,6 +1184,7 @@ void usb_audio_init_connection(void) { logf("usbaudio: init connection"); + usbaudio_active = true; dsp = dsp_get_config(CODEC_IDX_AUDIO); dsp_configure(dsp, DSP_RESET, 0); dsp_configure(dsp, DSP_SET_STEREO_MODE, STEREO_INTERLEAVED); @@ -1202,6 +1206,12 @@ void usb_audio_disconnect(void) usb_audio_stop_playback(); usb_audio_free_buf(); + usbaudio_active = false; +} + +bool usb_audio_get_active(void) +{ + return usbaudio_active; } bool usb_audio_get_alloc_failed(void) diff --git a/firmware/usbstack/usb_audio.h b/firmware/usbstack/usb_audio.h index 209efccaa6..ebe5542da0 100644 --- a/firmware/usbstack/usb_audio.h +++ b/firmware/usbstack/usb_audio.h @@ -20,6 +20,7 @@ #define USB_AUDIO_H #include "usb_ch9.h" +#include "usb_class_driver.h" /* NOTE * @@ -276,4 +277,6 @@ int usb_audio_get_frames_dropped(void); */ int usb_audio_get_cur_volume(void); +bool usb_audio_get_active(void); + #endif