I want to detect when sounds is ending, but all examples that i found not working.
// Create sound var sound1 = new THREE.PositionalAudio( listener ); sound1.load( 'sounds/Example.ogg' ); sound1.setRefDistance( 30 ); sound1.autoplay = false; sound1.setLoop(false); mesh1.add( sound1 ); // Start sound setTimeout(function() { sound1.play(); }, 2000); // Try to detect end #1 sound1.onended = function() { console.log('sound1 ended #1'); }; // Try to detect end #1 sound1.addEventListener('ended', function() { console.log('sound1 ended #2'); });
Live example: http://codepen.io/anon/pen/wMRoWQ
Advertisement
Answer
Three.Audio
is wrapper around a buffer source audio object. https://github.com/mrdoob/three.js/blob/ddab1fda4fd1e21babf65aa454fc0fe15bfabc33/src/audio/Audio.js#L12
It looks like it overrides the onended event and binds it to its own function, so we just do the same:
sound1.source.onended = function() { console.log('sound1 ended'); this.isPlaying = false; /* sets Three wrapper property correctly */ };
We set isPlaying = false
because this is what Three’s Audio onended function does, which we just overrode.
working pen: http://codepen.io/anon/pen/GoambE