Wavesurfer scriptNode onaudioprocress runs only once

385 views Asked by At

I am using wavesurfer to map an audio, however I need to build a VuMeter.

I used this implementation and everything works well except for the fact that on audioprocess only runs once.

function playSound(arraybuffer, vuMeterInput, audioSource, playBtn, pauseBtn, volumeController, waveFormID, startAt = 0, sourceNode = undefined) {
    
    
    var context = new AudioContext();
    
    var wavesurfer = WaveSurfer.create({
        container: waveFormID,
        waveColor: '#E0E0E0',
        progressColor: '#64C2EB',
        barWidth: 3,
        height: 20,
        audioContext: context
    });
    
    wavesurfer.load(audioSource.src);
    
    console.log(wavesurfer.backend);
    
    var source = wavesurfer.backend.ac.createBufferSource();
    wavesurfer.backend.source = source;
    
    var gainNode = wavesurfer.backend.ac.createGain();
    
    wavesurfer.backend.ac.decodeAudioData(arraybuffer, function (buffer) {
        wavesurfer.backend.source.buffer = buffer;
        
    });

    wavesurfer.loadDecodedBuffer();
    
    wavesurfer.backend.analyser.smoothingTimeConstant = 0.3;
    wavesurfer.backend.analyser.fftSize = 1024;
    
    wavesurfer.backend.scriptNode.bufferSize = 4096;
    wavesurfer.backend.scriptNode.numberOfInputs = 1;
    wavesurfer.backend.scriptNode.numberOfOutputs = 1;
      
    
    function MapVumeter(){
        var array = new Uint8Array(wavesurfer.backend.analyser.frequencyBinCount);
        valval =  wavesurfer.backend.analyser.getByteFrequencyData(array);
        console.log(valval);
        console.log(Math.average(array));
        vuMeterInput.mono.setAttribute("data-val", Math.average(array));
    }

    wavesurfer.backend.scriptNode.onaudioprocess = MapVumeter;
    
    wavesurfer.backend.source.onended = function() {
        

        $(playBtn).attr('hidden',false);
        $(pauseBtn).attr('hidden',true);
        vuMeterInput.mono.setAttribute("data-val", 0);
    }
    
    var is_paused = false;
    
    
    
    $(playBtn).on('click', function(){
        $(playBtn).attr('hidden',true);
        $(pauseBtn).attr('hidden',false);
        wavesurfer.play();
        if(is_paused == true){
            console.log("called the function again after pause"); 
    
    
    
        }


        
    });
    
    $(pauseBtn).on('click', function(){
        $(playBtn).attr('hidden',false);
        $(pauseBtn).attr('hidden',true);


        wavesurfer.pause();
        vuMeterInput.mono.setAttribute("data-val", 0);
    });

I am not sure why this works if I use an AudioContext, Analyser and gainNode outside of WaveSurfer but within wavesurfer it's only running once with a value of 0 for the val of Math.average(array);

1

There are 1 answers

0
chrisguttandin On BEST ANSWER

wavesurfer.js is using that ScriptProcessorNode as well. It will probably overwrite the event handler that you assign to onaudioprocess.

https://github.com/katspaugh/wavesurfer.js/blob/master/src/webaudio.js#L247

You could try registering your event handler with addEventListener().

wavesurfer.backend.scriptNode.addEventListener('audioprocess', MapVumeter);