{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "pep-sound-5",
  "type": "registry:block",
  "title": "Pep Sound 5",
  "author": "Kenney <https://kenney.nl>",
  "description": "A short, bright \"pep\" sound, suitable for quick, positive feedback on user actions or small in-game rewards.",
  "files": [
    {
      "path": "registry/soundcn/sounds/pep-sound-5/pep-sound-5.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const pepSound5Sound: SoundAsset = {\n  name: \"pep-sound-5\",\n  dataUri: \"data:audio/mpeg;base64,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\",\n  duration: 0.624,\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.624,
    "format": "mp3",
    "sizeKb": 5,
    "license": "CC0",
    "tags": [
      "pep",
      "sound",
      "5"
    ],
    "keywords": [
      "pep",
      "short",
      "bright",
      "positive",
      "feedback",
      "game ui",
      "reward",
      "user action",
      "encouragement",
      "quick",
      "crisp",
      "cheerful",
      "light",
      "collect",
      "perk",
      "gain",
      "achievement",
      "brief"
    ]
  },
  "categories": [
    "pep"
  ]
}