{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "voiceover-pack-male-2",
  "type": "registry:block",
  "title": "Voiceover Pack Male 2",
  "author": "Kenney <https://kenney.nl>",
  "description": "A male voiceover stating \"two\", suitable for step-by-step instructions, numerical inputs, or turn indicators in games.",
  "files": [
    {
      "path": "registry/soundcn/sounds/voiceover-pack-male-2/voiceover-pack-male-2.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const voiceoverPackMale2Sound: SoundAsset = {\n  name: \"voiceover-pack-male-2\",\n  dataUri: \"data:audio/mpeg;base64,SUQzBAAAAAAAIlRTU0UAAAAOAAADTGF2ZjYyLjMuMTAwAAAAAAAAAAAAAAD/+1DAAAAAAAAAAAAAAAAAAAAAAABJbmZvAAAADwAAABoAABYJABISEhwcHBwlJSUlLy8vLzg4ODhCQkJCS0tLVVVVVV5eXl5oaGhocXFxcXt7e3uEhISOjo6Ol5eXl6GhoaGqqqqqtLS0tL29vb3Hx8fQ0NDQ2tra2uPj4+Pt7e3t9vb29v///wAAAABMYXZjNjIuMTEAAAAAAAAAAAAAAAAkBigAAAAAAAAWCf0aCMMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//tQxAAACSSnHiYYRYFDleTg8wzoIIA5bsSBIMAggQJk07u7u48RGNDfOHFnn/vvz/yEb9KkIQhFOc4AIDGgTh9QYWD5/E4P4PxOD4OAhDH+H4fb+IAffiQEDmoMS4Xv68AIYHWSo4yfN6QkBifwxAJQsvCA7bUlYxpSB1YwkjOFziXNKmf/nlsaU8iPfVVK1auDjXB0DWqVOHVFlGIKrZEywH4P6Qe6MurftaV1bW3vkIACsJMWhcD6LxFkZFA1X28WYkFuBYL48UHQ6vDMKP/7UsQQgA21aSUU9AABlJtwvxKyAtxcos3WmWOHXR4dni57yW5bECkycnaJVzdX+1oRSUREC7T6sqVBiQREI/eQlfZEwiTMpCIkxN1//TXLvfawMrl8ff/tz+TW7lG2rztbMoM7OjQjO7OeytMoFAgFAp1sQQQfiRQHUvMCMvKx0EDUsrHWQIJ5Ubjbvhjyg4rt3Mp7GGQHx/NzD7+t/UMNGnzQ5PXXX9+mTQ9l6BiT/////84Aw+o5/4RoLgc//+oQGD4PlKnIvKyqt3rQAAKS//tSxAUAS0Fdc/yRAAFyJvA8wYrSY1o0J2iWDSyNxmnegZznqd7oySf7tb5CMhKrS9GojLnZbuerLUVQQi3MMCRgA7aDYkaQOYQNRa9u/TV/Y2gyzLBBCq9Ht0c90agtT4gnzBOZiJeIl20SImGIuBsOZeCAgqw8L7RNCeAcxKUHS8JBzdMV944EP2XQ/6sSLih97fztknyAz2M4pPr50T1q96kpRH3bRe+tjUan/2//yWMi3GpaRcVZBBheWaNQuWWbqIiJhlsaJBKbjcXQshD/+1LEB4AMYIOD57Eo0XCLb3z2CTLiUK9VHCHIHpomHUqoB+QmheaYHgww/zv7y+27P35zbv/dW5s+SJqILgy3VqHQTCK6wo4QSSxcFkgs9e1PvUAHOQuT3v0JVHPHNOgLjj73lWAqNQqIeHd2VUiIAAJqSVDz0okBZWgc4mqQkBCDOzK1erTw3XtV6FzeOIypTUn90MgjC4ICqnmDRU8eqC2SS4TDXLA5GNlbaWg8tozU3e+akwCoXYDBoykvEkFXvelI9yrM68q6tm8SJASkJ//7UsQFgAuQWXvnsSVBWQku/Z0wQKEbRxJBvi06HUKLtgTTuqMP4CqdCPFLMbj8WeCcU09/vUjDT6kBd4HNHjjjji4FLpVcHpIXLvYea9MW2mHNTMeWS1MhEKlvMqjHtJpsW96b+YyOqpi1NMSQQE5pvBwc9ZTilS4gJnpVJatSdrWk6M87LKPlbTJxySQEJ+uiOywUbhpQsfKItG71uyLCLGm4GHYaLdGyo6Iu9VizF8DIqwZ1WONzqFmVupJWhjUgBEAGh9mj7naCFTHOoPs3//tSxAoADPDDacwwaYFkDK39h5h4eArE+7R/sn14JPzg8Wx09uNguGQSOLLnlEULPNCiB2b2zDa1yo45eXtmpFH1DzVOGaYcGlOvUcIrKlB1tIKvYxkLliRVNIevAhSzYsyw4tzAVES6A2inUiAGAAl2Gm46JWGLWcagb5zq8ekx7bRM8Hpl3LMLmtx+r8oW+FGq7SljKt85zwdfrdHtAZx8MgY041yoaD8mn9j8c0OqPK/uNH2C8Ubm8sCsHVIIWKqAQBc3URABAKMjL/VRlTL/+1LEB4AL4J1p7CRSgX0ibLmFilh5dqPPPjTQM1Pvuy3mHYi237YSuT7b3paQCWEr2mmspY0B/p9FY9DVQx4txDwxwyDEk4OMcMCqxZZin5ZSEDA9T/qUzpqDwBA7kqsMhJAxq6AFFFdAJBC6Yaj1VSeFj2pxYdb3LkEqyY7mFbdfg6v/HVAey86ObkAcaW6F8omUJPEF+3+/1MlPZKkLqCqLIN3dY1v0Ihtko6//Qrh70duBN+qcb8WDoiNHmSCiyy6KKtMDaEdUVkwuZ1DSVf/7UsQGAAvg/W3nlFZBbi+tvPCLaVDuBLb0UYtWkochS67GKLeX5X79hZGnUyYfZYBDYv8nE2GCgUGz//iHLJ/Yud3oLbMZDLcwTo3LBEtRt3/O6uLMB9u8Mfaki/7CAXHqj3Tp02Zt1AKHV2IyZCW5mKDgU4LL8q0rVYFkIb+YKqzzBH9ZgUAed9TpWlDsTc/lr/Dt8QEqf2HPf///lNAD8bLGzRBxB1wHlr6kuF3t0ph9v+f+zVkSJ//9Tn9f8HGumWrhIoicYBBcBJUJ0LbY//tSxAaACtBhceeFMiFWly05hhXgwA9fJsjzT7CF+KGzYAiItX4TmXs53uuMKmFtq9/nXtAQsikLkz/oFOSNhAoHiwBmi50QepPQ+wqGF6jllN9Zs45/1SjQA1/k4hkDFiqTAAIWd9me3CAzKq9xcjUqvHVcvBRRV8SsA4XZqPIBmZW9nFiC91nzubRj+UAOP//oftpiB2qZ7kFfPtEHv8btKvjx77qkUPQzjgg/9VT3H3+LVaIjx5pQIEVuSaKq6C3FZvIvyWLB3FiSzYMCFgj/+1LEDgAJ+Tdz55hQQUSeLrz1iWhSFPN2MuID5tBJVD6NRFeKFN//NVv0dkV9is1O2y2v/t/af9k3/X/p20scQjfyDhcIAH+vQZMd5MAQObmmN0TrJGxSWpJnAP9HnJ17DumCQPtZW2M9fRrsLHX+iVA0Ui//qBhp3+c100dmp3yLa/85W+3cjuENnTuo7RssyI/+OWbAwh/ekjJlUyEBeqscQNHAGQ15lOWlyZiBJyCOc0O2HICwt5gFegrMAn/j4RnCBQMesokaHqR54cdOLv/7UsQbgAnUXXfHlG7RSBJtePYJqE0hFOjO6ixImJxIbRq/1jxwJfrLhZp0fIOMsiiAB7E7EeshlmANkMdlOQfJiSwSheuF4/jxL/CQqg3XV4dnLl5+cmW63fKjHFgJf+rggdSl+KHoMvnVjTIXN/dx8PtCl3/0lrXfiy51P12TUVVEERR6bzLARCZggk6Rg1Z5Azzlb1KI05kgjZ2fPAg1uxSxDo522+cSoGtv/lGRvWqB3e+j0NVqXa7/0r/X6FUpm///++yEYUwt3rQN/68E//tSxCkAChk7d8ekTNE1Hq089gjwgZCIAAgMAJRMk4GXVhKoUVjpAiJZ08vMssYHBTCs8VPxRHVNNzENTzIJDhxAtm/9kdJO9ZLrr/Imn+2n/9LzCRv/8DKYP/IWFvK9j8EFZVUBCANIpVTCmlXWEMALp+ejgoCMkQEsiArYrCj3e827EB9iaP0dDnIdf/sgdmffUpjsvQnoC7v+tu9+1bIixBB59n/0IEhlPTeVfDnuRqhMTBg5RTSqbvRXjFbYZezYWk1U3kOIj4hmkSBcS/r/+1LEOAAKFPNx56RJYUalrzz0iVyoE7mQzgZ/6TRYCJX/+YE3L3QctG07lmMzAq/92/lZEdCCmCif///8EUaDZQg/oiL/UhXDB5hmRzafkc3JICw+0gh8ah6WRNdLCYqIkN4qQCm+C0vZqOc3+coKCa3+rURN6+/qvO5CK907N/t/K6GdpgxWNRv///erMMVgcfnUxP0aKCdB4EEGFJ26bG8r2jnoUAPiNooGknjAZQg4S41/r/fURE4C/ZpUYWFGEDjF/6AYxi0/Z19pmeYwXf/7UsREgAodOXfmIE6hSKYsqYSIuOxdvefX88umQ3/3/+tGUwMLi4AD3udOZjXrRCkTjOOovBU1HgEUQkXNCuLtXGY7EZw5KxOiljMG0BlFCu/VAso47Pb+Dgyaad909OV5b2ejP9iOX/2xxONZi/+tgXeATvzQI5bltUsAFUnoIrmk76nebRxCMhax1K46iJZSHY2dVVOlh2/LX2f7DUHzf0OAKHSINB6LHnP+aJwyQ2yqOTSIgWQWKibsF/bCBF9/1I1C4hFSvxkPndfoyjUA//tSxFEACaTxc4OwQfFOj2x09hywOQaYIKFl3bVlyEBV8qdAzMjhYVRqEVFGOgyMoeh72XW+hBH/qCkMVm/+OUv//3SQ4sjIru6VIq/0T/0cWIo3/Wi2UCyyoISWmPRR9uNABAFubCiLTkqR8e4MEY9qag9BEQiAHIEB+XiPVcviXUZZZlGJHBJ/6YtEBdf/QwtP/6d7m3KzK9u6fEpe1f0elkP/0/VcffbIm6r9B3f3WlkJABQF2DCpATl0mUrOCjEcV1thycAZMxMJpKePh9b/+1LEXoAJyPdhrDClgUckqzWGFLAMl/t0ZRfoQeMHZfIcBg5ChB3f+pnqn/b0r5UUxR48ERZlKf9r3/1pce6ECypGWllIKL2VACEzfhidBNWUqEQIroHeYgthSUnfR4FLV0yS+TAZdgpE2Skr9hY2b2KAYohUFvoYMEjPijk2AkSBE40/JbLPFzYE0hvpvM9ENbOVUlBrTJSqAAYUkjBiKKaKHGN6Ka6Hmk1FjG+PXOUENpHCNGWl3/zu07H7h4AWfW/+FMxpJU5se67QhbjYiv/7UsRsgAokt1esMKWBQgzrdYMJkESMUk02DiZ6IvzvN9csb9IcvIn06hcRA/n4RelQAACtxQEIBLUXErFSoWMNKEvI+yK6mmkMzkQm1wdpl5/FHLTbTOhTCj/xEUGgM40PBbUPO/TW60iKuaQNlGzTiWxnu1BSb1izGfSEt33Cu1JuABIetcSrKSZmm0X46gHweQHWWhIKfGSpaanw4rr2/4XLMk5Av9ZgQE9mYv0dPN/Rlsz8nbzQ2yDQgItMFhdXrceD6BRqHKV9UqdDrusw//tSxHmACnRfW6exDNFEi6n1hhVYOP1lUABEyWyKVlFKQkRVuMpQJwKTXysBYyqIlFiqsrlfT9O2u9yINf85CRcsepx3yjr7fyQ3Cow7fzp0qC2GwKYkoqD/wwAXRofEw2v6z6jrC5NFIaJgLfUAECS10mogAtEGsNKRvPjw50IdlmPBbq4n83p2TFbq1hiR6y7+oyTJDB//+Uyk/6oG//ZEUuf/0JKyXDxnbE8s93W18mGAmPBY1+R8UQVCFpTpBCMu9ld0SJRsD8GsIXEF+LL/+1LEhQAKPLlZp7BFkVISKrWGHLqaysagCLxHsjJbbBTl55mdazhEFA7k/sMQYKCJRj/TnP/EgCBUGi0vpSeGMNi4CJsZyMOdlw0m4sad/Dv4lXEoqlUEKX/WSbRJJnwtCqSZMi9HdDHpFWXU8zSZ1ADgiAghQ1VqioLEt/gggCCgE3nK3IP+q7S/CfpP0vefZmv/fZv0qxaBkAQQW4f/O+gtDRegxmQAFLtrG60Skii3m2hhfjgWJkWDFIJCC6uQaI4XQS5zomaoAnz+sjKIqf/7UsSPgApAw02sPKfRSRHq9PYU4v+xz7/1GKViJIyV1aYxU3eVzt//+9v8iuOFAmEyP2+/hJJ0MvSpAAAAaJV8ZwACFDzyxwwuEUCYHsRgRw2PjLBdU2Lh+yxE0vy/VvBMyEwkx9nfY7OZP+zpIR/10q7aOxmMdnmu1Jeh9F+Xy3/w8QXBDYLCj/Lf4GUAAAjMOrsvEEkChyF5QBcr6p7OdlH2DjeFcSDoxWe1x5v0+9sY/SiSNTz5QkHbtJ0cISPOBEkbccHu2IFpweAXsyNS//tSxJsAChkNWaeUTVE8IWp09BVaK6xYSlAI0N+Sd5WfLNfcxaoAExNpeI6fCKIbKAkNgZ5H3qgJxYMeQ8cBpJsNKSLynaBFsfOr26HxZhLvGgtFt+jKiEMd/9G5WKVhQWGkbIKPs1HMpSv/3+3TqXMjFYWE1+776kFUABgBPURFloMbEZJkr1gplEDPjnCKgIi8AeV5ROB/YMkP07nznQ7M/XVOYhXQQQOQZPkR3Lp7fW50KZjGBs5POSjaGCGCgQgLGZXkP3gUw9G2HKgr7C7/+1LEqQAKZQlB7DCpgUwMKD2GFSj6AjERKHZ+sYhlQclZltmkNMOde24LkPO/d+pfjMCHEg12UlEowD7m+DkPFxgAOpSt+tLX835HOjymklfysxW+R7KKmJb/2rJO+5ZsJdki3Y3dte9QBVJ7l1MOZnCWPQ5QtefVOkes/kVAbnBxpEDRLIbGU7vPsox/QdoCcbizDzqFwAaJueJWO0NTVM+SLpO+euVAQqkzDj3BkhrlxtUSGj4mwyAAIsByMWrkkdUwgkgKgVNDJ6281HVnKf/7UsSzgAqlF0HsJKmBWZooPYYI+KYM+GFWUMKdvV1Y2vo/o0zlhnrMkQKKhoqW9PrPfLP4dOtX7JE7rnts815ZbqQAgQAADCsDLAMsiyTVpqJ1kZh1Q8qpZYClXLGHlp89VaFQlkdWuWDpLDUFX5FZHWVInSx5Z0sDRY8CpFZ15IimkqVBUNB0kdCp0iEzoVOqTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//tSxLuACbzVO8wYrsE9DGmxgwmmVVVVVVWABlQoDsBDVDKZGoYGCgsLCwsKs/8WFxXi3/////WKizf/9QsKsWKigsaCor1C4qpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr/+1LEyoAJWJ8nRgBOAT0EoViUmACqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqv/7UsS5g8XsJrchgGRAAAA0gAAABKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\",\n  duration: 0.630,\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.63,
    "format": "mp3",
    "sizeKb": 6,
    "license": "CC0",
    "tags": [
      "voiceover",
      "pack",
      "male",
      "2"
    ],
    "keywords": [
      "voice",
      "male",
      "number",
      "two",
      "step",
      "instructional",
      "game",
      "turn",
      "countdown",
      "selection",
      "audio",
      "confirmation",
      "numeric",
      "clear",
      "direct",
      "informative",
      "short",
      "precise",
      "neutral",
      "sequential",
      "prompt"
    ]
  },
  "categories": [
    "voiceover"
  ]
}