sono
Version:
A simple yet powerful JavaScript library for working with Web Audio
154 lines (131 loc) • 4.08 kB
JavaScript
;
exports.__esModule = true;
var _typeof2 = require('babel-runtime/helpers/typeof');
var _typeof3 = _interopRequireDefault(_typeof2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var extensions = [];
var canPlay = {};
/*
* Initial tests
*/
var tests = [{
ext: 'ogg',
type: 'audio/ogg; codecs="vorbis"'
}, {
ext: 'mp3',
type: 'audio/mpeg;'
}, {
ext: 'opus',
type: 'audio/ogg; codecs="opus"'
}, {
ext: 'wav',
type: 'audio/wav; codecs="1"'
}, {
ext: 'm4a',
type: 'audio/x-m4a;'
}, {
ext: 'm4a',
type: 'audio/aac;'
}];
var el = document.createElement('audio');
if (el) {
tests.forEach(function (test) {
var canPlayType = !!el.canPlayType(test.type);
if (canPlayType && extensions.indexOf(test.ext) === -1) {
extensions.push(test.ext);
}
canPlay[test.ext] = canPlayType;
});
el = null;
}
/*
* find a supported file
*/
function getFileExtension(url) {
if (typeof url !== 'string') {
return '';
}
// from DataURL
if (url.slice(0, 5) === 'data:') {
var match = url.match(/data:audio\/(ogg|mp3|opus|wav|m4a)/i);
if (match && match.length > 1) {
return match[1].toLowerCase();
}
}
// from Standard URL
url = url.split('?')[0];
url = url.slice(url.lastIndexOf('/') + 1);
var a = url.split('.');
if (a.length === 1 || a[0] === '' && a.length === 2) {
return '';
}
return a.pop().toLowerCase();
}
function getSupportedFile(fileNames) {
var name = void 0;
if (Array.isArray(fileNames)) {
// if array get the first one that works
for (var i = 0; i < fileNames.length; i++) {
name = fileNames[i];
var ext = getFileExtension(name);
if (extensions.indexOf(ext) > -1) {
break;
}
}
} else if ((typeof fileNames === 'undefined' ? 'undefined' : (0, _typeof3.default)(fileNames)) === 'object') {
// if not array and is object
Object.keys(fileNames).some(function (key) {
name = fileNames[key];
var ext = getFileExtension(name);
return extensions.indexOf(ext) > -1;
});
}
// if string just return
return name || fileNames;
}
/*
* infer file types
*/
function isAudioBuffer(data) {
return !!(data && window.AudioBuffer && data instanceof window.AudioBuffer);
}
function isArrayBuffer(data) {
return !!(data && window.ArrayBuffer && data instanceof window.ArrayBuffer);
}
function isMediaElement(data) {
return !!(data && window.HTMLMediaElement && data instanceof window.HTMLMediaElement);
}
function isMediaStream(data) {
return !!(data && typeof data.getAudioTracks === 'function' && data.getAudioTracks().length && window.MediaStreamTrack && data.getAudioTracks()[0] instanceof window.MediaStreamTrack);
}
function isOscillatorType(data) {
return !!(data && typeof data === 'string' && (data === 'sine' || data === 'square' || data === 'sawtooth' || data === 'triangle'));
}
function isURL(data) {
return !!(data && typeof data === 'string' && (data.indexOf('.') > -1 || data.slice(0, 5) === 'data:'));
}
function containsURL(config) {
if (!config || isMediaElement(config)) {
return false;
}
// string, array or object with src/url/data property that is string, array or arraybuffer
var src = getSrc(config);
return isURL(src) || isArrayBuffer(src) || Array.isArray(src) && isURL(src[0]);
}
function getSrc(config) {
return config.src || config.url || config.data || config;
}
exports.default = {
canPlay: canPlay,
containsURL: containsURL,
extensions: extensions,
getFileExtension: getFileExtension,
getSrc: getSrc,
getSupportedFile: getSupportedFile,
isAudioBuffer: isAudioBuffer,
isArrayBuffer: isArrayBuffer,
isMediaElement: isMediaElement,
isMediaStream: isMediaStream,
isOscillatorType: isOscillatorType,
isURL: isURL
};