{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "voiceover-pack-female-war-rpg",
  "type": "registry:block",
  "title": "Voiceover Pack Female War Rpg",
  "author": "Kenney <https://kenney.nl>",
  "description": "A female voice warns \"RPG!\", suitable for alerting players to an incoming rocket-propelled grenade in a combat game.",
  "files": [
    {
      "path": "registry/soundcn/sounds/voiceover-pack-female-war-rpg/voiceover-pack-female-war-rpg.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const voiceoverPackFemaleWarRpgSound: SoundAsset = {\n  name: \"voiceover-pack-female-war-rpg\",\n  dataUri: \"data:audio/mpeg;base64,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\",\n  duration: 0.787,\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.787,
    "format": "mp3",
    "sizeKb": 7,
    "license": "CC0",
    "tags": [
      "voiceover",
      "pack",
      "female",
      "war",
      "rpg"
    ],
    "keywords": [
      "voiceover",
      "female",
      "war",
      "rpg",
      "rocket",
      "grenade",
      "warning",
      "danger",
      "tactical",
      "alert",
      "combat",
      "game",
      "instruction",
      "military",
      "explosive",
      "threat",
      "projectile",
      "weapon",
      "incoming",
      "critical",
      "hazard"
    ]
  },
  "categories": [
    "voiceover"
  ]
}