{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "jingles-sax-05",
  "type": "registry:block",
  "title": "Jingles Sax 05",
  "author": "Kenney <https://kenney.nl>",
  "description": "A concise saxophone jingle with a smooth, affirming tone, useful for confirming simple actions like toggling a setting or a successful input.",
  "files": [
    {
      "path": "registry/soundcn/sounds/jingles-sax-05/jingles-sax-05.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const jinglesSax05Sound: SoundAsset = {\n  name: \"jingles-sax-05\",\n  dataUri: \"data:audio/mpeg;base64,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AwjkZRItZOUBJYvhxYyU4K2NIIQ5ak1+fZIj7ugIXK+pUA6hF8uQ7vkO3KrlwKZxTrHqUp97/OjSAXEVXIggsKKRHWjCOmXgz63GCtBm4jbQLXsULoc3zQ1an1ttii7GX87h+gAEaCkhCh/EBAEoSkuwuTwKOJWRSCwJMItxZ4lApFTz2GngqIstDvaPGfyWIvcMeIcFQV3c6elkd22Gttv1/s/KgqoxEdQGzIqCoLAaBowRkhtzTINCQ0DIVFhY0/4qZGCwuKmTIszU//tSxH6DCWxhDAy8qoEkiqHFhg0YLioqKiosaNBUUEhoCiosSNBUUFv////rFuKf/iwrTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+1LEkgMIJC8IR5koQRMEV8iTpMBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ==\",\n  duration: 0.462,\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.462,
    "format": "mp3",
    "sizeKb": 4,
    "license": "CC0",
    "tags": [
      "jingles",
      "sax",
      "05"
    ],
    "keywords": [
      "saxophone",
      "brass",
      "jazz",
      "concise",
      "smooth",
      "affirming",
      "toggle setting",
      "successful input",
      "confirmation",
      "positive",
      "ui feedback",
      "subtle",
      "warm",
      "elegant",
      "clear",
      "complete",
      "notification",
      "jingle"
    ]
  },
  "categories": [
    "jingles"
  ]
}