feat(device): 增加耳机最大音量限制及显示提示

- 新增 getHomeVolumeMax 函数,计算耳机输出的最大允许音量
- 新增 getHeadphoneMaxVolumeDb 函数,获取耳机最大音量的 dB 值用于提示显示
- 修改 setVolume 函数,限制音量在动态最大值范围内,防止首页入口发送超限音量
- Home 页面音量滑块、旋钮角度及音量范围由固定 200 调整为当前设备最大音量
- 添加耳机最大音量提示文本,根据用户设置动态显示最大 dB 值
- 各语言文件新增耳机最大音量提示相关文案
- 优化实现,防止拖动时音量显示超出最大音量限制
This commit is contained in:
eafonyang
2026-09-23 19:05:39 +08:00
parent 6937705fa1
commit 16f1d5aee7
6 changed files with 78 additions and 22 deletions
+8 -3
View File
@@ -1,6 +1,7 @@
import React, { createContext, useCallback, useContext, useEffect, useRef, useState } from "react";
import {
DeviceState,
getHomeVolumeMax,
LuxsinAPI,
MOCK_DEVICE_STATE,
MOCK_PEQ_STATE,
@@ -213,12 +214,16 @@ export function DeviceProvider({ children }: { children: React.ReactNode }) {
}, [api, isDemoMode, applyPeqFiltersToState]);
// Optimistic setters
const maxVolume = getHomeVolumeMax(deviceState);
const setVolume = useCallback((v: number) => {
setDeviceState(prev => prev ? { ...prev, volume: v } : prev);
if (!Number.isFinite(v)) return;
// 指令和乐观状态使用同一上限,防止任何首页入口发送超限音量。
const volume = Math.max(0, Math.min(maxVolume, Math.round(v)));
setDeviceState(prev => prev ? { ...prev, volume } : prev);
if (!isDemoMode && api) {
api.setVolume(v).catch(console.error);
api.setVolume(volume).catch(console.error);
}
}, [api, isDemoMode]);
}, [api, isDemoMode, maxVolume]);
const setInput = useCallback((v: number) => {
setDeviceState(prev => prev ? { ...prev, input: v } : prev);