Skip to content

How to clear AudioContext? #94

@0plus1

Description

@0plus1

Hi, thanks for this package, I am streaming to Speaker, everything works, but if I run the code below, it will keep the CLI running, what is the correct way to close the AudioContext? audioCtx._kill() does close it but creates some weird scenarios.

Thanks for any help.

import { AudioContext } from 'web-audio-api';
import Speaker from 'speaker';

// Initialise audio context setting speaker as the streaming device
let audioCtx = new AudioContext;
audioCtx.outStream = new Speaker({
  channels: audioCtx.format.numberOfChannels,
  bitDepth: audioCtx.format.bitDepth,
  sampleRate: audioCtx.sampleRate
});

async function playBuffer(buffer) {
  return new Promise((resolve, reject) => {
    const source = audioCtx.createBufferSource();
    source.buffer = buffer;
    source.connect(audioCtx.destination);
    source.loop = false;
    source.start(0);
    source.onended = () => {
      resolve();
    };
    source.onerror = (err) => {
      reject(err);
    };
  });
}

export async function streamAudio(arrayBuffer) {
  return new Promise(async (resolve, reject) => {
    try {
      // Decode it
      audioCtx.decodeAudioData(
        arrayBuffer,
        (b) => playBuffer(b).then(() => {
          // Not sure what's the correct way to close the audio context
          // This line creates race condition as the audio might've not finished playing
          // audioCtx._kill();
          resolve();
        }),
        (err) => reject(err)
      );
    } catch (err) {
      reject(`Unable to fetch the audio file. Error: ${err.message}`);
    }
  });
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions