麦克风: 外接输入设备热插拔跟随重建 + 音量UI改硬件调节提示

- MicActivator: 支持 restart/setPreferredDevice(API26), 输入路由切换后重建占用
- MainActivity: AudioDeviceCallback(API23+)/HEADSET广播监听, USB/外接麦插入后
  自动重建 AudioRecord 跟随当前输入设备
- 麦克风音量标准Android无输入增益API: 远程界面滑杆禁用并提示'由功放/混音器
  硬件调节', 本地调音台+/−按钮同样提示, 避免假调节无效果
This commit is contained in:
zijunchiang
2026-09-06 01:33:59 +08:00
parent 197b01f806
commit 61ad000daf
6 changed files with 125 additions and 20 deletions
+2
View File
@@ -15,3 +15,5 @@
.rank-pager button:disabled{opacity:.35;box-shadow:none}
.rank-pager b{min-width:64px;text-align:center;color:#b9a9c9;font-size:11px}
.empty.compact{padding:42px 15px}
.audio-panel label.mic-hw{opacity:.55}.audio-panel label.mic-hw>small{grid-column:1/3;color:#9f8eb0;font-size:10px;margin-top:2px}.audio-panel label.mic-hw input[type=range]{background:rgba(255,255,255,.14)}
+6 -5
View File
@@ -75,7 +75,9 @@ async function refresh() {
$("#musicVolume").value = data.musicVolume ?? 70;
$("#micVolume").value = data.micVolume ?? 70;
$("#musicValue").textContent = data.musicVolume ?? 70;
$("#micValue").textContent = data.micVolume ?? 70;
// 麦克风音量由功放/混音器硬件调节(滑杆已禁用), 仅保留显示值。
const micHw = $("#micValue");
if (micHw) micHw.textContent = data.micVolume ?? 70;
$("#original").classList.toggle("active", data.vocalMode === "original");
$("#accompany").classList.toggle("active", data.vocalMode !== "original");
$("#nextSong").textContent = data.next?.title || "队列为空";
@@ -203,10 +205,9 @@ $("#searchForm").addEventListener("submit", (event) => { event.preventDefault();
$("#more").addEventListener("click", () => search(false));
$("#hotPrev").addEventListener("click", () => loadHot(uiState.hotPage - 1));
$("#hotNext").addEventListener("click", () => loadHot(uiState.hotPage + 1));
["music", "mic"].forEach((kind) => {
$("#" + kind + "Volume").addEventListener("input", (event) => { $("#" + kind + "Value").textContent = event.target.value; });
$("#" + kind + "Volume").addEventListener("change", (event) => updateAudio({ [kind + "Volume"]: Number(event.target.value) }));
});
// 音乐音量可调; 麦克风音量由功放硬件控制, 不再向设备发送无效果请求。
$("#musicVolume").addEventListener("input", (event) => { $("#musicValue").textContent = event.target.value; });
$("#musicVolume").addEventListener("change", (event) => updateAudio({ musicVolume: Number(event.target.value) }));
document.addEventListener("visibilitychange", () => { uiState.visible = !document.hidden; if (uiState.visible) refresh(); });
window.setInterval(() => { if (uiState.visible) refresh(); }, 1000);
refresh();
+1 -1
View File
@@ -37,7 +37,7 @@
<div class="panel-title"><div><span class="tiny-icon"></span><b>声音控制</b></div><small>即时生效</small></div>
<div class="seg"><button id="accompany" data-vocal="accompany"><span></span>伴唱</button><button id="original" data-vocal="original"><span></span>原唱</button></div>
<label><span><i class="volume-icon"></i>音乐音量</span><b><em id="musicValue">70</em>%</b><input id="musicVolume" type="range" min="0" max="100" value="70"></label>
<label><span><i class="volume-icon mic"></i>麦克风音量</span><b><em id="micValue">70</em>%</b><input id="micVolume" type="range" min="0" max="100" value="70"></label>
<label class="mic-hw"><span><i class="volume-icon mic"></i>麦克风音量</span><small>由功放/混音器硬件调节</small><input id="micVolume" type="range" min="0" max="100" value="70" disabled></label>
</article>
<article class="next-card"><div class="next-number">02</div><div><small>下一首</small><b id="nextSong">队列为空</b></div><button data-page="queue">查看队列 <span></span></button></article>