{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "jingles-hit-16",
  "type": "registry:block",
  "title": "Jingles Hit 16",
  "author": "Kenney <https://kenney.nl>",
  "description": "A percussive jingle hit, offering a distinct and upbeat confirmation for user actions in a playful or dynamic interface.",
  "files": [
    {
      "path": "registry/soundcn/sounds/jingles-hit-16/jingles-hit-16.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const jinglesHit16Sound: SoundAsset = {\n  name: \"jingles-hit-16\",\n  dataUri: \"data:audio/mpeg;base64,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\",\n  duration: 0.290,\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.29,
    "format": "mp3",
    "sizeKb": 3,
    "license": "CC0",
    "tags": [
      "jingles",
      "hit",
      "16"
    ],
    "keywords": [
      "jingle",
      "hit",
      "percussive",
      "distinct",
      "upbeat",
      "confirm",
      "user",
      "action",
      "playful",
      "dynamic",
      "ui",
      "game",
      "notification",
      "alert",
      "ding",
      "chime",
      "pop",
      "feedback",
      "positive",
      "short",
      "energetic",
      "rhythmic"
    ]
  },
  "categories": [
    "jingles"
  ]
}