{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "pep-sound-1",
  "type": "registry:block",
  "title": "Pep Sound 1",
  "author": "Kenney <https://kenney.nl>",
  "description": "A bright, energetic \"pep\" sound, perfect for encouraging positive actions or indicating a small boost in a game or app.",
  "files": [
    {
      "path": "registry/soundcn/sounds/pep-sound-1/pep-sound-1.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const pepSound1Sound: SoundAsset = {\n  name: \"pep-sound-1\",\n  dataUri: \"data:audio/mpeg;base64,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\",\n  duration: 0.520,\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.52,
    "format": "mp3",
    "sizeKb": 5,
    "license": "CC0",
    "tags": [
      "pep",
      "sound",
      "1"
    ],
    "keywords": [
      "pep",
      "energetic",
      "bright",
      "positive",
      "boost",
      "game ui",
      "reward",
      "encouragement",
      "success",
      "power-up",
      "cheer",
      "achievement",
      "light",
      "playful",
      "quick",
      "collect",
      "perk",
      "gain",
      "short",
      "happy"
    ]
  },
  "categories": [
    "pep"
  ]
}