{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "jingles-hit-06",
  "type": "registry:block",
  "title": "Jingles Hit 06",
  "author": "Kenney <https://kenney.nl>",
  "description": "A short and sweet jingle hit, providing immediate, positive affirmation for minor interactions like turning a page or navigating a small menu.",
  "files": [
    {
      "path": "registry/soundcn/sounds/jingles-hit-06/jingles-hit-06.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const jinglesHit06Sound: SoundAsset = {\n  name: \"jingles-hit-06\",\n  dataUri: \"data:audio/mpeg;base64,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\",\n  duration: 0.515,\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.515,
    "format": "mp3",
    "sizeKb": 5,
    "license": "CC0",
    "tags": [
      "jingles",
      "hit",
      "06"
    ],
    "keywords": [
      "jingle",
      "hit",
      "short",
      "sweet",
      "immediate",
      "positive",
      "affirmation",
      "minor",
      "interaction",
      "page",
      "turn",
      "menu",
      "navigate",
      "ui",
      "game",
      "notification",
      "alert",
      "ding",
      "chime",
      "feedback",
      "subtle",
      "light"
    ]
  },
  "categories": [
    "jingles"
  ]
}