{ "version": 3, "sources": ["src/app/shared/audio-player/tcs-audio-player.ts"], "sourcesContent": ["import { BehaviorSubject, combineLatest, fromEvent, Observable } from 'rxjs';\r\nimport { distinctUntilChanged, map, startWith, take } from 'rxjs/operators';\r\nimport { isNullOrWhitespace } from 'src/util/string';\r\nimport { getOrElse } from 'src/util/values';\r\n\r\nexport interface TcsAudioPlayerOptions {\r\n loop?: boolean;\r\n load?: boolean;\r\n volume?: number;\r\n}\r\n\r\nexport class TcsAudioPlayer {\r\n private readonly _player = new Audio();\r\n private readonly _loaded$ = new BehaviorSubject(false);\r\n private readonly _playing$ = new BehaviorSubject(false);\r\n private readonly _volume$ = new BehaviorSubject(1);\r\n private readonly _muted$ = new BehaviorSubject(false);\r\n private readonly _position$ = new BehaviorSubject(0);\r\n private readonly _error$ = new BehaviorSubject(null);\r\n\r\n public readonly audioLoaded$: Observable;\r\n public readonly ready$: Observable;\r\n public readonly playing$: Observable;\r\n public readonly volume$: Observable;\r\n public readonly muted$: Observable;\r\n public readonly position$: Observable;\r\n public readonly error$: Observable;\r\n\r\n get volume() {\r\n return this._player.volume;\r\n }\r\n set volume(value: number) {\r\n this._player.volume = value > 1 ? 1 : value < 0 ? 0 : value;\r\n this._volume$.next(this._player.volume);\r\n }\r\n\r\n get muted() {\r\n return this._player.muted;\r\n }\r\n set muted(value: boolean) {\r\n this._player.muted = value;\r\n this._muted$.next(value);\r\n }\r\n\r\n get length(): number {\r\n return this._player.seekable.end(0);\r\n }\r\n\r\n constructor(public readonly src: string, options: TcsAudioPlayerOptions = {}) {\r\n if (isNullOrWhitespace(src)) {\r\n throw new Error('Audio player source expected');\r\n }\r\n this._player.src = src;\r\n this._player.loop = getOrElse(options.loop, false);\r\n this._player.volume = getOrElse(options.volume, 1);\r\n this._player.onplaying = () => this._playing$.next(true);\r\n this._player.onended = () => this._playing$.next(false);\r\n this._player.onpause = () => this._playing$.next(false);\r\n this._player.onloadedmetadata = () => this._loaded$.next(true);\r\n this._player.ontimeupdate = () => this._position$.next(this._player.currentTime);\r\n this._player.onerror = () => this._error$.next(this._player.error);\r\n\r\n const windowClicked$ = fromEvent(window, 'click').pipe(\r\n map(() => true),\r\n startWith(false),\r\n take(2),\r\n );\r\n this.audioLoaded$ = this._loaded$.asObservable().pipe(distinctUntilChanged());\r\n this.ready$ = combineLatest([this._loaded$, windowClicked$]).pipe(\r\n map(([loaded, clicked]) => loaded && clicked),\r\n distinctUntilChanged(),\r\n );\r\n this.playing$ = this._playing$.asObservable().pipe(distinctUntilChanged());\r\n this.volume$ = this._volume$.asObservable().pipe(distinctUntilChanged());\r\n this.muted$ = this._muted$.asObservable().pipe(distinctUntilChanged());\r\n this.position$ = this._position$.asObservable().pipe(distinctUntilChanged());\r\n this.error$ = this._error$.asObservable().pipe(distinctUntilChanged());\r\n\r\n if (options.load != null && options.load) {\r\n this._player.load();\r\n }\r\n }\r\n\r\n public play() {\r\n try {\r\n this._player.play();\r\n } catch {}\r\n }\r\n\r\n public pause() {\r\n this._player.pause();\r\n }\r\n\r\n public stop() {\r\n if (this._playing$.value) {\r\n this._player.currentTime = 0;\r\n this._player.pause();\r\n }\r\n }\r\n\r\n public load() {\r\n this._player.load();\r\n }\r\n}\r\n"], "mappings": "oIAWM,IAAOA,EAAP,KAAqB,CAiBzB,IAAIC,QAAM,CACR,OAAO,KAAKC,QAAQD,MACtB,CACA,IAAIA,OAAOE,EAAa,CACtB,KAAKD,QAAQD,OAASE,EAAQ,EAAI,EAAIA,EAAQ,EAAI,EAAIA,EACtD,KAAKC,SAASC,KAAK,KAAKH,QAAQD,MAAM,CACxC,CAEA,IAAIK,OAAK,CACP,OAAO,KAAKJ,QAAQI,KACtB,CACA,IAAIA,MAAMH,EAAc,CACtB,KAAKD,QAAQI,MAAQH,EACrB,KAAKI,QAAQF,KAAKF,CAAK,CACzB,CAEA,IAAIK,QAAM,CACR,OAAO,KAAKN,QAAQO,SAASC,IAAI,CAAC,CACpC,CAEAC,YAA4BC,EAAaC,EAAiC,CAAA,EAAE,CAC1E,GAD0B,KAAAD,IAAAA,EApCX,KAAAV,QAAU,IAAIY,MACd,KAAAC,SAAW,IAAIC,EAAgB,EAAK,EACpC,KAAAC,UAAY,IAAID,EAAgB,EAAK,EACrC,KAAAZ,SAAW,IAAIY,EAAgB,CAAC,EAChC,KAAAT,QAAU,IAAIS,EAAgB,EAAK,EACnC,KAAAE,WAAa,IAAIF,EAAgB,CAAC,EAClC,KAAAG,QAAU,IAAIH,EAAmC,IAAI,EA+BhEI,EAAmBR,CAAG,EACxB,MAAM,IAAIS,MAAM,8BAA8B,EAEhD,KAAKnB,QAAQU,IAAMA,EACnB,KAAKV,QAAQoB,KAAOC,EAAUV,EAAQS,KAAM,EAAK,EACjD,KAAKpB,QAAQD,OAASsB,EAAUV,EAAQZ,OAAQ,CAAC,EACjD,KAAKC,QAAQsB,UAAY,IAAM,KAAKP,UAAUZ,KAAK,EAAI,EACvD,KAAKH,QAAQuB,QAAU,IAAM,KAAKR,UAAUZ,KAAK,EAAK,EACtD,KAAKH,QAAQwB,QAAU,IAAM,KAAKT,UAAUZ,KAAK,EAAK,EACtD,KAAKH,QAAQyB,iBAAmB,IAAM,KAAKZ,SAASV,KAAK,EAAI,EAC7D,KAAKH,QAAQ0B,aAAe,IAAM,KAAKV,WAAWb,KAAK,KAAKH,QAAQ2B,WAAW,EAC/E,KAAK3B,QAAQ4B,QAAU,IAAM,KAAKX,QAAQd,KAAK,KAAKH,QAAQ6B,KAAK,EAEjE,IAAMC,EAAiBC,EAAUC,OAAQ,OAAO,EAAEC,KAChDC,EAAI,IAAM,EAAI,EACdC,EAAU,EAAK,EACfC,EAAK,CAAC,CAAC,EAET,KAAKC,aAAe,KAAKxB,SAASyB,aAAY,EAAGL,KAAKM,EAAoB,CAAE,EAC5E,KAAKC,OAASC,EAAc,CAAC,KAAK5B,SAAUiB,CAAc,CAAC,EAAEG,KAC3DC,EAAI,CAAC,CAACQ,EAAQC,CAAO,IAAMD,GAAUC,CAAO,EAC5CJ,EAAoB,CAAE,EAExB,KAAKK,SAAW,KAAK7B,UAAUuB,aAAY,EAAGL,KAAKM,EAAoB,CAAE,EACzE,KAAKM,QAAU,KAAK3C,SAASoC,aAAY,EAAGL,KAAKM,EAAoB,CAAE,EACvE,KAAKO,OAAS,KAAKzC,QAAQiC,aAAY,EAAGL,KAAKM,EAAoB,CAAE,EACrE,KAAKQ,UAAY,KAAK/B,WAAWsB,aAAY,EAAGL,KAAKM,EAAoB,CAAE,EAC3E,KAAKS,OAAS,KAAK/B,QAAQqB,aAAY,EAAGL,KAAKM,EAAoB,CAAE,EAEjE5B,EAAQsC,MAAQ,MAAQtC,EAAQsC,MAClC,KAAKjD,QAAQiD,KAAI,CAErB,CAEOC,MAAI,CACT,GAAI,CACF,KAAKlD,QAAQkD,KAAI,OACX,CAAA,CACV,CAEOC,OAAK,CACV,KAAKnD,QAAQmD,MAAK,CACpB,CAEOC,MAAI,CACL,KAAKrC,UAAUd,QACjB,KAAKD,QAAQ2B,YAAc,EAC3B,KAAK3B,QAAQmD,MAAK,EAEtB,CAEOF,MAAI,CACT,KAAKjD,QAAQiD,KAAI,CACnB", "names": ["TcsAudioPlayer", "volume", "_player", "value", "_volume$", "next", "muted", "_muted$", "length", "seekable", "end", "constructor", "src", "options", "Audio", "_loaded$", "BehaviorSubject", "_playing$", "_position$", "_error$", "isNullOrWhitespace", "Error", "loop", "getOrElse", "onplaying", "onended", "onpause", "onloadedmetadata", "ontimeupdate", "currentTime", "onerror", "error", "windowClicked$", "fromEvent", "window", "pipe", "map", "startWith", "take", "audioLoaded$", "asObservable", "distinctUntilChanged", "ready$", "combineLatest", "loaded", "clicked", "playing$", "volume$", "muted$", "position$", "error$", "load", "play", "pause", "stop"] }