npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@soundworks/plugin-audio-buffer-loader

v1.1.1

Published

soundworks plugin for loading and managing audio buffers and related json data.

Downloads

9

Readme

@soundworks/plugin-audio-buffer-loader

soundworks plugin for loading and managing audio buffers and related json data. Currently limited to .mp3, .wav or .json formats to enforce browser compatibility and support (meaning support for Safari...)

Table of Contents

Installation

npm install @soundworks/plugin-audio-buffer-loader --save

Example

A working example can be found in the https://github.com/collective-soundworks/soundworks-examples repository.

Usage

Server installation

Registering the plugin

// index.js
import { Server } from '@soundworks/core/server';
import pluginAudioBufferLoaderFactory from '@soundworks/plugin-audio-buffer-loader/server';

const server = new Server();
server.pluginManager.register('audio-buffer-loader', pluginAudioBufferLoaderFactory, {}, []);

Requiring the plugin

// MyExperience.js
import { AbstractExperience } from '@soundworks/core/server';

class MyExperience extends AbstractExperience {
  constructor(server, clientType) {
    super(server, clientType);
    // require plugin in the experience
    this.audioBufferLoader = this.require('audio-buffer-loader');
  }
}

Client installation

Registering the plugin

// index.js
import { Client } from '@soundworks/core/client';
import pluginAudioBufferLoaderFactory from '@soundworks/plugin-audio-buffer-loader/client';

const client = new Client();
client.pluginManager.register('audio-buffer-loader', pluginAudioBufferLoaderFactory, {
  // declare files that should be loading when Experience starts, if any
  data: {
    'file-1': 'sounds/88-fingers-short.mp3',
    'file-2': 'sounds/drops-short.mp3',
    'file-3': 'sounds/plane-short.mp3',
  }
}, []);

Requiring the plugin

// MyExperience.js
import { Experience } from '@soundworks/core/client';

class MyExperience extends Experience {
  constructor(client) {
    super(client);
    // require plugin in the experience
    this.audioBufferLoader = this.require('audio-buffer-loader');
  }

  async start() {
    console.log(this.audioBufferLoader.data);
    // {
    //   'file-1': AudioBuffer,
    //   'file-2': AudioBuffer,
    //   'file-3': AudioBuffer,
    // }
  }
}

Loading files

The following API is only available client-side.

This method use the given data structure to load files, the resulting object is a copy of the given object where each path to a .mp3, .wav or .json file is replaced with its corresponding AudioBuffer or JSON object. The resulting object is returned, and is by default mixed into this.audioBufferLoader.data using Object.assign. If override is set to true, this.audioBufferLoader.data is completely replaced with the new object. This behavior aims to give a simple and predictable way to deal with the caching of AudioBuffers, for example reusing a given key will drop the old AudioBuffer and replace it with the new one.

/**
 * @async
 * @param {Object} defObj - The data structure containing the link to the
 *   audio and json files to load
 * @param {Boolean} [override=false] - if true replace the internal cache with
 *   the new object instead of mixing it using `Object.assign`
 * @return defObj mutated with link replaced by `AudioBuffers`
 */
const loadedData = await this.audioBufferLoader.load({
  'file-1': 'sounds/88-fingers-short.mp3',
  'file-2': 'sounds/drops-short.mp3',
  'file-3': 'sounds/plane-short.mp3',
}, true);
// loadedData = {
//   'file-1': AudioBuffer,
//   'file-2': AudioBuffer,
//   'file-3': AudioBuffer,
// }

Getting and subscribing to loading status change

You may want to track loading status to display a waiting screen or whatever feedback.

this.audioBufferLoader.subscribe(state => {
  console.log(state.loading); // > true || false
});

const loadingState = this.audioBufferLoader.get('loading');
// > true || false

Keeping in sync with a directory using the @soundworks/plugin-filesystem

In working situations you may want to dynamically add and remove sound files while your application is running to make tests. The @soundworks/plugin-filesystem can be used in conjunction with the @soundworks/plugin-audio-buffer-loader to ensure your clients AudioBuffers are synced with the content of a given directory.

Assuming the @soundworks/plugin-filesystem is configured to track changes in a directory named soundbank, the client can simply observe these changes to keep AudioBuffers synced as follow:

// MyExperience.js
import { Experience } from '@soundworks/core/client';

class MyExperience extends AbstractExperience {
  constructor(client) {
    super(client);

    this.filesystem = this.require('filesystem');
    this.audioBufferLoader = this.require('audio-buffer-loader');
  }

  async start() {
    super.start();
    // subscribe to directory updates
    this.filesystem.subscribe(() => this.loadSoundbank());
    // initialize with the current content of the directory
    this.loadSoundbank();
  }

  async loadSoundbank() {
    const soundbankTree = this.filesystem.get('soundbank');
    // format tree to create a simple data object
    const defObj = {};

    soundbankTree.children.forEach(leaf => {
      if (leaf.type === 'file') {
        defObj[leaf.name] = leaf.url;
      }
    });
    // load files and clear old cached buffers
    const loadedObject = await this.audioBufferLoader.load(defObj, true);
    // do something with your buffers
  }
}

Credits

The code has been initiated in the framework of the WAVE and CoSiMa research projects, funded by the French National Research Agency (ANR).

License

BSD-3-Clause