{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "jingles-steel-08",
  "type": "registry:block",
  "title": "Jingles Steel 08",
  "author": "Kenney <https://kenney.nl>",
  "description": "A short and distinct steelpan jingle with a bright, quick sparkle, useful for subtle positive feedback like a successful toggle or a brief interaction.",
  "files": [
    {
      "path": "registry/soundcn/sounds/jingles-steel-08/jingles-steel-08.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const jinglesSteel08Sound: SoundAsset = {\n  name: \"jingles-steel-08\",\n  dataUri: \"data:audio/mpeg;base64,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\",\n  duration: 0.801,\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.801,
    "format": "mp3",
    "sizeKb": 7,
    "license": "CC0",
    "tags": [
      "jingles",
      "steel",
      "08"
    ],
    "keywords": [
      "steelpan",
      "metallic",
      "short",
      "distinct",
      "bright",
      "quick sparkle",
      "subtle positive",
      "successful toggle",
      "brief interaction",
      "success",
      "ui feedback",
      "notification",
      "light",
      "crisp",
      "ding",
      "cheerful",
      "jingle"
    ]
  },
  "categories": [
    "jingles"
  ]
}