audio.player.manager.ts 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import AudioPlayer from '@/app/components/base/audio-btn/audio'
  2. declare global {
  3. // eslint-disable-next-line ts/consistent-type-definitions
  4. interface AudioPlayerManager {
  5. instance: AudioPlayerManager
  6. }
  7. }
  8. export class AudioPlayerManager {
  9. private static instance: AudioPlayerManager
  10. private audioPlayers: AudioPlayer | null = null
  11. private msgId: string | undefined
  12. // eslint-disable-next-line
  13. private constructor() {
  14. }
  15. public static getInstance(): AudioPlayerManager {
  16. if (!AudioPlayerManager.instance) {
  17. AudioPlayerManager.instance = new AudioPlayerManager()
  18. this.instance = AudioPlayerManager.instance
  19. }
  20. return AudioPlayerManager.instance
  21. }
  22. public getAudioPlayer(url: string, isPublic: boolean, id: string | undefined, msgContent: string | null | undefined, voice: string | undefined, callback: ((event: string) => {}) | null): AudioPlayer {
  23. if (this.msgId && this.msgId === id && this.audioPlayers) {
  24. this.audioPlayers.setCallback(callback)
  25. return this.audioPlayers
  26. }
  27. else {
  28. if (this.audioPlayers) {
  29. try {
  30. this.audioPlayers.pauseAudio()
  31. this.audioPlayers.cacheBuffers = []
  32. this.audioPlayers.sourceBuffer?.abort()
  33. }
  34. catch (e) {
  35. }
  36. }
  37. this.msgId = id
  38. this.audioPlayers = new AudioPlayer(url, isPublic, id, msgContent, voice, callback)
  39. return this.audioPlayers
  40. }
  41. }
  42. public resetMsgId(msgId: string) {
  43. this.msgId = msgId
  44. this.audioPlayers?.resetMsgId(msgId)
  45. }
  46. }