@@ -11,6 +11,40 @@ void playedAndMixed(void* data) {
1111}
1212#endif
1313
14+ // ID to the beat and bass loops
15+ EMSCRIPTEN_WEBAUDIO_T beatHnd = 0 ;
16+ EMSCRIPTEN_WEBAUDIO_T bassHnd = 0 ;
17+
18+ // Creates a MediaElementAudioSourceNode with the supplied URL (which is
19+ // registered as an internal audio object and the ID returned).
20+ EM_JS (EMSCRIPTEN_WEBAUDIO_T , createTrack , (EMSCRIPTEN_WEBAUDIO_T ctxHnd , const char * url , bool looping ), {
21+ var context = emscriptenGetAudioObject (ctxHnd );
22+ if (context ) {
23+ var audio = document .createElement ('audio' );
24+ audio .src = UTF8ToString (url );
25+ audio .loop = looping ;
26+ var track = context .createMediaElementSource (audio );
27+ return emscriptenRegisterAudioObject (track );
28+ }
29+ return 0 ;
30+ });
31+
32+ // Toggles the play/pause of a MediaElementAudioSourceNode given its ID
33+ EM_JS (void , toggleTrack , (EMSCRIPTEN_WEBAUDIO_T srcHnd ), {
34+ var source = emscriptenGetAudioObject (srcHnd );
35+ if (source ) {
36+ var audio = source .mediaElement ;
37+ if (audio ) {
38+ if (audio .paused ) {
39+ audio .currentTime = 0 ;
40+ audio .play ();
41+ } else {
42+ audio .pause ();
43+ }
44+ }
45+ }
46+ });
47+
1448// Adds a button to play and stop an audio file
1549EM_JS (bool , addAudio , (EMSCRIPTEN_WEBAUDIO_T ctxHnd , EMSCRIPTEN_AUDIO_WORKLET_NODE_T nodeHnd , int index , const char * url , const char * label ), {
1650 var context = emscriptenGetAudioObject (ctxHnd );
@@ -55,6 +89,18 @@ bool process(int numInputs, const AudioSampleFrame* inputs, int numOutputs, Audi
5589 return true;
5690}
5791
92+ bool onClick (int type , const EmscriptenMouseEvent * e , void * data ) {
93+ printf ("Click event!\n" );
94+ EMSCRIPTEN_WEBAUDIO_T ctx = (EMSCRIPTEN_WEBAUDIO_T ) (data );
95+ if (emscripten_audio_context_state (ctx ) != AUDIO_CONTEXT_STATE_RUNNING ) {
96+ emscripten_resume_audio_context_sync (ctx );
97+
98+ toggleTrack (beatHnd );
99+ toggleTrack (bassHnd );
100+ }
101+ return false;
102+ }
103+
58104void processorCreated (EMSCRIPTEN_WEBAUDIO_T context , bool success , void * data ) {
59105 if (success ) {
60106 printf ("Audio worklet processor created\n" );
@@ -68,8 +114,18 @@ void processorCreated(EMSCRIPTEN_WEBAUDIO_T context, bool success, void* data) {
68114 EMSCRIPTEN_AUDIO_WORKLET_NODE_T worklet = emscripten_create_wasm_audio_worklet_node (context , "mixer" , & opts , & process , NULL );
69115 emscripten_audio_node_connect (worklet , context , 0 , 0 );
70116
71- addAudio (context , worklet , 0 , "audio_files/emscripten-beat.mp3" , "Toggle Beat" );
72- addAudio (context , worklet , 1 , "audio_files/emscripten-bass.mp3" , "Toggle Bass" );
117+ beatHnd = createTrack (context , "audio_files/emscripten-beat.mp3" , true);
118+ if (beatHnd ) {
119+ emscripten_audio_node_connect (beatHnd , worklet , 0 , 0 );
120+ }
121+ EMSCRIPTEN_WEBAUDIO_T bassHnd = createTrack (context , "audio_files/emscripten-bass.mp3" , true);
122+ if (bassHnd ) {
123+ emscripten_audio_node_connect (bassHnd , worklet , 0 , 1 );
124+ }
125+
126+ emscripten_set_click_callback (EMSCRIPTEN_EVENT_TARGET_DOCUMENT , (void * ) (context ), false, & onClick );
127+ //addAudio(context, worklet, 0, "audio_files/emscripten-beat.mp3", "Toggle Beat");
128+ //addAudio(context, worklet, 1, "audio_files/emscripten-bass.mp3", "Toggle Bass");
73129 } else {
74130 printf ("Audio worklet node creation failed\n" );
75131 }
0 commit comments