Skip to content

Commit ac37140

Browse files
committed
Work-in-progress (reusable audio creation and playback)
1 parent a26194d commit ac37140

File tree

1 file changed

+58
-2
lines changed

1 file changed

+58
-2
lines changed

test/webaudio/audioworklet_in_out_stereo.c

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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
1549
EM_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+
58104
void 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

Comments
 (0)