11import { Module } from '~/script' ;
22
3- type AudioPlayerEvents = {
4- 'audio:register' : { track : string [ ] ; fx : Record < string , string > } ;
5- 'audio:enable' : void ;
6- 'audio:disable' : void ;
7- 'audio:restart' : void ;
8- 'audio:play' : void ;
9- 'audio:fx' : string ;
10- 'audio:pause' : void ;
11- 'audio:stop' : void ;
3+ export type SoundRegister = {
4+ track : string [ ] ;
5+ fx : Record < string , string >
126} ;
137
14- declare global {
15- interface AtomicRelay extends AudioPlayerEvents { }
16- }
17-
188export function AudioPlayer ( ) {
19- return (
20- < Module name = " audio" >
21- { ( { mod , $ } ) => {
22- let trackList : string [ ] = [ ] ;
23- let fx : Record < string , HTMLAudioElement > = { } ;
24- let audioIdx = 0 ;
25- let isStopped = false ;
26- let isEnabled = false ;
27-
28- // Shared track audio element
29- const track_audio = $ . create ( 'audio' , {
30- attrs : { preload : 'auto' , crossOrigin : 'anonymous' } ,
31- } ) ;
32- document . body . appendChild ( track_audio ) ;
33-
34- function playTrack ( index : number ) {
35- if ( ! isEnabled ) return ;
36-
37- isStopped = false ;
38-
39- const src = trackList [ index % trackList . length ] ;
40- track_audio . pause ( ) ;
41- track_audio . src = src ;
42- track_audio . load ( ) ;
43-
44- track_audio . oncanplaythrough = ( ) => {
45- if ( ! isStopped && isEnabled ) track_audio . play ( ) . catch ( ( ) => { } ) ;
46- } ;
47-
48- track_audio . onended = ( ) => {
49- if ( ! isStopped && isEnabled ) {
50- audioIdx ++ ;
51- playTrack ( audioIdx ) ;
52- }
53- } ;
54- }
9+ return Module ( {
10+ name : ' audio' ,
11+ mod : ( { $ } ) => {
12+ let trackList : string [ ] = [ ] ;
13+ let fx : Record < string , HTMLAudioElement > = { } ;
14+ let audioIdx = 0 ;
15+ let isStopped = false ;
16+ let isEnabled = false ;
17+
18+ // Shared track audio element
19+ const track_audio = $ . create ( 'audio' , {
20+ attrs : { preload : 'auto' , crossOrigin : 'anonymous' } ,
21+ } ) ;
22+ document . body . appendChild ( track_audio ) ;
23+
24+ function playTrack ( index : number ) {
25+ if ( ! isEnabled ) return ;
26+
27+ isStopped = false ;
28+
29+ const src = trackList [ index % trackList . length ] ;
30+ track_audio . pause ( ) ;
31+ track_audio . src = src ;
32+ track_audio . load ( ) ;
33+
34+ track_audio . oncanplaythrough = ( ) => {
35+ if ( ! isStopped && isEnabled ) track_audio . play ( ) . catch ( ( ) => { } ) ;
36+ } ;
37+
38+ track_audio . onended = ( ) => {
39+ if ( ! isStopped && isEnabled ) {
40+ audioIdx ++ ;
41+ playTrack ( audioIdx ) ;
42+ }
43+ } ;
44+ }
5545
56- mod . $subscribe ( 'audio:register' , ( val ) => {
46+ return {
47+ register : ( val :SoundRegister ) => {
5748 trackList = val . track ;
5849 audioIdx = 0 ;
5950
@@ -72,34 +63,26 @@ export function AudioPlayer() {
7263 if ( ! track_audio . paused ) track_audio . pause ( ) ;
7364 track_audio . src = trackList [ 0 ] ;
7465 track_audio . load ( ) ;
75- } ) ;
76-
77- /* Enable audio event */
78- mod . $subscribe ( 'audio:enable' , ( ) => ( isEnabled = true ) ) ;
79-
80- /* Disable audio event */
81- mod . $subscribe ( 'audio:disable' , ( ) => ( isEnabled = false ) ) ;
82-
83- mod . $subscribe ( 'audio:restart' , ( ) => {
66+ } ,
67+ enable : ( ) => isEnabled = true ,
68+ disable : ( ) => isEnabled = false ,
69+ restart : ( ) => {
8470 audioIdx = 0 ;
8571 playTrack ( audioIdx ) ;
86- } ) ;
87-
88- mod . $subscribe ( 'audio:play' , ( ) => {
72+ } ,
73+ play : ( ) => {
8974 if ( ! isEnabled ) return ;
9075 if ( ! track_audio . src && trackList . length ) {
9176 playTrack ( audioIdx ) ;
9277 } else {
9378 track_audio . play ( ) . catch ( ( ) => { } ) ;
9479 }
95- } ) ;
96-
97- mod . $subscribe ( 'audio:pause' , ( ) => {
80+ } ,
81+ pause : ( ) => {
9882 if ( ! isEnabled ) return ;
9983 track_audio . pause ( ) ;
100- } ) ;
101-
102- mod . $subscribe ( 'audio:stop' , ( ) => {
84+ } ,
85+ stop : ( ) => {
10386 isStopped = true ;
10487 isEnabled = false ;
10588
@@ -109,9 +92,8 @@ export function AudioPlayer() {
10992 trackList = [ ] ;
11093 fx = { } ;
11194 audioIdx = 0 ;
112- } ) ;
113-
114- mod . $subscribe ( 'audio:fx' , ( key ) => {
95+ } ,
96+ fx : ( key :string ) => {
11597 if ( ! isEnabled ) return ;
11698 const snd = fx [ key ] ;
11799 if ( snd ) {
@@ -122,8 +104,8 @@ export function AudioPlayer() {
122104 /* Noop */
123105 }
124106 }
125- } ) ;
126- } }
127- </ Module >
128- ) ;
107+ } ,
108+ }
109+ } ,
110+ } ) ;
129111}
0 commit comments