_play(audio, fadeDuration, volume) {
    if (audio instanceof audio_object) {
      if (volume == null) { volume = this.get_master_volume(); }

      // play audio
      const play_promise = audio.play(fadeDuration, volume);

      // wait for audio to end and return to pool
      audio.when_ended().then(() => {
        this.add_to_pool(audio);
      });

      return play_promise;
    }
    return Promise.resolve();
  }
Plays an audio file and returns a promise that resolves when the audio is faded in/out.
NOTE: do not call this method directly, use play_music or play_effect instead.
@private
@param audio
@param [fadeDuration=0]
@param [volume=master volume]
@returns {Promise}