Skip to content

Commit 12febdb

Browse files
committed
fix onEnded feature if using media element
1 parent 6fa4e89 commit 12febdb

File tree

2 files changed

+13
-13
lines changed

2 files changed

+13
-13
lines changed

src/library/audio.ts

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,6 @@ interface IMediaElementAudioSourceOptions extends MediaElementAudioSourceOptions
6666
loop: boolean;
6767
}
6868

69-
interface IMediaElementAudioSourceNode extends MediaElementAudioSourceNode {
70-
onended: IOnEnded;
71-
loop: boolean;
72-
}
73-
7469
export interface IChangeVolumeOptions {
7570
volume: number;
7671
sound?: ISound;
@@ -388,18 +383,18 @@ class PlayerAudio {
388383
public async createMediaElementSourceNode(sourceNodeOptions: IMediaElementAudioSourceOptions, sound: ISound): Promise<void> {
389384

390385
const audioContext = await this.getAudioContext();
391-
let mediaElementAudioSourceNode: IMediaElementAudioSourceNode;
386+
let mediaElementAudioSourceNode: MediaElementAudioSourceNode;
392387

393388
try {
394-
mediaElementAudioSourceNode = audioContext.createMediaElementSource(sourceNodeOptions.mediaElement) as IMediaElementAudioSourceNode;
389+
mediaElementAudioSourceNode = audioContext.createMediaElementSource(sourceNodeOptions.mediaElement) as MediaElementAudioSourceNode;
395390
} catch (error) {
396391
throw new PlayerError(error);
397392
}
398393

399394
sound.mediaElementAudioSourceNode = mediaElementAudioSourceNode;
400395

401396
// do we loop this song
402-
mediaElementAudioSourceNode.loop = sourceNodeOptions.loop;
397+
mediaElementAudioSourceNode.mediaElement.loop = sourceNodeOptions.loop;
403398

404399
// ??? no onEnded on MediaElementSource: https://developer.mozilla.org/en-US/docs/Web/API/AudioScheduledSourceNode/onended
405400
// ??? mediaElementAudioSourceNode.mediaElement.ended
@@ -408,7 +403,8 @@ class PlayerAudio {
408403
// NOTE: the onEnded handler won't have any effect if the loop property is set to
409404
// true, as the audio won't stop playing. To see the effect in this case you'd
410405
// have to use AudioBufferSourceNode.stop()
411-
mediaElementAudioSourceNode.onended = (): void => {
406+
mediaElementAudioSourceNode.mediaElement.onended = (): void => {
407+
sourceNodeOptions.onEnded();
412408
this.destroySourceNode(sound);
413409
// TODO on end destroy the audio element, probably not if loop enabled, but if loop
414410
// is disabled, maybe still a good idea to keep it (cache?), but not all audio elements
@@ -417,7 +413,7 @@ class PlayerAudio {
417413

418414
}
419415

420-
public connectSourceNodeToGraphNodes(sourceNode: AudioBufferSourceNode | IMediaElementAudioSourceNode): void {
416+
public connectSourceNodeToGraphNodes(sourceNode: AudioBufferSourceNode | MediaElementAudioSourceNode): void {
421417

422418
// audio routing graph
423419
this.getAudioGraph().then((audioGraph: IAudioGraph) => {
@@ -576,4 +572,4 @@ class PlayerAudio {
576572

577573
}
578574

579-
export { PlayerAudio, IAudioGraph, IAudioOptions, IAudioBufferSourceOptions, IMediaElementAudioSourceOptions, IMediaElementAudioSourceNode };
575+
export { PlayerAudio, IAudioGraph, IAudioOptions, IAudioBufferSourceOptions, IMediaElementAudioSourceOptions };

src/library/core.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import {
55
IAudioOptions,
66
IAudioBufferSourceOptions,
77
IMediaElementAudioSourceOptions,
8-
IMediaElementAudioSourceNode
98
} from './audio';
109
import { PlayerRequest } from './request';
1110
import { PlayerError, IPlayerError } from './error';
@@ -696,6 +695,7 @@ export class PlayerCore {
696695
}
697696

698697
// whichSound is optional, if set it can be the sound id or if it's a string it can be next / previous / first / last
698+
// TODO: next / previous ... should be constants, more accurate to compare and would also allow id to be string or number
699699
const sound = this._getSoundFromQueue({ whichSound });
700700

701701
// if there is no sound we could play, do nothing
@@ -763,6 +763,7 @@ export class PlayerCore {
763763
const sourceOptions: IAudioBufferSourceOptions = {
764764
loop: sound.loop,
765765
onEnded: (event: Event) => {
766+
this._onEnded()
766767
console.log('AudioBufferSourceNode ended', event);
767768
}
768769
};
@@ -806,6 +807,7 @@ export class PlayerCore {
806807
const sourceOptions: IMediaElementAudioSourceOptions = {
807808
loop: sound.loop,
808809
onEnded: (event: Event) => {
810+
this._onEnded()
809811
console.log('MediaElementSourceNode ended', event);
810812
},
811813
mediaElement: sound.audioElement
@@ -820,7 +822,7 @@ export class PlayerCore {
820822

821823
}
822824

823-
const mediaElementAudioSourceNode: IMediaElementAudioSourceNode = sound.mediaElementAudioSourceNode as IMediaElementAudioSourceNode;
825+
const mediaElementAudioSourceNode: MediaElementAudioSourceNode = sound.mediaElementAudioSourceNode as MediaElementAudioSourceNode;
824826

825827
// connect the source to the graph node(s)
826828
this._playerAudio.connectSourceNodeToGraphNodes(mediaElementAudioSourceNode);
@@ -1293,6 +1295,8 @@ export class PlayerCore {
12931295

12941296
sound.onPlaying(playingPercentage, duration, sound.playTime);
12951297

1298+
1299+
12961300
}
12971301

12981302
public setAudioGraph(customAudioGraph: IAudioGraph): void {

0 commit comments

Comments
 (0)