{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "jingles-steel-09",
  "type": "registry:block",
  "title": "Jingles Steel 09",
  "author": "Kenney <https://kenney.nl>",
  "description": "A brief, ascending steelpan jingle, providing a light and cheerful cue for actions like adding to cart or a quick positive confirmation.",
  "files": [
    {
      "path": "registry/soundcn/sounds/jingles-steel-09/jingles-steel-09.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const jinglesSteel09Sound: SoundAsset = {\n  name: \"jingles-steel-09\",\n  dataUri: \"data:audio/mpeg;base64,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\",\n  duration: 0.586,\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.586,
    "format": "mp3",
    "sizeKb": 5,
    "license": "CC0",
    "tags": [
      "jingles",
      "steel",
      "09"
    ],
    "keywords": [
      "steelpan",
      "metallic",
      "brief",
      "ascending",
      "light",
      "cheerful cue",
      "add to cart",
      "quick confirmation",
      "success",
      "ui feedback",
      "notification",
      "subtle",
      "bright",
      "crisp",
      "ding",
      "playful",
      "jingle"
    ]
  },
  "categories": [
    "jingles"
  ]
}