{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "chips-handle-5",
  "type": "registry:block",
  "title": "Chips Handle 5",
  "author": "Kenney <https://kenney.nl>",
  "description": "A more extensive sound of chips being handled, perfect for a longer animation involving item organization, a complex drag-and-drop, or a dealer shuffling cards.",
  "files": [
    {
      "path": "registry/soundcn/sounds/chips-handle-5/chips-handle-5.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const chipsHandle5Sound: SoundAsset = {\n  name: \"chips-handle-5\",\n  dataUri: \"data:audio/mpeg;base64,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\",\n  duration: 0.834,\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.834,
    "format": "mp3",
    "sizeKb": 7,
    "license": "CC0",
    "tags": [
      "chips",
      "handle",
      "5"
    ],
    "keywords": [
      "complex drag-and-drop",
      "item organization",
      "shuffling",
      "ui interaction",
      "game ui",
      "handling",
      "tactile",
      "game",
      "tokens",
      "pieces",
      "inventory",
      "extended",
      "realistic",
      "detailed",
      "process",
      "manage",
      "organize",
      "immersive",
      "full"
    ]
  },
  "categories": [
    "chips"
  ]
}