{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "voiceover-pack-male-set",
  "type": "registry:block",
  "title": "Voiceover Pack Male Set",
  "author": "Kenney <https://kenney.nl>",
  "description": "A male voiceover stating \"Set!\", ideal for the middle stage of a countdown, indicating readiness before a final \"Go!\".",
  "files": [
    {
      "path": "registry/soundcn/sounds/voiceover-pack-male-set/voiceover-pack-male-set.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const voiceoverPackMaleSetSound: SoundAsset = {\n  name: \"voiceover-pack-male-set\",\n  dataUri: \"data:audio/mpeg;base64,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AAwhdWvnpEnBmC0tfPSJqLVgLec9BQEh4aLgdY2jHEgG4WeRCqzmI07AOl+lS3K71eqgXCCnXPCqtUQQTZAAdATlqdayRiyBPwsJznUmD+EkgE1QpJC31p88EyzoEue2ndXrT8d4Ucn1v6oDlEQm5Upv//72q6rVTnculGK2U7xrEZUkJYcUeZqEyVf8mslrsFxZtkUDo86qOnIxLUAAcCk7koYBdSgOkxi4HjGVJ9l8V7coEiRpCW1CDTf7O9OEGw9JBchh8/GzFByG//tSxHaAC2RjZaexJwF+mix09hVwrZX//9dHqxAaBXaA2ElRRa2q1grkjrvoqgHyUljH0u86t7iwvdP8oCiSbkigHjshlMkhUWURUfPjs9KyphG2tomJJY5iV4g3k5OyaFY3/SDzEFf/S2/T+jpcr51V+rmQ2FQf7MJPgIJ9bY0XnkkaqP0NCqs4MQ1y3UWWLaxkgytuSYTJdp08cK7O0Ww/mBD2ptlVNYVUDWAwEot7+0iupL+DgShcNkNbdr//+bRDZi6LXVXocirZt//8ePv/+1LEdwAK1LVjp6RNQVQYbSjDClp65VbCqBV9tzfmEN0IFKW0XNECCa023YKywA45AUBA+JyIcVhfDoVlJ5Y1eJlFF8FStypiQSQy7EMdv2Vf/r9akZ3LQ3VJFZ6GRAIdLS0SIJX9Nm3Xfgq53M91qj2neplkmLphAGey7U7xn3CNrB1nIaRejnSCOGQCkgnwzdYQpIm4IUpd5kILGI7UUc4hwx27W//L+Vk2VqBnCng8lP1OoqtIqcWSiHDzIiIpO9b/VZV0qNS2skF1ttiVTv/7UsR/AAoY8W+njO8RP5mr9MGKGsalSYXpcXE/cp1gJAph+HGyYeUSuWg6vqWYcKz1Yo5wQorqfCq37Ffp8pd7q0qoFaInh0aSDpKS54i5iQDFlYiHpAtQtUeXt3UampQPZAlJ2FMjSDLtUvSirw3Jz95OJEi83+fLaaRAJJRLeFFZatRjdn1Y00rGrqilzKzlLOBDtb1u2YCg0VnRKsBPiVn0f/iVT7wAC4MFCCxhQUE5rDJlBWl+1jn/yy33KGBgyHZ//oq/oq/otn8WAxI+//tSxIyACmSzVeekSsFKFqj08wliLC/XxYXEdYq3Fm+PZFRTUSGaQVFTJkW1iooqTEFNRTMuMTAwqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr/+1LEl4AJWLcpJ5hHwQmWnkgxDtiqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqg==\",\n  duration: 0.542,\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.542,
    "format": "mp3",
    "sizeKb": 5,
    "license": "CC0",
    "tags": [
      "voiceover",
      "pack",
      "male",
      "set"
    ],
    "keywords": [
      "voice",
      "male",
      "set",
      "prepare",
      "ready",
      "countdown",
      "pre-game",
      "action",
      "prompt",
      "game",
      "anticipation",
      "instructional",
      "audio",
      "clear",
      "direct",
      "waiting",
      "poised",
      "prepare",
      "stage",
      "command"
    ]
  },
  "categories": [
    "voiceover"
  ]
}