0

I am trying to detect when the oscillator audio has stopped playing. When I use onended,onend or event listener ended it only gets detected when I execute oscillator.stop()

Any one has any idea what I'm doing wrong or how this can be done? Thanks in advance.

The code of the oscillator is below:

let AudioContext = window.AudioContext || window.webkitAudioContext;
let ctx = new AudioContext();
let dot = 1.2 / 15;

function morsecode_audio_play() {
    morsecode_textToSpeech_stop()
    document.querySelector('#play_audio_button_morse').innerHTML = '<button id="stop_audio_morse">⏹️</button>';
    document.querySelector('#stop_audio_morse').addEventListener('click', morsecode_audio_stop);

    oscillator = ctx.createOscillator();
    let t = ctx.currentTime;

    oscillator.type = "sine";
    oscillator.frequency.value = 600;
  
    let gainNode = ctx.createGain();
    gainNode.gain.setValueAtTime(0, t);
    
    let morsecode = inputMorse.value.split("");

    morsecode.forEach(function(letter) {
        switch(letter) {
            case ".":
                gainNode.gain.setValueAtTime(1, t);
                t += dot;
                gainNode.gain.setValueAtTime(0, t);
                t += dot;
                break;
            case "-":
                gainNode.gain.setValueAtTime(1, t);
                t += 3 * dot;
                gainNode.gain.setValueAtTime(0, t);
                t += dot;
                break;
            case " ":
                t += 7 * dot; 
                break;
        }  
    });

    oscillator.connect(gainNode);
    gainNode.connect(ctx.destination);
    oscillator.start();
    oscillatorStatus = true;

    oscillator.addEventListener('ended', () => {
        console.log('oscillator ended');
        morsecode_audio_load();
    })

    return false;
  }
Gych
  • 21
  • 4
  • Add the listener *before* calling the `start()`. – IT goldman Jul 02 '22 at 15:17
  • Thanks for your reply, I've tried adding it before calling `start()` but that doesn't change anything. – Gych Jul 02 '22 at 15:30
  • The oscillator is being keyed by switching it's gain control on and off, not by starting and stopping it, Hence, because the oscillator is running continuously, no "end" event is ever generated. Without details of program design it's hard to suggest a complete solution;. – traktor Jul 02 '22 at 15:40
  • 1
    Thanks you made the issue more clear to me and I managed to solve it via another way. The foreach adds the duration of the sound to a variable called t for time, I used that in a timer to detect the end of the sound instead of trying to detect onend – Gych Jul 02 '22 at 16:11

1 Answers1

0

I managed to solve it by using the duration time of the oscillator sound.

The time is stored by the foreach in a variable t for time. I used that variable in a timer to detect the end.

   setTimeout(function(){
      morsecode_audio_stop();
      t = 0;
    }, t*1000);
Gych
  • 21
  • 4