Merge branch 'master' into fix-polling-rate

This commit is contained in:
awalol
2026-04-30 14:56:15 +08:00
committed by GitHub
4 changed files with 35 additions and 18 deletions
+1 -1
View File
@@ -96,7 +96,7 @@ target_include_directories(${PROJECT_NAME} PUBLIC
target_link_libraries(ds5-bridge target_link_libraries(ds5-bridge
pico_stdlib pico_stdlib
pico_multicore pico_multicore
hardware_interp hardware_watchdog
hardware_timer hardware_timer
pico_btstack_classic pico_btstack_classic
# pico_cyw43_arch_threadsafe_background # pico_cyw43_arch_threadsafe_background
+5 -5
View File
@@ -75,7 +75,7 @@ void audio_loop() {
audio_buf[audio_buf_pos++] = raw[i * INPUT_CHANNELS] / 32768.0f * (volume[0] - 1.0f); audio_buf[audio_buf_pos++] = raw[i * INPUT_CHANNELS] / 32768.0f * (volume[0] - 1.0f);
audio_buf[audio_buf_pos++] = raw[i * INPUT_CHANNELS + 1] / 32768.0f * (volume[0] - 1.0f); audio_buf[audio_buf_pos++] = raw[i * INPUT_CHANNELS + 1] / 32768.0f * (volume[0] - 1.0f);
if (audio_buf_pos == 512 * 2) { if (audio_buf_pos == 512 * 2) {
audio_raw_element element{}; static audio_raw_element element{};
memcpy(element.data,audio_buf,512 * 2 * 4); memcpy(element.data,audio_buf,512 * 2 * 4);
if (queue_is_full(&audio_fifo)){ if (queue_is_full(&audio_fifo)){
queue_try_remove(&audio_fifo,NULL); queue_try_remove(&audio_fifo,NULL);
@@ -91,7 +91,7 @@ void audio_loop() {
} }
// 3. 48kHz -> 3kHz 重采样 // 3. 48kHz -> 3kHz 重采样
WDL_ResampleSample out_buf[SAMPLE_SIZE]; // 64 floats = 32帧 × 2ch static WDL_ResampleSample out_buf[SAMPLE_SIZE]; // 64 floats = 32帧 × 2ch
int out_frames = resampler.ResampleOut(out_buf, nframes, SAMPLE_SIZE / OUTPUT_CHANNELS, OUTPUT_CHANNELS); int out_frames = resampler.ResampleOut(out_buf, nframes, SAMPLE_SIZE / OUTPUT_CHANNELS, OUTPUT_CHANNELS);
static int8_t haptic_buf[SAMPLE_SIZE]; static int8_t haptic_buf[SAMPLE_SIZE];
@@ -169,7 +169,7 @@ void core1_entry() {
resampler_audio.SetFeedMode(true); resampler_audio.SetFeedMode(true);
while (true) { while (true) {
audio_raw_element audio_element{}; static audio_raw_element audio_element{};
queue_remove_blocking(&audio_fifo,&audio_element); queue_remove_blocking(&audio_fifo,&audio_element);
// 将 512 frames 重采样成 480 frames 以解决噪音问题。感谢 @Junhoo // 将 512 frames 重采样成 480 frames 以解决噪音问题。感谢 @Junhoo
WDL_ResampleSample *in_buf; WDL_ResampleSample *in_buf;
@@ -177,9 +177,9 @@ void core1_entry() {
for (int i = 0; i < nframes * 2;i++) { for (int i = 0; i < nframes * 2;i++) {
in_buf[i] = audio_element.data[i]; in_buf[i] = audio_element.data[i];
} }
WDL_ResampleSample out_buf[200]; static WDL_ResampleSample out_buf[480 * 2];
resampler_audio.ResampleOut(out_buf,nframes,480,2); resampler_audio.ResampleOut(out_buf,nframes,480,2);
opus_element opus_element{}; static opus_element opus_element{};
(void)opus_encode_float(encoder,out_buf,480,opus_element.data,200); (void)opus_encode_float(encoder,out_buf,480,opus_element.data,200);
if (queue_is_full(&opus_fifo)) { if (queue_is_full(&opus_fifo)) {
queue_try_remove(&opus_fifo,NULL); queue_try_remove(&opus_fifo,NULL);
-5
View File
@@ -81,11 +81,6 @@ void bt_l2cap_init() {
} }
int bt_init() { int bt_init() {
if (cyw43_arch_init()) {
printf("Failed to initialize CYW43\n");
return 1;
}
critical_section_init(&queue_lock); critical_section_init(&queue_lock);
bt_l2cap_init(); bt_l2cap_init();
+29 -7
View File
@@ -10,6 +10,7 @@
#include "audio.h" #include "audio.h"
#include "hardware/clocks.h" #include "hardware/clocks.h"
#include "hardware/vreg.h" #include "hardware/vreg.h"
#include "hardware/watchdog.h"
#include "pico/cyw43_arch.h" #include "pico/cyw43_arch.h"
// Pico SDK speciifically for waiting on conditions // Pico SDK speciifically for waiting on conditions
@@ -139,27 +140,48 @@ int main() {
sleep_ms(1000); sleep_ms(1000);
set_sys_clock_khz(320000, true); set_sys_clock_khz(320000, true);
// Initialize the critical section for the report buffer
critical_section_init(&report_cs);
board_init(); board_init();
tusb_rhport_init_t dev_init = { tusb_rhport_init_t dev_init = {
.role = TUSB_ROLE_DEVICE, .role = TUSB_ROLE_DEVICE,
.speed = TUSB_SPEED_AUTO .speed = TUSB_SPEED_FULL
}; };
tusb_init(BOARD_TUD_RHPORT, &dev_init); tusb_init(BOARD_TUD_RHPORT, &dev_init);
tud_disconnect(); tud_disconnect();
board_init_after_tusb(); board_init_after_tusb();
if (cyw43_arch_init()) {
printf("Failed to initialize CYW43\n");
return 1;
}
cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, false);
if (watchdog_caused_reboot()) {
printf("Rebooted by Watchdog!\n");
// 当崩溃重启以后,闪三下灯
for (int i = 0;i < 6;i++) {
if (i % 2 == 0) {
cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, true);
}else {
cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, false);
}
sleep_ms(500);
}
} else {
printf("Clean boot\n");
}
// Initialize the critical section for the report buffer
critical_section_init(&report_cs);
bt_init(); bt_init();
bt_register_data_callback(on_bt_data); bt_register_data_callback(on_bt_data);
audio_init(); audio_init();
watchdog_enable(1000, true);
while (1) { while (1) {
watchdog_update();
cyw43_arch_poll(); cyw43_arch_poll();
tud_task(); tud_task();
audio_loop(); audio_loop();