{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "handle-coins",
  "type": "registry:block",
  "title": "Handle Coins",
  "author": "Kenney <https://kenney.nl>",
  "description": "The sound of multiple coins being handled or gathered, ideal for indicating currency collection, item acquisition, or a successful monetary transaction in a game or app.",
  "files": [
    {
      "path": "registry/soundcn/sounds/handle-coins/handle-coins.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const handleCoinsSound: SoundAsset = {\n  name: \"handle-coins\",\n  dataUri: \"data:audio/mpeg;base64,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0OUqJVZ2iIMAAADw//tSxASAiiTHPfw0gAE6maUgNI5xGJ0RH2sOUKAk0Kep/aqaxpEWREz8Z1ChFJKSx638pStMhEIqDREi2aqGO+8jf///WlKVdTvklWzuaS0WkSzQKpPHc33hYCFXiQVoAhmJDCr/GK6dKgNY8QkXlQWbPJlswmKgZyXFM3qsnB4LAuSoQfCJEaPlcl+mhxqUvuxZitNMluTWkqbECytkIIsHSHNhUaVh9c9/6gBpYAACBH2zEG34/m5f7/jxqSCZ0mHkQxFBO6UcGSOI5nI1C8H/+1LEEoCJiNEjIyTaASqaY+Rgj4AwBkgeJtmctWoxnWXMe3aFu1Pj3hmmfsEESOrRUcSqjwSPbrP///qAACgGUqPpAqYv+Yfbb+zFqlGjeQ8g+lFGkRp4Sq0Ye2QlnrRtWlA5TIPBXgNh0YCZNqUtcMHRSGqjNfLoQZcxYjd/q/60tL9f/9MJzo+kVJGF7qpdmf7e1CDbdQ1HEsiC86haYak2xwhFVogPVWkpgLSkUFj1vpbgzT1wV9qYYxISCo0kNA6Sim3yxOQe5+r9HrP1jf/7UsQlAglAvxokmGnBLJojVJMM+A1WGjRGMnXNL8zxNy+1ntk8xkJErjoezz2cm0NRSk4sAVSzx2Y+6bhQwyE5s8NtZ0iJn6VBNUmENhgphm7fM9SbuFf3d/TXj2chiioiDYhHy4bYkvd/lZXRFhXUKEdk6Nvri6UYWQBy//S4I4FI2OCjOZ5lj6AnO0ue/UpSL/OSOb6imhAaQZJFkssfofFfp8k/2kP5X/SC20osajhx4he1Rbo6o4FUgRJgMFBrqCMNqXVQ5kKyOU26UaCl//tSxDgCCWTNGASYa4EEj6OkYozoA0aNA0SW58SlQ6pM8HSySs1/ErEP/7//ps/qayoQAZqkBFhiRYmqxqjUlBOTLqwIPBUYBRY0FcKgIkDJJ9foCQFI/rIhIeVEboSBIk+LliT4saZWkWAv8KmQl0M+PdyQVASaTEFNRTMuMTAwqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr/+1LET4PIsDj+QZhiQAAANIAAAASqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqg==\",\n  duration: 0.846,\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.846,
    "format": "mp3",
    "sizeKb": 7,
    "license": "CC0",
    "tags": [
      "handle",
      "coins"
    ],
    "keywords": [
      "coins",
      "money",
      "currency",
      "jingle",
      "clink",
      "collect",
      "gather",
      "transaction",
      "acquisition",
      "game",
      "success",
      "reward",
      "inventory",
      "loot",
      "exchange",
      "financial",
      "positive",
      "metallic",
      "wealth",
      "purchase"
    ]
  },
  "categories": [
    "handle"
  ]
}