{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "m-death-impact-small-wood-a",
  "type": "registry:block",
  "title": "M Death Impact Small Wood A",
  "author": "Kenney <https://kenney.nl>",
  "description": "M Death Impact Small Wood A sound effect.",
  "files": [
    {
      "path": "registry/soundcn/sounds/m-death-impact-small-wood-a/m-death-impact-small-wood-a.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const mDeathImpactSmallWoodASound: SoundAsset = {\n  name: \"m-death-impact-small-wood-a\",\n  dataUri: \"data:audio/mpeg;base64,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\",\n  duration: 0.435,\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.435,
    "format": "mp3",
    "sizeKb": 4,
    "license": "CC0",
    "tags": [
      "m",
      "death",
      "impact",
      "small",
      "wood",
      "a"
    ]
  },
  "categories": [
    "warcraft",
    "combat"
  ]
}