{"version":3,"file":"player.js","names":[],"sources":["esm/platform/audio/player.js"],"sourcesContent":["import { createPlayerEvents } from \"./events\";\nimport {\n  assertCrossOrigin,\n  assertFlag,\n  assertPitchQuality,\n  assertRate,\n  assertSeconds,\n  assertTolerance,\n  assertVolume,\n  normalizeSource,\n  rateError,\n  resolveUpdateInterval\n} from \"./validate\";\nclass AudioPlayer {\n  element;\n  playerId;\n  removed = false;\n  events;\n  buffering = false;\n  finished = false;\n  failure = null;\n  // obtain through Audio.createPlayer().\n  constructor(element, id, updateIntervalMs) {\n    this.element = element;\n    this.playerId = id;\n    this.events = createPlayerEvents(() => this.getStatus(), updateIntervalMs);\n    element.addEventListener(\"waiting\", () => {\n      this.buffering = true;\n    });\n    element.addEventListener(\"playing\", () => {\n      this.buffering = false;\n      this.failure = null;\n    });\n    element.addEventListener(\"canplay\", () => {\n      this.buffering = false;\n    });\n    element.addEventListener(\"ended\", () => {\n      this.finished = true;\n    });\n    element.addEventListener(\"error\", () => {\n      this.failure = element.error?.message || \"audio playback failed\";\n    });\n  }\n  get id() {\n    return this.playerId;\n  }\n  get currentTime() {\n    this.assertUsable(\"currentTime\");\n    return this.element.currentTime;\n  }\n  get duration() {\n    this.assertUsable(\"duration\");\n    const duration = this.element.duration;\n    return Number.isFinite(duration) ? duration : 0;\n  }\n  get playing() {\n    this.assertUsable(\"playing\");\n    return !this.element.paused && !this.element.ended;\n  }\n  get paused() {\n    this.assertUsable(\"paused\");\n    return this.isLoaded && !this.playing;\n  }\n  get isLoaded() {\n    this.assertUsable(\"isLoaded\");\n    return this.element.readyState >= 2;\n  }\n  get isBuffering() {\n    this.assertUsable(\"isBuffering\");\n    return this.buffering;\n  }\n  get isAudioSamplingSupported() {\n    return false;\n  }\n  get loop() {\n    this.assertUsable(\"loop\");\n    return this.element.loop;\n  }\n  set loop(value) {\n    this.assertUsable(\"loop\");\n    assertFlag(value, \"AudioPlayer.loop\");\n    this.element.loop = value;\n  }\n  get muted() {\n    this.assertUsable(\"muted\");\n    return this.element.muted;\n  }\n  set muted(value) {\n    this.assertUsable(\"muted\");\n    assertFlag(value, \"AudioPlayer.muted\");\n    this.element.muted = value;\n  }\n  get volume() {\n    this.assertUsable(\"volume\");\n    return this.element.volume;\n  }\n  set volume(value) {\n    this.assertUsable(\"volume\");\n    assertVolume(value, \"AudioPlayer.volume\");\n    this.element.volume = value;\n  }\n  get playbackRate() {\n    this.assertUsable(\"playbackRate\");\n    return this.element.playbackRate;\n  }\n  get shouldCorrectPitch() {\n    this.assertUsable(\"shouldCorrectPitch\");\n    return this.element.preservesPitch;\n  }\n  set shouldCorrectPitch(value) {\n    this.assertUsable(\"shouldCorrectPitch\");\n    assertFlag(value, \"AudioPlayer.shouldCorrectPitch\");\n    this.element.preservesPitch = value;\n  }\n  play() {\n    this.assertUsable(\"play\");\n    this.finished = false;\n    const started = this.element.play();\n    if (started && typeof started.catch === \"function\") {\n      started.catch((error) => {\n        this.failure = error instanceof Error ? error.message : \"audio playback failed\";\n      });\n    }\n  }\n  pause() {\n    this.assertUsable(\"pause\");\n    this.element.pause();\n  }\n  seekTo(seconds, toleranceMillisBefore, toleranceMillisAfter) {\n    this.assertUsable(\"seekTo\");\n    assertSeconds(seconds, \"AudioPlayer.seekTo\");\n    if (toleranceMillisBefore !== void 0) {\n      assertTolerance(toleranceMillisBefore, \"AudioPlayer.seekTo\");\n    }\n    if (toleranceMillisAfter !== void 0) {\n      assertTolerance(toleranceMillisAfter, \"AudioPlayer.seekTo\");\n    }\n    this.finished = false;\n    this.element.currentTime = seconds;\n    if (!this.element.seeking) return Promise.resolve();\n    return new Promise((resolve) => {\n      this.element.addEventListener(\"seeked\", () => resolve(), { once: true });\n    });\n  }\n  replace(source) {\n    this.assertUsable(\"replace\");\n    const normalized = normalizeSource(source, \"AudioPlayer.replace\");\n    this.finished = false;\n    this.failure = null;\n    if (normalized.uri === void 0) {\n      this.element.removeAttribute(\"src\");\n    } else {\n      this.element.src = normalized.uri;\n    }\n    this.element.load();\n  }\n  remove() {\n    if (this.removed) return;\n    this.removed = true;\n    this.events.removeAll();\n    this.element.pause();\n    this.element.removeAttribute(\"src\");\n    this.element.load();\n  }\n  getStatus() {\n    this.assertUsable(\"getStatus\");\n    return {\n      currentTime: this.currentTime,\n      didJustFinish: this.finished,\n      duration: this.duration,\n      error: this.failure,\n      id: this.playerId,\n      isBuffering: this.isBuffering,\n      isLoaded: this.isLoaded,\n      loop: this.loop,\n      mute: this.muted,\n      playbackRate: this.playbackRate,\n      playing: this.playing,\n      shouldCorrectPitch: this.shouldCorrectPitch\n    };\n  }\n  setPlaybackRate(rate, pitchCorrectionQuality) {\n    this.assertUsable(\"setPlaybackRate\");\n    assertRate(rate, \"AudioPlayer.setPlaybackRate\");\n    if (pitchCorrectionQuality !== void 0) {\n      assertPitchQuality(pitchCorrectionQuality, \"AudioPlayer.setPlaybackRate\");\n    }\n    if (rate < 0 || rate > 2) throw rateError(\"AudioPlayer.setPlaybackRate\");\n    this.element.playbackRate = rate;\n  }\n  addListener(event, listener) {\n    this.assertUsable(\"addListener\");\n    return this.events.add(event, listener);\n  }\n  removeAllListeners() {\n    this.events.removeAll();\n  }\n  assertUsable(verb) {\n    if (this.removed) throw new Error(`AudioPlayer.${verb}: the player was removed`);\n  }\n}\nfunction createPlayer(source = null, options = {}) {\n  const normalized = normalizeSource(source, \"Audio.createPlayer\");\n  const updateIntervalMs = resolveUpdateInterval(options, \"Audio.createPlayer\");\n  assertCrossOrigin(options.crossOrigin, \"Audio.createPlayer\");\n  const element = new Audio();\n  element.preload = \"auto\";\n  if (options.crossOrigin !== void 0) element.crossOrigin = options.crossOrigin;\n  if (normalized.uri !== void 0) element.src = normalized.uri;\n  const id = `player-${AudioPlayerId.next++}`;\n  return new AudioPlayer(element, id, updateIntervalMs);\n}\nconst AudioPlayerId = { next: 1 };\nexport {\n  AudioPlayer,\n  createPlayer\n};\n//# sourceMappingURL=player.js.map\n"],"mappings":"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"}