{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "jingles-sax-15",
  "type": "registry:block",
  "title": "Jingles Sax 15",
  "author": "Kenney <https://kenney.nl>",
  "description": "A smooth, concise saxophone jingle with a clear, positive chime, excellent for confirming a selection, a successful toggle, or a correct input.",
  "files": [
    {
      "path": "registry/soundcn/sounds/jingles-sax-15/jingles-sax-15.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const jinglesSax15Sound: SoundAsset = {\n  name: \"jingles-sax-15\",\n  dataUri: \"data:audio/mpeg;base64,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\",\n  duration: 0.604,\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.604,
    "format": "mp3",
    "sizeKb": 5,
    "license": "CC0",
    "tags": [
      "jingles",
      "sax",
      "15"
    ],
    "keywords": [
      "saxophone",
      "brass",
      "jazz",
      "smooth",
      "concise",
      "clear",
      "positive chime",
      "confirm selection",
      "successful toggle",
      "correct input",
      "success",
      "ui feedback",
      "subtle",
      "elegant",
      "warm",
      "short",
      "notification",
      "jingle"
    ]
  },
  "categories": [
    "jingles"
  ]
}