{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "war-hold",
  "type": "registry:block",
  "title": "War Hold",
  "author": "Kenney <https://kenney.nl>",
  "description": "A short, sharp vocal command \"Hold\", ideal for tactical game scenarios to pause movement or maintain a position.",
  "files": [
    {
      "path": "registry/soundcn/sounds/war-hold/war-hold.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const warHoldSound: SoundAsset = {\n  name: \"war-hold\",\n  dataUri: \"data:audio/mpeg;base64,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\",\n  duration: 0.493,\n  format: \"mp3\",\n  license: \"CC0\",\n  author: \"Kenney\",\n};\n",
      "type": "registry:lib"
    },
    {
      "path": "registry/soundcn/lib/sound-types.ts",
      "content": "export interface SoundAsset {\r\n  /** Unique identifier for the sound */\r\n  name: string;\r\n  /** Base64-encoded data URI (data:audio/mpeg;base64,...) */\r\n  dataUri: string;\r\n  /** Duration in seconds */\r\n  duration: number;\r\n  /** Audio format */\r\n  format: \"mp3\" | \"wav\" | \"ogg\";\r\n  /** License identifier */\r\n  license: \"CC0\" | \"OGA-BY\" | \"MIT\";\r\n  /** Original author/creator */\r\n  author: string;\r\n}\r\n\r\nexport interface UseSoundOptions {\r\n  /** Volume level from 0 to 1. Default: 1 */\r\n  volume?: number;\r\n  /** Playback speed multiplier. Default: 1 */\r\n  playbackRate?: number;\r\n  /** If true, calling play() stops current playback first. Default: false */\r\n  interrupt?: boolean;\r\n  /** If false, play() does nothing. Useful for user preferences. Default: true */\r\n  soundEnabled?: boolean;\r\n  /** Called when playback starts */\r\n  onPlay?: () => void;\r\n  /** Called when playback ends naturally */\r\n  onEnd?: () => void;\r\n  /** Called when pause() is called */\r\n  onPause?: () => void;\r\n  /** Called when stop() is called */\r\n  onStop?: () => void;\r\n}\r\n\r\nexport type PlayFunction = (overrides?: {\r\n  volume?: number;\r\n  playbackRate?: number;\r\n}) => void;\r\n\r\nexport interface SoundControls {\r\n  stop: () => void;\r\n  pause: () => void;\r\n  isPlaying: boolean;\r\n  duration: number | null;\r\n  sound: SoundAsset;\r\n}\r\n\r\nexport type UseSoundReturn = readonly [PlayFunction, SoundControls];\r\n",
      "type": "registry:lib"
    },
    {
      "path": "registry/soundcn/lib/sound-engine.ts",
      "content": "let audioContext: AudioContext | null = null;\nconst bufferCache = new Map<string, AudioBuffer>();\n\nexport function getAudioContext(): AudioContext {\n  if (!audioContext) {\n    audioContext = new AudioContext();\n  }\n  return audioContext;\n}\n\nexport async function decodeAudioData(dataUri: string): Promise<AudioBuffer> {\n  const cached = bufferCache.get(dataUri);\n  if (cached) return cached;\n\n  const ctx = getAudioContext();\n  const base64 = dataUri.split(\",\")[1];\n  const binaryString = atob(base64);\n  const bytes = new Uint8Array(binaryString.length);\n  for (let i = 0; i < binaryString.length; i++) {\n    bytes[i] = binaryString.charCodeAt(i);\n  }\n\n  const audioBuffer = await ctx.decodeAudioData(bytes.buffer.slice(0));\n  bufferCache.set(dataUri, audioBuffer);\n  return audioBuffer;\n}\n\nexport interface PlaySoundOptions {\n  volume?: number;\n  playbackRate?: number;\n  onEnd?: () => void;\n}\n\nexport interface SoundPlayback {\n  stop: () => void;\n}\n\nexport async function playSound(\n  dataUri: string,\n  options: PlaySoundOptions = {}\n): Promise<SoundPlayback> {\n  const { volume = 1, playbackRate = 1, onEnd } = options;\n  const ctx = getAudioContext();\n  if (ctx.state === \"suspended\") {\n    await ctx.resume();\n  }\n\n  const buffer = await decodeAudioData(dataUri);\n  const source = ctx.createBufferSource();\n  const gain = ctx.createGain();\n\n  source.buffer = buffer;\n  source.playbackRate.value = playbackRate;\n  gain.gain.value = volume;\n\n  source.connect(gain);\n  gain.connect(ctx.destination);\n\n  source.onended = () => {\n    onEnd?.();\n  };\n\n  source.start(0);\n\n  return {\n    stop: () => {\n      try {\n        source.stop();\n      } catch {\n        // No-op if already stopped.\n      }\n    },\n  };\n}\n",
      "type": "registry:lib"
    }
  ],
  "meta": {
    "duration": 0.493,
    "format": "mp3",
    "sizeKb": 4,
    "license": "CC0",
    "tags": [
      "war",
      "hold"
    ],
    "keywords": [
      "command",
      "vocal",
      "war",
      "hold",
      "stop",
      "pause",
      "tactical",
      "game",
      "military",
      "strategy",
      "urgent",
      "short",
      "direct",
      "firm",
      "action",
      "alert",
      "defensive",
      "stand ground",
      "halt",
      "order"
    ]
  },
  "categories": [
    "war"
  ]
}