Files
bot/apps/macos/Sources/Bot/VoiceWakeChime.swift
zeekay 4bdc9ee3e4 chore: rebrand openclaw → hanzo-bot for bridge merge
Comprehensive rename of all openclaw references to hanzo-bot equivalents:
- Package: openclaw → @hanzo/bot
- Binary: openclaw → hanzo-bot
- Types: OpenClaw* → Bot*
- Env vars: OPENCLAW_* → BOT_*
- Android: ai.openclaw.android → ai.hanzo.bot.android
- iOS/macOS: ai.openclaw.* → ai.hanzo.*
- Swift modules: OpenClaw* → Bot*
- Plugins: openclaw.plugin.json → bot.plugin.json
- Paths: .openclaw/ → .hanzo/bot/
- URLs: github.com/openclaw → github.com/hanzoai
2026-02-26 22:36:01 -08:00

77 lines
2.0 KiB
Swift

import AppKit
import Foundation
import OSLog
enum VoiceWakeChime: Codable, Equatable, Sendable {
case none
case system(name: String)
case custom(displayName: String, bookmark: Data)
var systemName: String? {
if case let .system(name) = self {
return name
}
return nil
}
var displayLabel: String {
switch self {
case .none:
"No Sound"
case let .system(name):
VoiceWakeChimeCatalog.displayName(for: name)
case let .custom(displayName, _):
displayName
}
}
}
enum VoiceWakeChimeCatalog {
/// Options shown in the picker.
static var systemOptions: [String] {
SoundEffectCatalog.systemOptions
}
static func displayName(for raw: String) -> String {
SoundEffectCatalog.displayName(for: raw)
}
static func url(for name: String) -> URL? {
SoundEffectCatalog.url(for: name)
}
}
@MainActor
enum VoiceWakeChimePlayer {
private static let logger = Logger(subsystem: "ai.hanzo.bot", category: "voicewake.chime")
private static var lastSound: NSSound?
static func play(_ chime: VoiceWakeChime, reason: String? = nil) {
guard let sound = self.sound(for: chime) else { return }
if let reason {
self.logger.log(level: .info, "chime play reason=\(reason, privacy: .public)")
} else {
self.logger.log(level: .info, "chime play")
}
DiagnosticsFileLog.shared.log(category: "voicewake.chime", event: "play", fields: [
"reason": reason ?? "",
"chime": chime.displayLabel,
"systemName": chime.systemName ?? "",
])
SoundEffectPlayer.play(sound)
}
private static func sound(for chime: VoiceWakeChime) -> NSSound? {
switch chime {
case .none:
nil
case let .system(name):
SoundEffectPlayer.sound(named: name)
case let .custom(_, bookmark):
SoundEffectPlayer.sound(from: bookmark)
}
}
}