{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "i-abilities-open-a",
  "type": "registry:block",
  "title": "I Abilities Open A",
  "author": "Kenney <https://kenney.nl>",
  "description": "I Abilities Open A sound effect.",
  "files": [
    {
      "path": "registry/soundcn/sounds/i-abilities-open-a/i-abilities-open-a.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const iAbilitiesOpenASound: SoundAsset = {\n  name: \"i-abilities-open-a\",\n  dataUri: \"data:audio/mpeg;base64,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VH3j+AOs7Ncdb+CK//tSxEiAClyxM4wkZ8FKjqcwxJkZIAB/93gYP77gyO37+dD3o9Wjl3J6G1lyIAAgYHXtALCIPh2EpW6gFVLxiYctQ11lyqogbABIAbNF3gkEQ4gS8BG/SG3VMun+Vp+orsTNI6kfFTnAv0/qodPwKrdzhS2W+1v/f/40OWtwkCDQzNoeklmL6cMqaZXCxEPhEVmcg0XQqJVyVEasznpqPAgEBA6QGAgKUE6oRRAZQwsKw+EiqC4dzPz/ItnVPoxJvgyoxBbOkhWuC/l1hvUBuuP/+1LEU4BKGJU9jDBhyUyapq2kjPlkUIe6k7mHCmKMVF9iygpHJoIFApwSDlJavWs/sS5TU2MSs4uTLI1MyUUN+rIipLQU7i6lYk/XtXSo3vRY2ied1+UXIY9/nec+KAAq6AAQB4UsJFMxGrSa+bizWqrMIrKlGKPtKUeAtkFB1CKhv+KFXlKFhukmC6xNFY6kZChkIK/3ZBPLQniqLij6ctWkKebr7LT8/w8A04A1c7KZwIAVjFsabqpNNYhpos0CtI4BGREiIz0GsIul5TYKY//7UsRfgAmUay9ssMFJMY3kZZSMuUBjM21Ji22oYI6khQXB6gp4r2aN/mK+Fxrj5Ev5bfc9yz+Rrf0njLOp56VV4dq6OdKCMpcS0E3QwGOWd0yILcTNha/UDV+iT4KXWljeztP+9hmYCHxLN3v957GhEKC88Eq1/z16xQM1rJCjJWc/vm6VOasRsS6rynFNlWlQyqk105LNPAhSwUNRlZRK0dgKhmAuismpRsVQQF3q1Sn7VgZBVR1JVRpD+7lkyn+YUuDimz40baiQQpgTLVE0//tSxHECCWCtHKwYY8ktHuIBowz5sMOUCtApARJJdChUDRwBUBUFQ6IniJ5Yq6wjIw13niw8aCox5X2PPJs/r6VjPkZ5H/kf/8JcRCXEoLA0DQNA0CpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr/+1LEg4AJ9Q8GDSRjiPEB4F2DDAKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqg==\",\n  duration: 0.862,\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.862,
    "format": "mp3",
    "sizeKb": 7,
    "license": "CC0",
    "tags": [
      "i",
      "abilities",
      "open",
      "a"
    ]
  },
  "categories": [
    "warcraft",
    "ui"
  ]
}