Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 17 additions & 36 deletions src/extensions/scratch3_music/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,17 @@ const formatMessage = require('format-message');
const MathUtil = require('../../util/math-util');
const Timer = require('../../util/timer');

/**
* The instrument and drum sounds, loaded as static assets.
* @type {object}
*/
let assetData = {};
try {
assetData = require('./manifest');
} catch (e) {
// Non-webpack environment, don't worry about assets.
}

/**
* Icon svg to be displayed at the left edge of each extension block, encoded as a data URI.
* @type {string}
Expand Down Expand Up @@ -92,27 +103,6 @@ class Scratch3MusicBlocks {
});
}

_fetchSounds () {
if (!this._assetData) {
this._assetData = new Promise((resolve, reject) => {
// Use webpack supported require.ensure to dynamically load the
// manifest as an another javascript file. Once the file
// executes the callback will be called and we can require the
// manifest.
//
// You can either make require calls in the callback function or
// specify dependencies in the array to load. The third argument
// is an error callback. The forth argument is a name for the
// javascript that can be used depending on the webpack
// configuration.
require.ensure([], () => {
resolve(require('./manifest'));
}, reject, 'vm-music-manifest');
});
}
return this._assetData;
}

/**
* Decode a sound and store the buffer in an array.
* @param {string} filePath - the audio file name.
Expand All @@ -123,23 +113,14 @@ class Scratch3MusicBlocks {
_storeSound (filePath, index, bufferArray) {
const fullPath = `${filePath}.mp3`;

return this._fetchSounds()
// In case require.ensure is not available (such as running this
// file directly in node instead of through the webpack built script
// for node) or that require.ensure fails, turn the error into an
// empty object. The music extension will ignore the sound files.
.catch(() => ({}))
.then(assetData => {
if (!assetData[fullPath]) return;
if (!assetData[fullPath]) return;

// The sound buffer has already been downloaded via the manifest file required above.
const soundBuffer = assetData[fullPath];
// The sound buffer has already been downloaded via the manifest file required above.
const soundBuffer = assetData[fullPath];

return this._decodeSound(soundBuffer);
})
.then(buffer => {
bufferArray[index] = buffer;
});
return this._decodeSound(soundBuffer).then(buffer => {
bufferArray[index] = buffer;
});
}

/**
Expand Down