0x8300 · sidetone
HID++ 0x8300 协议封装中的耳机旁音音量和各通道静音控制。
0x8300 控制耳机旁音,即回送至耳罩的麦克风音频。OpenLogi 提供版本 1 的类型化封装。OpenLogi 没有将该功能接入设备、agent、CLI 或桌面控制路径。
**规格:**Logitech HID++ 2.0 —— Sidetone。**交叉核对:**G HUB 2026.6(静态分析)。用于:
openlogi-hidpp中的类型化封装;没有设备层路径。
函数参考
SidetoneFeature 从版本 1 起实现 HID++ 0x8300。每个方法都是异步方法,并返回 Result<…, Hidpp20Error>。
方法
| 函数 | HID++ fn | 签名 | 返回值 |
|---|---|---|---|
get_sidetone_level | 0 | (&self) | u8 |
set_sidetone_level | 1 | (&self, level: u8) | () |
get_sidetone_mute | 2 | (&self) | SidetoneMuteStatus |
set_sidetone_mute | 3 | (&self, change: SidetoneMuteChange) | () |
类型
SidetoneMuteStatus
| 字段 | 类型 | 说明 |
|---|---|---|
statuses | u8 | 原始静音状态位掩码。置位表示对应通道静音。 |
SidetoneMuteStatus 带有 #[non_exhaustive]。
SidetoneMuteChange
| 字段 | 类型 | 说明 |
|---|---|---|
change_mask | u8 | 置位表示选择对应通道进行更新。 |
statuses | u8 | 置位表示请求将对应的已选择通道静音。 |
事件
OpenLogi v0.8.15 没有定义旁音事件类型。SidetoneFeature 没有实现 EmittingFeature。
线格式
每个方法都发送 3 字节短请求。封装读取回复前调用 extend_payload()。因此,OpenLogi 会将短回复扩展为 16 字节,并在缺失部分填零。
封装将音量记录为 0..=100,但会发送任意 u8,不会在本地验证范围。G HUB 的静态分析确认同名方法集合,但未验证这些负载布局或设备的范围行为。
get_sidetone_level(fn 0)
请求:[0x00, 0x00, 0x00]。
| 字节 | 字段 | 备注 |
|---|---|---|
| 0 | 音量 | OpenLogi 返回原始 u8。记录的范围是 0..=100。 |
set_sidetone_level(fn 1)
请求:[level, 0x00, 0x00]。
| 字节 | 字段 | 备注 |
|---|---|---|
| 0 | level | OpenLogi 发送任意 u8。没有本地范围检查。 |
| 1~2 | 填充 | OpenLogi 写入零。 |
OpenLogi 等待响应,但忽略响应负载。
get_sidetone_mute(fn 2)
请求:[0x00, 0x00, 0x00]。
| 字节 | 字段 | 备注 |
|---|---|---|
| 0 | SidetoneMuteStatus::statuses | 原始 u8 静音状态位掩码。 |
set_sidetone_mute(fn 3)
请求:[change_mask, statuses, 0x00]。
| 字节 | 字段 | 备注 |
|---|---|---|
| 0 | SidetoneMuteChange::change_mask | 选择要更新的通道状态位。 |
| 1 | SidetoneMuteChange::statuses | 已选择通道的请求状态位。 |
| 2 | 填充 | OpenLogi 写入零。 |
OpenLogi 等待响应,但忽略响应负载。
OpenLogi 的用法
功能注册表为版本 1 及更高版本的 0x8300 创建 SidetoneFeature。v0.8.15 的设备层、agent、CLI 和桌面路径都不会打开该封装。因此,OpenLogi 没有旁音状态模型、能力门控、读-改-写操作、读回检查或退出时恢复行为。
未确认的细节
G HUB 2026.6 的静态分析发现了旁音音量和静音的读写方法,以及一个事件处理器。现有证据没有给出函数编号、回复宽度、静音位分配、事件子 ID 或事件布局。需要硬件抓包或 Logitech 的功能专用规格才能验证这些细节。
Rust 用法
use hidpp::{
feature::sidetone::SidetoneFeature,
protocol::v20::Hidpp20Error,
};
async fn lower_sidetone(feature: &SidetoneFeature) -> Result<(), Hidpp20Error> {
let level = feature.get_sidetone_level().await?;
feature.set_sidetone_level(level.saturating_sub(10)).await
}