{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "coin-collect",
  "type": "registry:block",
  "title": "Coin Collect",
  "author": "Kenney <https://kenney.nl>",
  "description": "A cheerful, distinct sound of a coin being collected, perfect for rewarding players in a game or marking a successful item pickup.",
  "files": [
    {
      "path": "registry/soundcn/sounds/coin-collect/coin-collect.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const coinCollectSound: SoundAsset = {\n  name: \"coin-collect\",\n  dataUri: \"data:audio/mpeg;base64,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hAgoSCGKYBlYqlodf+FMzf7sWFD3aav7k2n9Xxey527///y4PuUYAd4//n1jDhayoJS90MITAt2HfAr/+1LEM4AKMJ9R7TRQcUGgJ7W2CUjeLOAyTj0+d9TN/Ct2R5UYlAaujGZLP/QwciML9FcyGdQjaEZaPKtPJ+rp8lu1cUEDbqvb/cvf/rgQSAQQAGV8fbGRoCVyCDXgctnEFGInGI+wYaAJeqRMmlvWen6zn/nOHd5WY0Jcqt/owNHm6SW35FTNM6pImpX9r3+RP1lI53+n///7f+v//LBoBsOyjAVoF1rkjQiOFmIMDsNLYsceKWTUpppL7SkCWf//lDKu8ACiUWjFlH1pMT7+Cf/7UsRAgApVhzXtcEaBOqBotZGJskwvzszXn2d6M1EyHLzEua831TKyO3yhVDmpH0/o//QEKnYA9tv/pdaCQrsR1wwD/IhgHKpC2c4H8S4f/3+0YBAXKWgWKCCp1CYwlZxjkK8//wrO/fJlz/+1nZZxlRa597nW+f/ZzKNn/WBbiNadv///ws4wXrttq5bEV94yigjKaaOgs5PqlOh/DE2U/1+gqsbhZ1fjLDtGoWK8CISr5nVO5O1MMGXXoiy+qkd6lxWp+DUiqYjX5FCBZva0//tSxE2ACi0HT6eYbVFOICk1hgkyjCzLf//3/6oEJUyErbddXJGBDlHfqR1doZJlzFpuHdQPzbdDJbXeS9Jpr7u1QpMJMggrbeH6upUTtdoWYVFKujVor+jytbTvyxxDUOdOpCClfWtziqT31f///A5MECOSzVwpEANKvap6AxOEtQ6/MEWndUbXMRVkmY2ZQNn5A2+p5jWe6S9LWS5f6jxViO6tzbde9Tzr0d/57K9f3v700KHf9b9P9v/7f//2YqwBBEXqKDrtt+uUkYAw9YX/+1LEWQAKWQFDrBitkU6wpfWEHXjJ+CBD+Z0A3Yq0RZe/SyDgCR4nWdT6QcGbijIwkfb9VExAnVqndbVaTUiMV9e2Wjujt1KjqR1qh0xzjj/7e////1///6hgDhIwABCKcpBAAhiP8pMhSs4h1QxozdyPqHjE7tPFwtOxzSyo5+b/URA9Gy/pMTru9yrz1zNKms6KtNke/dJ1tScenL//bq9Xp/V/K///6DIQgBQRA5UJmv9GK0AAkAloAMAYs0gVRrWGtddr+1bWDmmjvVav4f/7UsRjgAp1hTWnjKvBSzCk8PGpOH14v///cWObUWp0qdsVWvJ4hGIWhWWG81r5vifxC////f5/v+n/zgiGwuEUiAugBhGudNGIwkEnlmpX1lv9f/+s38wirPcqf///b2VjSzK2lv/zJ+5ZZrdHKxlbRWR1ZPlQ0qlQyiok5at1YBiAEERwtiiVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//tSxG4ACZWFKUQE/sEasKDU8JRZVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU=\",\n  duration: 0.441,\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.441,
    "format": "mp3",
    "sizeKb": 4,
    "license": "CC0",
    "tags": [
      "coin",
      "collect",
      "reward",
      "achievement",
      "game",
      "digital"
    ],
    "keywords": [
      "coin",
      "collect",
      "reward",
      "pickup",
      "item",
      "treasure",
      "score",
      "gain",
      "achievement",
      "game",
      "arcade",
      "retro",
      "positive",
      "cheerful",
      "satisfying",
      "success",
      "digital",
      "jingle",
      "prize"
    ]
  },
  "categories": [
    "game-8bit"
  ]
}