fix(lyric/bt): ①桌面歌词页封面不显示修复(根因:歌词页从不画封面+scrim逐秒叠涂压黑→新增np_draw_lyric_coverbg封面背景+1s整页重绘;播放页封面宿实证非批5破坏) ②alsa.conf pcm.bluealsa DEV自动识别(bt_dev.c:audiod BT打开时bluealsa-cli检测a2dpsrc设备幂等改写DEV=保留codec/ldac_eqmid等);test_bt_dev 14/14,0warning

This commit is contained in:
AskaEth committed 2026-09-03 22:36:17 +08:00
1 parent ef6eca86b1
commit 8c165bb8e6
6 files changed
+359 -13

No files matched your search

+46
View File
@@ -58,6 +58,7 @@
#include <sys/un.h>
#include <sys/wait.h>
#include "meow_ipc.h"
#include "bt_dev.h" /* P2:DEV 自识别(a2dpsrc 端点 → MAC → alsa.conf 幂等改写) */
#ifdef __linux__
#include <sound/asound.h>
@@ -910,6 +911,50 @@ static void bt_apply_codec_conf(void)
free(out);
}
/* P2 BT DEV 自识别:把 /usr/data/alsa.conf 的 `pcm.bluealsa` DEV/device 自动改为**当前连接的
* A2DP sink 设备** MAC(bluealsa-cli list-pcms 的 a2dpsrc 端点)。幂等(设备未变不重写)、
* 无设备/失败跳过;只改 DEV/device 两处、保留 codec/其余 token。BT 打开前调用,实现
* 「连哪个设备就播哪个」。跟 bt_apply_codec_conf 同构(外科式 token 替换,绝不建结构)。 */
static void bt_apply_device_conf(void)
{
char mac[32] = "";
char *o = popen_read_tmo(1500, "bluealsa-cli list-pcms 2>/dev/null");
if (!o) { logmsg("bt: dev conf skipped (no bluealsa-cli)"); return; }
if (bt_dev_detect_mac(o, mac, sizeof mac) != 0) {
logmsg("bt: dev conf skipped (no a2dpsrc pcm)");
return;
}
logmsg("bt: current a2dp dev %s", mac);
const char *path = "/usr/data/alsa.conf";
FILE *f = fopen(path, "r");
if (!f) return;
fseek(f, 0, SEEK_END); long sz = ftell(f);
if (sz <= 0 || sz > 64 * 1024) { fclose(f); return; }
fseek(f, 0, SEEK_SET);
char *data = malloc((size_t)sz + 1);
if (!data) { fclose(f); return; }
size_t rl = fread(data, 1, (size_t)sz, f); data[rl] = 0;
fclose(f);
char *outdata = NULL; size_t outlen = 0;
int rc = bt_dev_rewrite(data, rl, mac, &outdata, &outlen);
free(data);
if (rc == 0) {
int fd = open(path, O_WRONLY | O_TRUNC, 0644);
if (fd >= 0) {
if (write(fd, outdata, outlen) < 0) { }
close(fd);
logmsg("bt: dev conf auto-updated %s -> %s", path, mac);
} else {
logmsg("bt: dev conf %s not writable, skip", path);
}
} else if (rc == 1) {
logmsg("bt: dev conf ok (already %s)", mac);
} else {
logmsg("bt: dev conf skip (no pcm.bluealsa/no DEV token)");
}
if (outdata) free(outdata);
}
/* BT 打开:libasound → snd_pcm_open(pcm.bluealsa/bluealsa, PLAYBACK, NONBLOCK) →
* set_params(S16_LE, RW, ch, rate, soft_resample, 100ms)。返回 0=ok。失败置 g_bt_open=0。 */
static int bt_open(void)
@@ -1177,6 +1222,7 @@ static int dev_open(void)
* 宿主即 FILE/NULL sink 时不走此支——因此宿主可测「目标选择/音量隔离/格式归一」逻辑,
* 真实 bluealsa 传输留给真机(见 bt_* 注释)。失败 → 降级丢帧(自感知兜底 §五)。 */
if (g_target == AUDIO_OUT_BT && g_sink == SINK_ALSA) {
bt_apply_device_conf(); /* P2:DEV 幂等自更新到当前连接 A2DP 设备(连哪台播哪台) */
bt_apply_codec_conf();
if (bt_open() == 0) return 0; /* g_bt_open=1;返回 0=逻辑已开(真实句柄在 g_bt_hdl) */
logmsg("bt: open failed (degrade: drop PCM until next OPEN)");