{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "orc-male-raspberry-01",
  "type": "registry:block",
  "title": "Orc Male Raspberry 01",
  "author": "Kenney <https://kenney.nl>",
  "description": "Orc Male Raspberry 01 sound effect.",
  "files": [
    {
      "path": "registry/soundcn/sounds/orc-male-raspberry-01/orc-male-raspberry-01.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const orcMaleRaspberry01Sound: SoundAsset = {\n  name: \"orc-male-raspberry-01\",\n  dataUri: \"data:audio/mpeg;base64,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\",\n  duration: 0.794,\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.794,
    "format": "mp3",
    "sizeKb": 7,
    "license": "CC0",
    "tags": [
      "orc",
      "male",
      "raspberry",
      "01"
    ]
  },
  "categories": [
    "warcraft",
    "voice"
  ]
}