{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "footstep-snow-003",
  "type": "registry:block",
  "title": "Footstep Snow 003",
  "author": "Kenney <https://kenney.nl>",
  "description": "A crunching footstep sound on snow, suitable for indicating cold environment movement, winter exploration, or navigation in a frosty setting.",
  "files": [
    {
      "path": "registry/soundcn/sounds/footstep-snow-003/footstep-snow-003.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const footstepSnow003Sound: SoundAsset = {\n  name: \"footstep-snow-003\",\n  dataUri: \"data:audio/mpeg;base64,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xBdYjpNul21AQOLd//6v9f+v//939YAGWAAAPdCXJkQ1mQgy4UjLppDiERI+1KzQ4cAIILh36qqNAAP/+1LExAPEkB7aD+UggH6C20H8GAjCz10sDEN8CiAShu2/VZlsTIBPHsCqDX/+UMVF3SfJ0J6QgOE5M6x/HVbY4KypxG8eRfYZo///x4cfzvIiQQ1FKs5mdQ///9kljv7UxE6lUKKmQ5Tp5rdf///+JDuz4iPNXrdOuCublEuYydYFa2f/////ceBR5m99/dNRLuSmdsMqtXnrE/YobiwuP///////vHtT///////////9iwrm+kxBTUUzLjEwMFEGKquzN1gIUYUBWBlX43Vqrv/7UsTHAoTIFtyv5MCAj4PbQfw8AMBNqGAmNQFREd8FVB1YNf//KnRE8TA0VDRZ3gqWDqwaPAq49//Ep0RPEwNLDRb1gqWBoqDVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//tSxP+ADESE2BX0gAMVuyJXOPAAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+1LExQPI1FaUXDGAAAAANIAAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ==\",\n  duration: 0.371,\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.371,
    "format": "mp3",
    "sizeKb": 4,
    "license": "CC0",
    "tags": [
      "footstep",
      "snow",
      "003"
    ],
    "keywords": [
      "footstep",
      "snow",
      "crunch",
      "cold",
      "winter",
      "movement",
      "frosty",
      "walk",
      "step",
      "crisp",
      "icy",
      "outdoor",
      "progress",
      "navigation",
      "character",
      "environment",
      "short",
      "unique",
      "brisk",
      "trek",
      "frozen"
    ]
  },
  "categories": [
    "footstep"
  ]
}