///|
pub extern "js" fn Audio::play(self : Self) -> Unit =
  #| (self) => {
  #|   const result = self.play();
  #|   if (result && typeof result.then === 'function') {
  #|     result.then(() => {
  #|       self.__selenePlayState = 1;
  #|     }).catch((err) => {
  #|       const name = err && err.name ? String(err.name) : '';
  #|       if (name === 'AbortError' && self.paused) {
  #|         self.__selenePlayState = 0;
  #|         return;
  #|       }
  #|       self.__selenePlayState = name === 'NotAllowedError' ? 2 : 3;
  #|     });
  #|   } else {
  #|     self.__selenePlayState = self.paused ? 0 : 1;
  #|   }
  #| }

///|
pub extern "js" fn Audio::pause(self : Self) -> Unit =
  #| (self) => {
  #|   self.pause();
  #|   if (!self.ended) {
  #|     self.__selenePlayState = 0;
  #|   }
  #| }

///|
pub extern "js" fn Audio::set_volume(self : Self, volume : Double) -> Unit = "(self, volume) => self.volume = volume"

///|
pub extern "js" fn Audio::set_loop(self : Self, loop_ : Bool) -> Unit = "(self, loop_) => self.loop = loop_"

///|
pub extern "js" fn Audio::set_playback_rate(
  self : Self,
  playback_rate : Double,
) -> Unit = "(self, playback_rate) => self.playbackRate = playback_rate"

///|
pub extern "js" fn Audio::set_current_time(
  self : Self,
  current_time : Double,
) -> Unit = "(self, current_time) => self.currentTime = current_time"

///|
pub extern "js" fn Audio::is_paused(self : Self) -> Bool = "(self) => self.paused"

///|
pub extern "js" fn Audio::is_ended(self : Self) -> Bool = "(self) => self.ended"

///|
#external
type Audio