{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "impact-plank-medium-004",
  "type": "registry:block",
  "title": "Impact Plank Medium 004",
  "author": "Kenney <https://kenney.nl>",
  "description": "A clean, medium wooden hit, ideal for providing clear feedback for button presses, object placements, or general interactive elements within a themed application.",
  "files": [
    {
      "path": "registry/soundcn/sounds/impact-plank-medium-004/impact-plank-medium-004.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const impactPlankMedium004Sound: SoundAsset = {\n  name: \"impact-plank-medium-004\",\n  dataUri: \"data:audio/mpeg;base64,SUQzBAAAAAAAIlRTU0UAAAAOAAADTGF2ZjYyLjMuMTAwAAAAAAAAAAAAAAD/+1DAAAAAAAAAAAAAAAAAAAAAAABJbmZvAAAADwAAAB8AABoeAA8PDxcXFx8fHycnJy8vLy83Nzc/Pz9HR0dPT09PV1dXX19fZ2dnb29vd3d3d39/f4eHh4+Pj5eXl5efn5+np6evr6+3t7e/v7+/x8fHz8/P19fX39/f3+fn5+/v7/f39////wAAAABMYXZjNjIuMTEAAAAAAAAAAAAAAAAkAw4AAAAAAAAaHpvyqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//tQxAAACVhPW3TxgAGNlW2XMIAAAAAgAADmg6P8W8TchZ1x/e97/PzdE3AwMDF7vAgAAABOAAAACHlAQBMH38oCBwHAQ8EAQDBR3/y4IAgc+oH3/icEAQ/4IBjy4IBgAUHg9gZ2FQBYDQxkqA9DR813TcTkEEsnh6HqZ/QhBEk0eQLA8WqB0f0E40sUZ6MIXQSCkNY3Q+ZJQbSChZY1GnlHi+O6h1VDx0BOsSfODQKhTt2R2KbYpV6fQGGBRqBL3//0qgEAAtSj59qiOUuL9v/7UsQGAgt8XVzdhgABf47pybwYeNbWvEZU7stbvH4vfnqsYRF0VHqF3zbKf+rd2vu9tNzKNHjojGgYDQLHoizRdrDwaEtISXgZLyRHqHlhESCgKuNRrntW0NFTHom/5F3iW2naULTDhCcqqG/swcrFGjKE4gkqEkiPfXUjw0/GApDK6lt8YzAMYnvCjUWqteH0z7MoPhoMl9+WaSZ8ODyyo0NQmMPBIqOeyWPCKWM1PE3UGioK/DRKVU+V/8ROnZ6dlT2qAAEgBJxtgQrZzscd//tSxAYCC7TNR028ZaFqGueNvSA4KIGNALCQUahspp8WBoCOiknnKf1YLvpNZYo8a4kSKZDsYPRImdLoEJPl+Op8HM/9vUyUsszzaUs6T1fsY+iXee3iU7dfkmQmCpKx3vesYZIA0An/gKYJXmntxlEZyh5vjYIEigxuS0mzvU0hJRGNgLKIFjM/g+jpiO2e4VENJOvuEYYL1tGME5BL/5IpXBQvFfqvKx8WiBtSbqoa9uR88f/Gw5TT////////9tUAG2AAxhNTmByOfIMMEIb/+1LEB4MMCN0wbjztQUSU5k22FeIUTG4OMChBaQEA76pCLhLfFYGjRRj+UZ2qIWZVoIs0eCyRhIj8V0WGty1rBkhFQq3laYcdFhIRjPNEl9Th0xv/o4PQAQLlv+aPGN+aajx0gQMIASQEMSVT1l40AFNNICZCdEdAVhQICxpvW3eB6pGkaoqlFV0pAzsPZgQgwk5W1PXLRspVMTAVEn7c8wuHQX0Ej9RQ///lBfyXxIoPf/////1qBAKFYzDKjAZ7PUA0BDUGlwyqDkvwIJzDoP/7UsQMg00I4SAuZanBgRwkxcy1OCKEBpQUQAVBrGEUgpGjamArc/avC97Jk+UGgEW7zGm37BUBJWQ1VpI9Ps+VtQhVjtTZVWVjyAZwXA9nBJi+b6ycF/JBv/+SSf/0W/+m0xQCrWcxexrlDGUQeFAeFBuYtHK70XRIJGqWjUX/Dthq1oZjSmSAuJ1nEXcvekFBHfcCjWDkOFOxdVV9a/0bsyp4BYFsGccJrsVjBg6hG1cnDIIdSBUOwvt//vNv/1//WnnaAGAACsnFoh0agEfo//tSxAYDC7DBLE3hSdF0myWNp54ZEDg5MIgpqCp5ePfIjoygeDvjVx0IIWzklLALI0kpGWfXewOOMtdaGYNc9kj7UD9U8ghpjD/rgxoyLGZ4FQFXnnnZU8PhZf/+swTf/U8m+XPCYABRgAGYTVADWFjuBTDgxAEBo8ICqHlsUNhoIpQiasC4wCLjIKNQiorgOsu5LAv3jo+y4IVV8dKtjuTCts5MjLZZYJpisI5Q7xSMaIDgFhJ//0NUfN/88xf+hUj0VQgMChTjA4w8NMuHzWz/+1LEBoNLwIMiLeHnUXIPY0G8sPgczAFMeJwoHmbZyGnAW9BKgCFKwqsPER+hUkpc3ZSaowCdTQaCJkVJ3iLsieIpU3OU+FZ0+TFkfq3UbGzIXMXXvTGYtqG4bqAcbfLgyDv1/h0gVzuEgx9/A0aYIZGojo81qXmFAQjkzgARYGa4gFMBwxDaKiga1MscFGTiskvSXUR6dpk0eXsyZRRdUZYaxSJkIGYeDsnMUsks6LY/LltKHmZHr4lLg8W+g76m/oUQICkE/5ICB1THAqA1hP/7UsQHAAhkdS7sMOfBCI5maYMV3KcT9BUERPBN0yIBCBkLDWg5rFhcI8BzbHF7s1tfTRd6vAUJT5ToODoF/s/+r/r/7NW3/p1XhAnEU9LLcOuIzJooorpf1qVIyLOUv060qdt9KaWCAYkSMAVTkOSXb4lJv6hQdZbk8GFWU+34F8lR//XzDf+z///6VQAjQ9phNMUhRyNAKFjhtoDaSWyxoAhorDjMWEBKSKVLOYeTW3eA0aomWYSRQeg1ycoZ/ck63PbJgVPOQjJ//v+ny7v3//tSxCICCWRlGs3lIcDyCaNZvKQgffM/u///9aCmesxuGGoMxIWxKBBYpOJXscfmy9wiIVujCq5nVZeNKM1uJ6u1+mwETqzUwG/q62bPd/Y///32///+j1ICDPco2MpM3BfUFC2i+jBX9YC9UXyUffyWRNVYEQkDZBo9E1KHpEeA2RTf1bItn9R+Vz3WV9Qwj5CfuYLfnSNza76rUehdu78drtVt6algaozsQwBNYqtjvtWDiT0TwRv7x1Ehry6ggqw4zQu/f98ahKa/FIu5Umb/+1LEPAMJuGkOLeEhgQUMosmmHLhlb36Yv6/r/Wv6GP9av77tnX2ogFv/FgDNIdRlwHIMW7bHGJTJLU0MtRD5fDpkUiaiJREktqe+w81sbzZeAHwgRv/Uo/p+U/r+Z/V//7+j/X71m7iH+BAIoEEiDwEkcbJFR7QoSanvAqzTwQEwnKQCk/pyZoIvLs79Jbv1bGVTALmNxVb0bHtZhAk/d62P//065z5Pq/+yGNajOpAWgDA0JHiGY8LKpHYCx+YRS5IKgnNkt/NfTO+f6RH61f/7UsRSggdkgRjMpEfBEoyhgaekYDd85ZyH69Ou32mW9n0dn9vxv2XXf9OQVWrjSjD2BkzFwFws6j9kdUnVJ0ha2AdvZfjs2FankbnOTBo4NWf5snS3Xpfa5N3RVtm/QL/UhaUWjHuEDkvLzdUMjzygwBCbZgRHuI+jgPkxLrCg1gusdSlMOHGrEgSkJBGPJpznvkQP07qT5ayCjk2YBU6hm/SLmG7rcR+hnYjt732DJuxf9+xIIpSGOgG9MWJiywkq07SXOGjTRJJSAhPxUJ4F//tSxHCDB4BtFE0kwsEAiqKJpJhANAMulyCgg0fZBwoUHA0QLIH/QuxXrTclBP/7al1V8bVj20AZT/7FmQFWk7ZDAVsKLO3DNSsODCBwBL3EvXoVYXRENO+JNS7vWIoS9W+vdEcwMTdr0XJnW/at/qt96kNVkqqX1JrT9n/SfcQaOezhlLEwNsEzSwrNEZ5ZASIUxOjB82rpY4m4OmCAB0EbenbFoAAxPYVkbJV9/6dvcz0KOKsQctBvdgZZB2mlGre3/u0O/9YA5UI6aJBuUAr/+1LEkAMJFHMMDbEDwQ2MIkmkjHiKcNyDgTFLaxJDBNxvHA4SgXFsMEiDGkyAE2E2RMwdDfe8kKtyfoeJgoHhQgnW+1SFGQEnn/4htudaqn+z//tsb/0Te293/pgAhPg1oV7Dlmwb8BxiLww/YshLI7hSZFcNiwboQjKOa6okCPEyvOkSI7X3eNFH4kCAcUa/QSC4dF34MOBVP/s+tn9//Sjv93TVMZiI6KgzBRjNEOtTsHC6ccJbdvDvUR5GeB3UBfU7ZTa7DpiI0fcqibwJSP/7UsSoAwgcfxJMmKfBKBFhwZSYsAZAOxFIIkDf9ykNLR31leqNFjn//7CNjT/pDgVf+a/coVe/6yQJszK8QxjhMzX3hkKJA3VvGSkamSwHsIUmbqKpj0oMoZJPqt1dszFWMhw4J8ShhQEunYHQf6HB9jv+rVq/9GqN+rq+31JpEBaTIpzUVT6tguPEiJQNBw8bYKxoRTq5WzGVhp96bJVeh/Qhh1I0BH7+cHIblvwSk9iNmbO/8lltq35b7LfXSmU///oNDQTHPw64tOAaRwPJ//tSxMCCChCNGMzpIQEijyNZphT4k2Pv/BF5kLI21gGHgwMRyK4/jeyGgHYckoTycJ4Elq9UYP2gZ2Fj/xw/J6DKG9/9clJoFXTM9bV9JZmX9s5/ZzK2u01WM63ztkamjq6rdOXunYiy66JrtyIroyGug8kdb7ebACMiAjRI+BVYcoZsueWLRndiqythydjByh2lBoaSn3su5jAkkj4b4YZq5JxQOrhb9oksOgLFKKuJHUvivsdCXvqu03gFP/bqAQ4eQNJCQCqgAWEYSpbZbM7/+1LE0YMJ4IsUDj0ngRwRowmmCPj6/8asFUjQBBDMTz0wWDsJB5ABRDQRFUUoffV1u7NGG1Jumc16qxRVxk6f6A4ZXbzr7zQOH8Nl+F9cIJZ8zI9qieffLWYixKCN1tQ/tTy023hJfpuczsiRvyY78XnOcN8/BcQmqU1KVVKhLI6wDL7wMldyzTwmB6NNImSCEzZQTg4KJkycf5zorNqEGXVM3PCqDpR6g+QOu9F5h3Q+7aj9z0+q71+ls/j2vs6DKaaxPcGIgBnMEvInr1vKqP/7UsTkgwiIdRRNMGXBvy2hAbYJuJKG9EpO1mH3Ed+LvHPyJoUbiEVa9KteVeZZkwQAQiQqNU2RpRqW1jbBE0wKEJpCyrH1tY5JI3IUBc61NVwaJChbolUYdkKEU5Zvvof89t7q+yvXk2r+g8Zfx+/lR+1UbWxJTyVpm/DdiqhFpYcLRIwhpo4nDgQKDL0lJ8ZWP/eoWuWbwazb2a5z2BHo+wsTzoCwzQzUtVXH2IkmMYMOR3UcYTjkPUcNof1ANL3KY4x1maTmREycJMXHShCT//tSxOiCCQB1GM0MyeHdreDFtg24nbVjTPIYh+3Xl0NJpAOC5kG4WABFok+fPKv7ysSj66HetFUXdB0yzCas3WpvleoyGatzGxItXb4iXS3X6yr4U69+3eF62sUdN8amuLOA+fs/D++Hv3x1/wE0m2Dd+i+/u/8KARXt2NxNwayKS74kG1qUX7qpLnyRszSMzmMdgCGZev91f191X932P26mav0fu7frAIiiJHjQGISK1vmA5oOCIeMHRASikIYGJMSn1koj6Rs8DRlNnI2FiO//+1LE5oMI8F8UTOjAwcYZ4MGkjmHLizHZDV5CQZymVGbdoEYYqrKisKSSJz0+evVnftOoF5L6SMmue+9r026+EJPxBi2xPHKup15rcQjCDX8hPCo7/9710jvL0+46/3Dd//zN////N2oAAEllqoBpgUZgUVHD8Qx5TTRs+Z2+7GvFYjiwh/1pEosrM3z5yHgpPy0Qrd+W/7/8ndxN7G26mxyHIEosuAErYBTwcjnRMVlyCXC6BoUUB25eXf1ACtR1bIKxmCAqPwS5bKW7YTE42P/7UsToAwm4bxRMMMJBsxRggbYZoVCQKFDyDVHQcTNubZULRdhoTHYKLa1WUuLqiwlOuS6EmUJzTciFkcYXTbbM/HyLymDJmi1ArxWrusZKt1Y1cF7mXPz3fzJzPOmcJpFNsKXz4HMlWHPwxQAFY22WMbGUCL0RxT0tdaHHibeJQZCnVcEx8urtNnF0qf0LNbS2WhiT1vvMMDKEehi8md/bZ6QjlzXTi8Rjn7vnC9YQgkU2ufl9X/OHCImtzJibzJT79ypdPuU3LpIlO/A8oRUE//tSxOiABgBXJUeIYqHxMKEZpJh8jv5oThhJUGi9LGNO9Cba7b6ETFwKISyRu1DTEXtoxy01FshUl9pY5JXoM4WPbuIEi1lhnDJlYGRvYRHYEdX9tGsal5CTgGAQ0PHb2GyLJG8opiajtVTj9kWCphjxetl7/yQABZPiTKqEOFI0EcqDilUnNykneFRAEcnqqINvFin6BCHAkFXZipztOME/jgFixnHsW20pGIDify0C5dSm2weLqtQ/RpGQdTEyR35v+Djr/T/18+DH6199//7/+1LE8AIKjOsVLJhjYaks4ImkjPDF4T3gAoulq6c06MiAkRCYwjQicBQLacprYgWzIncUYcgj9ZmrQ2oKK2Ty2goZ+RyeIThpdz/syxc/yTUikhLPJ4bminp24MyyJqqSLcq/m6ljXKOeVtB1RZqiQJgih4501QBOVCx0WMONELKkgPEYkDdgFyegeglESyErMUoMRCUTEUcLZnEl0EEGYErrtKMrfU7qO/FNm3UOxX9Iy+St982A0PepdVl9/SznNSuv86lldOIr/+5P4/9ep//7UsTug4z5XwZNpG1BfJjggbSNOPdIblDenvAj3wFJAgoDBERoTg5MEZAU4HSJjhJ6CUlomGqHSls7uscdSBMmm2RKnbPM7eN7dl5HLWOZQKMCizUEhZIsKBw4OPTggmr0rKFU6nJPra83E1Z1tXY51aoABaAeIHhVQkoV2qWU0FLYzsfGJFJYXaRqGmDrXJavDpwSRPer53qLoPiOazhg6d1bGdsp++nPntFnOcRXUuSNcoZQ+VwnN19nHm2xvNaWd9G4VzLvYw+njte+/5Tp//tSxOkDi0hnBk0wY4mDq2DJpIyoV4eOKwqx2ZX/pb2WOq2mqJd8SPypvlPVNkTU1kbs/CooTAEQPbCfhwXk9nzNC9HLPNnzQkyJ7PtKliNlj9pqbcKf5o2cIycyUoeRpS184aNnJkXOEdpoXmJfA5+NAcr5tIQVGgz6M+jNSpK6lRVgbmRhwmsY7JSKww2tDKbZ+V2fc9Rukxlnwm3km3uDWY/z9QX0wX+11BfDjkfs1Mj5diHKC8xdJEei9xOTITzR62Oqeesc/QskYcOAwMH/+1LE6QOL5KEELbDDiWARYMGmGGBFgGdxeTUsRsUCTVcsPcIpg9s5uEkfe2UDuzuMd+n2lDhtEIs/LJEd5bfIyPPMS5QsqS1masZ+jWHX/SFCxyb81zmrGUjpVY6mJDAxdLhrF+E2sTEnqYxs/dyKAQHpwiLSywOCBYnWxcjEryKsBg5qgGxBGkikHs84xhSFqhz0oR2ED0ElFlqEKzlHYVU6sDjOQWlFRqFNs9BnbVXT1crl2ThXZXcFWU6PI13ZboqsvkkWjmPRDyKiW62W7f/7UsTrAwuU6wZNGG2JeCxhiaMNeSJt/7/0HMK99jaMKigXJIMj9ggTpmF8DFHOVzJKeIzptOzhLHs+MdL1P4IIsnhnhsRVMgzsRZ0vNn/PgMz/ezHOaLgiJe2u8abVWNc7voW3tD4qIV7l/5+enkvjHQA64XIi+IVA2uKB0q2mjwapgwoZXZBzM64fpZs5IYI/v4vctaVrEfs0c7vkeb5FBIyUdcWCIYK98qVWAxRkY5s0O1czInh25K988+ZyMWe9ChRmUSdZl/nX3HRc0Lk5//tSxOuDiwSRBi0Ya8mGLGDJsw0wShPJocO05MClli3GWkjxdtc2eEj3sptDZGgKCqFrwcq6IGp0hgk1qBu90RxcXkRLeTZ2ztcjdVpgk55i8MtOXlJ0GZ6nLznJSfdg7Rr28ZsVBpW0ranqK/r0bTE///9n/JUb3QBASn4dfaCwJLNU6RMVJRE8UpsqwWnBoKtinFUAFZHsk6JyaJx44iBLAJiRFsJU+c1SVORO3KnwznHhJ1+e2vk+mJPjGskotrUeOnWFhEsAvGnTzdbluz3/+1LE7IIM2ZMCLZhJwVutYZmmDAhZgr9ZGVDbotQUJAUNBnxWMjMjxnKffcPlj616AgJBe3Y5HWgzpCkNZLRgh3m0cKXkYXzb5CCiT4KICDf/6ho+yD9f9j/xmuqlu4KgL/iIigiiUpD1yDkS+a8HFae4ERCYJjBKJyAqHCBaI8gasgekgYasgXSB9LIC0hgOcomXSB9KtsQPOUTKlMylEysuJ22y4fYfLh9h9hp2H2HrYfYust9i6y2yHrLbLaststp22y2nYdSZkpmOtAqUzP/7UsTrg4uVMwZNpGEJjpsfgcSYuX1A+kzH1A+kD51A+kD2yC6QPbLakCyOCHyFgcijOSUWUoApALkoESBkkFTLVIHpUmPSE0/2Gv7fYAmj2D0tf/q/1o//b/QKP/td2UxBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//tSxOkDi/DE9g4kxcEomJ0N5gxoVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+1LE8gIRIX8IbKTGiLeBYdyUiARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ==\",\n  duration: 0.779,\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.779,
    "format": "mp3",
    "sizeKb": 7,
    "license": "CC0",
    "tags": [
      "impact",
      "plank",
      "medium",
      "004"
    ],
    "keywords": [
      "impact",
      "plank",
      "medium",
      "clean",
      "wooden",
      "hit",
      "button press",
      "object placement",
      "interactive element",
      "themed app",
      "ui feedback",
      "game sfx",
      "crisp",
      "short",
      "solid",
      "confirm",
      "tactile",
      "wood",
      "satisfying",
      "playful"
    ]
  },
  "categories": [
    "impact"
  ]
}