{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "laser-retro-000",
  "type": "registry:block",
  "title": "Laser Retro 000",
  "author": "Kenney <https://kenney.nl>",
  "description": "A classic, short 'pew' laser sound reminiscent of retro arcade games, perfect for simple clicks or playful sci-fi interactions.",
  "files": [
    {
      "path": "registry/soundcn/sounds/laser-retro-000/laser-retro-000.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const laserRetro000Sound: SoundAsset = {\n  name: \"laser-retro-000\",\n  dataUri: \"data:audio/mpeg;base64,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\",\n  duration: 0.236,\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.236,
    "format": "mp3",
    "sizeKb": 2,
    "license": "CC0",
    "tags": [
      "laser",
      "retro",
      "000"
    ],
    "keywords": [
      "laser",
      "retro",
      "arcade",
      "pew",
      "classic",
      "short",
      "sci-fi",
      "game",
      "click",
      "button",
      "select",
      "interaction",
      "electronic",
      "synthetic",
      "playful",
      "minimal",
      "digital",
      "simple",
      "light"
    ]
  },
  "categories": [
    "laser"
  ]
}