67 lines
1.2 KiB
JavaScript
67 lines
1.2 KiB
JavaScript
import { AudioContext } from '../audio/AudioContext.js';
|
|
import { FileLoader } from './FileLoader.js';
|
|
import { Loader } from './Loader.js';
|
|
|
|
class AudioLoader extends Loader {
|
|
|
|
constructor( manager ) {
|
|
|
|
super( manager );
|
|
|
|
}
|
|
|
|
load( url, onLoad, onProgress, onError ) {
|
|
|
|
const scope = this;
|
|
|
|
const loader = new FileLoader( this.manager );
|
|
loader.setResponseType( 'arraybuffer' );
|
|
loader.setPath( this.path );
|
|
loader.setRequestHeader( this.requestHeader );
|
|
loader.setWithCredentials( this.withCredentials );
|
|
loader.load( url, function ( buffer ) {
|
|
|
|
try {
|
|
|
|
// Create a copy of the buffer. The `decodeAudioData` method
|
|
// detaches the buffer when complete, preventing reuse.
|
|
const bufferCopy = buffer.slice( 0 );
|
|
|
|
const context = AudioContext.getContext();
|
|
context.decodeAudioData( bufferCopy, function ( audioBuffer ) {
|
|
|
|
onLoad( audioBuffer );
|
|
|
|
} ).catch( handleError );
|
|
|
|
} catch ( e ) {
|
|
|
|
handleError( e );
|
|
|
|
}
|
|
|
|
}, onProgress, onError );
|
|
|
|
function handleError( e ) {
|
|
|
|
if ( onError ) {
|
|
|
|
onError( e );
|
|
|
|
} else {
|
|
|
|
console.error( e );
|
|
|
|
}
|
|
|
|
scope.manager.itemError( url );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
export { AudioLoader };
|