{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "un-sheath-wood",
  "type": "registry:block",
  "title": "Un Sheath Wood",
  "author": "Kenney <https://kenney.nl>",
  "description": "Un Sheath Wood sound effect.",
  "files": [
    {
      "path": "registry/soundcn/sounds/un-sheath-wood/un-sheath-wood.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const unSheathWoodSound: SoundAsset = {\n  name: \"un-sheath-wood\",\n  dataUri: \"data:audio/mpeg;base64,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\",\n  duration: 0.444,\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.444,
    "format": "mp3",
    "sizeKb": 4,
    "license": "CC0",
    "tags": [
      "un",
      "sheath",
      "wood"
    ]
  },
  "categories": [
    "warcraft",
    "combat"
  ]
}