Web audio api, stop sound gracefully

后端 未结 1 1229
春和景丽
春和景丽 2020-12-11 00:01

The web audio api furnish the method .stop() to stop a sound. I want my sound to decrease in volume before stopping. To do so I used a gain node. However I\'m f

相关标签:
1条回答
  • 2020-12-11 00:27

    Aaah, yes, yes, yes! I finally found a lot of things by eventually bothering to read "everything" in the doc (diagonally). And let me tell you this api is a diamond in the rough. Anyway, they actually have what I wanted with Audio param :

    The AudioParam interface represents an audio-related parameter, usually a parameter of an AudioNode (such as GainNode.gain). An AudioParam can be set to a specific value or a change in value, and can be scheduled to happen at a specific time and following a specific pattern.

    It has a function linearRampToValueAtTime()

    And they even have an example with what I asked !

    // create audio context
    var AudioContext = window.AudioContext || window.webkitAudioContext;
    var audioCtx = new AudioContext();
    
    // set basic variables for example
    var myAudio = document.querySelector('audio');
    var pre = document.querySelector('pre');
    var myScript = document.querySelector('script');
    
    pre.innerHTML = myScript.innerHTML;
    
    var linearRampPlus = document.querySelector('.linear-ramp-plus');
    var linearRampMinus = document.querySelector('.linear-ramp-minus');
    
    // Create a MediaElementAudioSourceNode
    // Feed the HTMLMediaElement into it
    var source = audioCtx.createMediaElementSource(myAudio);
    
    // Create a gain node and set it's gain value to 0.5
    var gainNode = audioCtx.createGain();
    
    // connect the AudioBufferSourceNode to the gainNode
    // and the gainNode to the destination
    gainNode.gain.setValueAtTime(0, audioCtx.currentTime);
    source.connect(gainNode);
    gainNode.connect(audioCtx.destination);
    
    // set buttons to do something onclick
    linearRampPlus.onclick = function() {
      gainNode.gain.linearRampToValueAtTime(1.0, audioCtx.currentTime + 2);
    }
    
    linearRampMinus.onclick = function() {
      gainNode.gain.linearRampToValueAtTime(0, audioCtx.currentTime + 2);
    }
    

    Working example here

    They also have different type of timings, like exponential instead of linear ramp which I guess would fit this scenario more.

    0 讨论(0)
提交回复
热议问题