{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "impact-soft-heavy-004",
  "type": "registry:block",
  "title": "Impact Soft Heavy 004",
  "author": "Kenney <https://kenney.nl>",
  "description": "A very deep, slightly muffled heavy impact, excellent for significant but muted UI events, like saving large data or a section completely loading.",
  "files": [
    {
      "path": "registry/soundcn/sounds/impact-soft-heavy-004/impact-soft-heavy-004.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const impactSoftHeavy004Sound: SoundAsset = {\n  name: \"impact-soft-heavy-004\",\n  dataUri: \"data:audio/mpeg;base64,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\",\n  duration: 0.498,\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.498,
    "format": "mp3",
    "sizeKb": 5,
    "license": "CC0",
    "tags": [
      "impact",
      "soft",
      "heavy",
      "004"
    ],
    "keywords": [
      "impact",
      "soft",
      "heavy",
      "deep",
      "muffled",
      "significant event",
      "save data",
      "section load",
      "ui feedback",
      "gentle",
      "thud",
      "subtle",
      "completion",
      "progress",
      "background",
      "solid",
      "weighty",
      "low frequency",
      "interface",
      "system"
    ]
  },
  "categories": [
    "impact"
  ]
}