{"_id":"@basementuniverse/audio-manager","_rev":"3-b4652f66bd2e3d73c3fad149cff1350f","name":"@basementuniverse/audio-manager","dist-tags":{"latest":"1.2.0"},"versions":{"1.0.0":{"name":"@basementuniverse/audio-manager","version":"1.0.0","author":{"url":"https://gordonlarrigan.com","name":"Gordon Larrigan","email":"gordonlarrigan@gmail.com"},"license":"MIT","_id":"@basementuniverse/audio-manager@1.0.0","maintainers":[{"name":"basementuniverse","email":"gordonlarrigan@gmail.com"}],"homepage":"https://github.com/basementuniverse/audio-manager#readme","bugs":{"url":"https://github.com/basementuniverse/audio-manager/issues"},"dist":{"shasum":"0e17ea8699f473ca795c70b3eb10a6efa678a6d3","tarball":"https://registry.npmjs.org/@basementuniverse/audio-manager/-/audio-manager-1.0.0.tgz","fileCount":5,"integrity":"sha512-2+9wAbGsLaj6ZtnfwqLG72RdgYT5j3kGLLqbQFknF2hJb6OkISJigDOeDAOgdmQrD952dEZBV1v0MNLJ+Ps1lg==","signatures":[{"sig":"MEYCIQDx+QknvKHDeSUHhDQribU7OORpNwVtJeHCA0BG3HpmNQIhAIrGLXurqphWrveM0TGCVNO3C+Fke7G9FEGR0eOk/wCw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":33621},"main":"build/index.js","types":"build/index.d.ts","gitHead":"152787b5a3e258e7730ef5419ce0e23b046d3953","scripts":{"build":"webpack","watch":"webpack --watch"},"_npmUser":{"name":"basementuniverse","email":"gordonlarrigan@gmail.com"},"repository":{"url":"git+https://github.com/basementuniverse/audio-manager.git","type":"git"},"_npmVersion":"11.5.1","description":"A component for playing audio (sound effects and music) in HTML5 games.","directories":{},"_nodeVersion":"24.5.0","_hasShrinkwrap":false,"devDependencies":{"webpack":"^5.3.2","ts-loader":"^8.0.7","typescript":"^4.9.4","@types/node":"^18.11.12","webpack-cli":"^4.1.0","clean-webpack-plugin":"^4.0.0-alpha.0"},"_npmOperationalInternal":{"tmp":"tmp/audio-manager_1.0.0_1759228893981_0.8488434292896667","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@basementuniverse/audio-manager","version":"1.1.0","author":{"url":"https://gordonlarrigan.com","name":"Gordon Larrigan","email":"gordonlarrigan@gmail.com"},"license":"MIT","_id":"@basementuniverse/audio-manager@1.1.0","maintainers":[{"name":"basementuniverse","email":"gordonlarrigan@gmail.com"}],"homepage":"https://github.com/basementuniverse/audio-manager#readme","bugs":{"url":"https://github.com/basementuniverse/audio-manager/issues"},"dist":{"shasum":"a62abba026beaaaecab8b3bca670487b26b7aaae","tarball":"https://registry.npmjs.org/@basementuniverse/audio-manager/-/audio-manager-1.1.0.tgz","fileCount":5,"integrity":"sha512-7BaJhyDDaXiKTSYEPqs3p0ZAu0UvmfNUZ6gxF+HiM1QVlDeak60B6rHyTnqxCQWv2YwShx+xPYJ5bxti3BCT2Q==","signatures":[{"sig":"MEQCIHXOfHADiP2uQFshaNdjXWClaRna+50arqW2AYiimeddAiBAMz2mbddidRYxbjJ0OIbnoN7ird78C2jf4VVPog6XWQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35374},"main":"build/index.js","types":"build/index.d.ts","gitHead":"2845d584be548dcbb773f15860530c5558adf57f","scripts":{"build":"webpack","watch":"webpack --watch"},"_npmUser":{"name":"basementuniverse","email":"gordonlarrigan@gmail.com"},"repository":{"url":"git+https://github.com/basementuniverse/audio-manager.git","type":"git"},"_npmVersion":"11.6.2","description":"A component for playing audio (sound effects and music) in HTML5 games.","directories":{},"_nodeVersion":"24.12.0","_hasShrinkwrap":false,"devDependencies":{"webpack":"^5.3.2","ts-loader":"^8.0.7","typescript":"^4.9.4","@types/node":"^18.11.12","webpack-cli":"^4.1.0","clean-webpack-plugin":"^4.0.0-alpha.0"},"_npmOperationalInternal":{"tmp":"tmp/audio-manager_1.1.0_1766964734273_0.006467481594004454","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@basementuniverse/audio-manager","version":"1.2.0","description":"A component for playing audio (sound effects and music) in HTML5 games.","author":{"name":"Gordon Larrigan","email":"gordonlarrigan@gmail.com","url":"https://gordonlarrigan.com"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/basementuniverse/audio-manager.git"},"main":"build/index.js","types":"build/index.d.ts","scripts":{"build":"webpack --mode production","build:dev":"webpack --mode development","watch":"webpack --watch"},"devDependencies":{"@types/node":"^18.11.12","clean-webpack-plugin":"^4.0.0-alpha.0","ts-loader":"^8.0.7","typescript":"^4.9.4","webpack":"^5.3.2","webpack-cli":"^4.1.0"},"gitHead":"77fb28db1f884708170a0cd30dc9bbfc24da1be5","_id":"@basementuniverse/audio-manager@1.2.0","bugs":{"url":"https://github.com/basementuniverse/audio-manager/issues"},"homepage":"https://github.com/basementuniverse/audio-manager#readme","_nodeVersion":"24.12.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-Zy9gFFWCXsv7xVqLlfeu3XfwB7uxq8u9Y6xh+SEgwFgpFTzqFrkZOASQEXInmcZZ73Qx3qFpyy5tRR87tX7TWg==","shasum":"8ad616f6ad61d16fc89995945b2e5aa3bad1191f","tarball":"https://registry.npmjs.org/@basementuniverse/audio-manager/-/audio-manager-1.2.0.tgz","fileCount":5,"unpackedSize":22086,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCjIkGoJvCILhTuRi5a3d0QxvC6BuNtmGKQODBJog+ITQIgas6Z4URsUTUx3xeztj9oQP/gsDmOIuBwyRNAdRhWEco="}]},"_npmUser":{"name":"basementuniverse","email":"gordonlarrigan@gmail.com"},"directories":{},"maintainers":[{"name":"basementuniverse","email":"gordonlarrigan@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/audio-manager_1.2.0_1786898753275_0.13877937309535104"},"_hasShrinkwrap":false}},"time":{"created":"2025-09-30T10:41:33.830Z","modified":"2026-08-16T16:45:53.575Z","1.0.0":"2025-09-30T10:41:34.189Z","1.1.0":"2025-12-28T23:32:14.415Z","1.2.0":"2026-08-16T16:45:53.417Z"},"bugs":{"url":"https://github.com/basementuniverse/audio-manager/issues"},"author":{"name":"Gordon Larrigan","email":"gordonlarrigan@gmail.com","url":"https://gordonlarrigan.com"},"license":"MIT","homepage":"https://github.com/basementuniverse/audio-manager#readme","repository":{"type":"git","url":"git+https://github.com/basementuniverse/audio-manager.git"},"description":"A component for playing audio (sound effects and music) in HTML5 games.","maintainers":[{"name":"basementuniverse","email":"gordonlarrigan@gmail.com"}],"readme":"# Game Component: Audio Manager\n\nA simple audio manager for games, built with the Web Audio API.\n\n## Installation\n\n```bash\nnpm install @basementuniverse/audio-manager\n```\n\n## How to use\n\nWe need to initialise the `AudioManager` with a list of audio items. Each item can contain an `HTMLAudioElement` or an `AudioBuffer` in the `audio` property.\n\n```ts\nimport { AudioManager, AudioItem, PlayMode, AudioStatus } from '@basementuniverse/audio-manager';\n\nAudioManager.initialise({\n  // See \"Audio Item Options\" below for details\n  mySound1: {\n    audio: new Audio('path/to/mySound1.mp3'),\n    volume: 0.5,\n    loop: true,\n  },\n  mySound2: {\n    audio: myAudioBuffer,\n    volume: 0.8,\n  },\n  // etc...\n});\n```\n\nFor direct browser usage, include the UMD build with a script tag:\n\n```html\n<script src=\"build/index.js\"></script>\n```\n\nThe build exposes its exports through the `BasementUniverseAudioManager` browser\nnamespace. It does not add each export directly to `window`.\n\n## Audio Item Options\n\nEach audio item should be of the following type:\n\n```ts\ntype AudioOptions = {\n  /**\n   * An audio object to play, either an HTMLAudioElement or an AudioBuffer\n   */\n  audio: HTMLAudioElement | AudioBuffer;\n\n  /**\n   * Optional group name for grouping sounds\n   */\n  group?: string;\n\n  /**\n   * How to play the sound:\n   *\n   * - 'trigger' starts playing the sound when triggered and plays until\n   *   finished. If we trigger it again while it's playing, it does nothing\n   * - 'retrigger' starts playing the sound when triggered and restarts if\n   *   triggered again while it's playing\n   * - 'hold' starts playing the sound when held and stops when released\n   *\n   * Note: For 'hold' mode, you need to set the `hold` property on the sound\n   * instance to start/stop playback.\n   */\n  mode: PlayMode;\n\n  /**\n   * Volume (0 to 1)\n   */\n  volume: number;\n\n  /**\n   * Pan (-1 to 1)\n   */\n  pan: number;\n\n  /**\n   * Pitch (playback rate), where 1 is normal pitch/speed\n   * - In 'playback-rate' mode: affects both pitch and duration\n   * - In 'pitch-shift' mode: attempts to affect only pitch (duration preserved)\n   */\n  pitch: number;\n\n  /**\n   * Whether to loop the sound when it reaches the end\n   */\n  loop: boolean;\n\n  /**\n   * Optional callback called when the sound starts playing\n   */\n  onStart?: () => void;\n\n  /**\n   * Optional callback called when the sound finishes playing (if not looping)\n   */\n  onFinish?: () => void;\n\n  /**\n   * Optional callback called each time the sound loops (if looping)\n   */\n  onRepeat?: () => void;\n};\n```\n\n## Controlling Audio\n\nThe `AudioManager` provides various methods to control audio playback:\n\n```ts\nAudioManager.play('mySound1');\nAudioManager.pause('mySound2');\nAudioManager.stop('mySound1');\nAudioManager.reset('mySound2');\nAudioManager.fadeIn('mySound2', 1);\nAudioManager.fadeOut('mySound1', 1);\n```\n\nWe can also add and remove audio items dynamically:\n\n```ts\nAudioManager.add('mySound3', audioOptions);\nAudioManager.remove('mySound2');\n```\n\nWe can fetch a map of sounds or a specific sound:\n\n```ts\nAudioManager.sounds; // Record<string, AudioItem>\nAudioManager.sounds['mySound1']; // AudioItem | undefined\n```\n\nWe can control playback for all sounds or a specific group:\n\n```ts\nAudioManager.playAll(); // Play all sounds\nAudioManager.playAll('music'); // Play all sounds in 'music' group\n\nAudioManager.pauseAll(); // Pause all sounds\nAudioManager.pauseAll('effects'); // Pause all sounds in 'effects' group\n\nAudioManager.resumeAll(); // Resume all sounds\nAudioManager.resumeAll('ambience'); // Resume all sounds in 'ambience' group\n\nAudioManager.stopAll(); // Stop all sounds\nAudioManager.stopAll('music'); // Stop all sounds in 'music' group\n\nAudioManager.resetAll(); // Reset all sounds\nAudioManager.resetAll('effects'); // Reset all sounds in 'effects' group\n```\n\nWe can control settings for all sounds or a specific group:\n\n```ts\nAudioManager.setVolume(0.5); // Set volume for all sounds\nAudioManager.setVolume(0.8, 'music'); // Set volume for 'music' group\n\nAudioManager.setPitch(1.2); // Set pitch for all sounds\nAudioManager.setPitch(0.9, 'effects'); // Set pitch for 'effects' group\n\nAudioManager.setPan(0); // Set pan for all sounds\nAudioManager.setPan(-0.5, 'ambience'); // Set pan for 'ambience' group\n\nAudioManager.setMuted(true); // Mute all sounds\nAudioManager.setMuted(false, 'music'); // Unmute 'music' group\n```\n\nTo query the current global settings:\n\n```ts\nAudioManager.globalVolume; // number\nAudioManager.globalPitch; // number\nAudioManager.globalPan; // number\nAudioManager.globalMuted; // boolean\n```\n\nIf you have a reference to a specific sound, it can be controlled directly:\n\n```ts\nconst sound = AudioManager.sounds['mySound1'];\nif (sound) {\n  sound.play();\n  sound.stop();\n  sound.pause();\n  sound.resume();\n  sound.reset();\n  sound.fadeIn(1);\n  sound.fadeOut(1);\n\n  // Get/set the hold status (for 'hold' mode)\n  sound.hold = true; // Start playing\n  sound.hold = false; // Stop playing\n\n  // Get the current status\n  const status = sound.status; // AudioStatus\n\n  // Change the volume, pan, and pitch\n  sound.volume = 0.7;\n  sound.pan = -0.3;\n  sound.pitch = 1.1;\n\n  // You will need to call `updateProperties` to apply changes to volume, pan, and pitch\n  sound.updateProperties();\n}\n```\n\n## Content Loader\n\nIf you're using the [`@basementuniverse/content-manager`](https://www.npmjs.com/package/@basementuniverse/content-manager) package, you can use the `AudioBufferLoader` to load audio files as `AudioBuffer` objects, ready to be used with the `AudioManager`.\n\n```ts\nimport { AudioBufferLoader } from '@basementuniverse/audio-manager';\nimport ContentManager from '@basementuniverse/content-manager';\n\nContentManager.initialise({\n  loaders: {\n    'audio-buffer': AudioBufferLoader,\n  },\n});\n\nContentManager.load([\n  {\n    name: 'my-audio-buffer',\n    type: 'audio-buffer',\n    args: ['./test.mp3'],\n  },\n]);\n\n// ContentManager.get('my-audio-buffer') returns an AudioBuffer instance\n```\n","readmeFilename":"README.md"}