{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "impact-plate-heavy-003",
  "type": "registry:block",
  "title": "Impact Plate Heavy 003",
  "author": "Kenney <https://kenney.nl>",
  "description": "This sound delivers a sharp, heavy metal plate impact, perfect for marking a crucial, impactful decision or a strong enemy hit in a game.",
  "files": [
    {
      "path": "registry/soundcn/sounds/impact-plate-heavy-003/impact-plate-heavy-003.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const impactPlateHeavy003Sound: SoundAsset = {\n  name: \"impact-plate-heavy-003\",\n  dataUri: \"data:audio/mpeg;base64,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\",\n  duration: 0.344,\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.344,
    "format": "mp3",
    "sizeKb": 3,
    "license": "CC0",
    "tags": [
      "impact",
      "plate",
      "heavy",
      "003"
    ],
    "keywords": [
      "impact",
      "plate",
      "heavy",
      "sharp",
      "metal",
      "crucial decision",
      "enemy hit",
      "game feedback",
      "strong",
      "forceful",
      "clank",
      "thud",
      "deep",
      "powerful",
      "alert",
      "ui error",
      "confirmation",
      "decisive",
      "strike",
      "collision"
    ]
  },
  "categories": [
    "impact"
  ]
}