Skip to content

Commit 7fdfebf

Browse files
committed
add a audio module
1 parent d2cfd39 commit 7fdfebf

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed

src/app/modules/audio.ts

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import { EMPTY_FUNCTION } from '../../constant';
2+
interface Options {
3+
src: string,
4+
autoPlay: boolean,
5+
loop: boolean,
6+
onPlay: Function,
7+
onPause: Function,
8+
onEnded: Function
9+
};
10+
11+
export default class Audio {
12+
static readonly defaultOptions: Options = {
13+
src: '',
14+
autoPlay: false,
15+
loop: false,
16+
onPlay: EMPTY_FUNCTION,
17+
onPause: EMPTY_FUNCTION,
18+
onEnded: EMPTY_FUNCTION
19+
}
20+
21+
public isPlaying: boolean = false;
22+
private element: HTMLAudioElement;
23+
24+
constructor (options: Options) {
25+
options = { ...options, ...Audio.defaultOptions };
26+
this.element = this.createAudioElement(options);
27+
}
28+
29+
private createAudioElement (options: Options): HTMLAudioElement {
30+
const wrapEvent = (userEvent = EMPTY_FUNCTION, proxyEvent = EMPTY_FUNCTION) => {
31+
return (event: Event) => {
32+
try {
33+
proxyEvent(event);
34+
}
35+
finally
36+
{
37+
userEvent(event);
38+
}
39+
};
40+
};
41+
42+
const onPlay = () => {
43+
this.isPlaying = true;
44+
};
45+
const onPause = () => {
46+
this.isPlaying = false;
47+
};
48+
const onEnded = () => {
49+
this.isPlaying = !options.loop;
50+
}
51+
52+
let element = document.createElement('audio');
53+
element.autoplay = options.autoPlay;
54+
element.setAttribute('src', options.src);
55+
element.setAttribute('loop', options.loop ? 'loop' : '');
56+
57+
// events for audio
58+
element.onplay = wrapEvent(options.onPlay, onPlay);
59+
element.onpause = wrapEvent(options.onPause, onPause);
60+
element.onended = wrapEvent(options.onEnded, onEnded);
61+
62+
return element;
63+
}
64+
65+
public play () {
66+
this.element.play();
67+
}
68+
69+
public pause () {
70+
this.element.pause();
71+
}
72+
}

0 commit comments

Comments
 (0)