| | export class AudioQueue { |
| | constructor(audioElement) { |
| | this.audio = audioElement; |
| | this.queue = []; |
| | this.current = null; |
| | this.id = null; |
| |
|
| | this._onEnded = () => this.next(); |
| | this.audio.addEventListener('ended', this._onEnded); |
| |
|
| | this.onStopped = null; |
| | } |
| |
|
| | setId(newId) { |
| | console.log('Setting audio queue ID to:', newId); |
| | if (this.id !== newId) { |
| | this.stop(); |
| | this.id = newId; |
| | if (this.onStopped) this.onStopped({ event: 'id-change', id: newId }); |
| | } |
| | } |
| |
|
| | setPlaybackRate(rate) { |
| | console.log('Setting audio playback rate to:', rate); |
| | this.audio.playbackRate = rate; |
| | } |
| |
|
| | enqueue(url) { |
| | console.log('Enqueuing audio URL:', url); |
| | this.queue.push(url); |
| |
|
| | |
| | if (this.audio.paused && !this.current) { |
| | this.next(); |
| | } |
| | } |
| |
|
| | play() { |
| | if (!this.current && this.queue.length > 0) { |
| | this.next(); |
| | } else { |
| | this.audio.play(); |
| | } |
| | } |
| |
|
| | next() { |
| | this.current = this.queue.shift(); |
| | if (this.current) { |
| | this.audio.src = this.current; |
| | this.audio.play(); |
| | console.log('Playing audio URL:', this.current); |
| | } else { |
| | this.stop(); |
| | if (this.onStopped) this.onStopped({ event: 'empty-queue', id: this.id }); |
| | } |
| | } |
| |
|
| | stop() { |
| | this.audio.pause(); |
| | this.audio.currentTime = 0; |
| | this.audio.src = ''; |
| | this.queue = []; |
| | this.current = null; |
| | if (this.onStopped) this.onStopped({ event: 'stop', id: this.id }); |
| | } |
| |
|
| | destroy() { |
| | this.audio.removeEventListener('ended', this._onEnded); |
| | this.stop(); |
| | this.onStopped = null; |
| | this.audio = null; |
| | } |
| | } |
| |
|