diff --git a/ylgamehall/Source/Bridge/Handlers/RemoteAudioHandler.swift b/ylgamehall/Source/Bridge/Handlers/RemoteAudioHandler.swift index e2c788f..3460d4f 100644 --- a/ylgamehall/Source/Bridge/Handlers/RemoteAudioHandler.swift +++ b/ylgamehall/Source/Bridge/Handlers/RemoteAudioHandler.swift @@ -321,6 +321,7 @@ public enum RemoteAudioHandler { // (仅转码成功 + 开关 enabled 时触发,对齐 daoqi // NewRootVC.m:343-353 if (canbofang) { play + callHandler }) let canPlay = await VoiceCenter.shared.isEnabled + log.debug("mediaTypeAudio user=\(user, privacy: .public) transcoded=\(transcoded, privacy: .public) canPlay=\(canPlay, privacy: .public)") if transcoded, canPlay { do { try VoicePlayer.shared.play(wavLocal) diff --git a/ylgamehall/Source/Bridge/Handlers/VoicePlayingHandler.swift b/ylgamehall/Source/Bridge/Handlers/VoicePlayingHandler.swift index 307db18..b984e71 100644 --- a/ylgamehall/Source/Bridge/Handlers/VoicePlayingHandler.swift +++ b/ylgamehall/Source/Bridge/Handlers/VoicePlayingHandler.swift @@ -5,14 +5,18 @@ // H5 → Native handler:voicePlaying — 远端语音播放总开关 // 契约:docs/H5-Native-Contract.md §3.1 [6] // -// Phase 2.4 仅实现"开关位",真正的 mediaTypeAudio 播放在 Phase 3 AudioKit -// 完整时接入。开关位由 actor VoiceCenter 持有,跨 handler 共享。 +// 开关位由 actor VoiceCenter 持有,跨 handler 共享。Phase 3.F +// mediaTypeAudio handler 读 isEnabled 决定是否播放。 // import Foundation +import os.log /// 远端语音播放总开关(actor 隔离,跨 bridge handler 安全共享)。 -/// Phase 3 mediaTypeAudio handler 读此 isEnabled 决定是否播放。 +/// +/// 默认值 `true` 对齐 daoqi NewRootVC.m:255 / gameController.m:343 viewDidLoad +/// 早期 `canbofang=YES` 行为(ObjC BOOL 默认是 NO,但 daoqi 在 VC init 时主动 +/// set YES)。 public actor VoiceCenter { public static let shared = VoiceCenter() public private(set) var isEnabled: Bool = true @@ -21,13 +25,19 @@ public actor VoiceCenter { public enum VoicePlayingHandler { + nonisolated private static let log = Logger(subsystem: "ylgamehall", category: "VoicePlaying") + public static func register(on bridge: any BridgeProtocol) { // 【6】voicePlaying // 入参 int 1=允许 / 其它=静默 // cb:"voicePlaying"(字面与 handler 名相同,不是 "Response from voicePlaying") bridge.register("voicePlaying") { data, callback in - let on = (data?.asInt ?? 0) == 1 + // 兼容 H5 传 number 或 string("1" / 1 / 0 / "0")。原 asInt 实现遇到 + // string 类型会返回 nil,导致 H5 调 voicePlaying("1") 时被当作 0 关闭开关。 + let raw = data?.asLooseString ?? "" + let on = raw == "1" Task { await VoiceCenter.shared.setEnabled(on) } + log.debug("voicePlaying H5 → raw=\(raw, privacy: .public) → isEnabled=\(on, privacy: .public)") // 注意回包字面是 "voicePlaying",不是 "Response from voicePlaying"。 // 与其它 handler 的 "Response from XXX" 模式不一致是原项目历史包袱 // (daoqi/msext gameController.m:573、NewRootVC.m:451 都是 responseCallback(@"voicePlaying"))