@@ -46,6 +46,12 @@ _Atomic Test whichTest = TEST_NOT_STARTED;
46
46
// Time at which the test starts taken in main()
47
47
double startTime = 0 ;
48
48
49
+ void do_exit () {
50
+ emscripten_out ("Test success" );
51
+ emscripten_terminate_all_wasm_workers ();
52
+ emscripten_force_exit (0 );
53
+ }
54
+
49
55
bool ProcessAudio (int numInputs , const AudioSampleFrame * inputs , int numOutputs , AudioSampleFrame * outputs , int numParams , const AudioParamFrame * params , void * userData ) {
50
56
assert (emscripten_current_thread_is_audio_worklet ());
51
57
@@ -120,37 +126,39 @@ EM_JS(void, InitHtmlUi, (EMSCRIPTEN_WEBAUDIO_T audioContext), {
120
126
};
121
127
});
122
128
123
- bool MainLoop ( double time , void * data ) {
129
+ void WorkerLoop ( ) {
124
130
assert (!emscripten_current_thread_is_audio_worklet ());
125
- static int didUnlock = false;
126
- switch (whichTest ) {
127
- case TEST_NOT_STARTED :
128
- emscripten_out ("Staring test (may need a button click)" );
129
- whichTest = TEST_HAS_WAIT ;
130
- break ;
131
- case TEST_WAIT_ACQUIRE :
132
- if (!didUnlock ) {
133
- emscripten_out ("main thread releasing lock" );
134
- // Release here to acquire in process
135
- emscripten_lock_release (& testLock );
136
- didUnlock = true;
137
- }
138
- break ;
139
- case TEST_WAIT_INFINTE_1 :
140
- // Spin here until released in process (but don't change test until we know this case ran)
141
- whichTest = TEST_WAIT_INFINTE_2 ;
142
- emscripten_lock_busyspin_waitinf_acquire (& testLock );
143
- emscripten_out ("TEST_WAIT_INFINTE (from main)" );
144
- break ;
145
- case TEST_DONE :
146
- // Finished, exit from the main thread
147
- emscripten_out ("Test success" );
148
- emscripten_force_exit (0 );
149
- return false;
150
- default :
151
- break ;
131
+ int didUnlock = false;
132
+ while (true) {
133
+ switch (whichTest ) {
134
+ case TEST_NOT_STARTED :
135
+ emscripten_out ("Staring test (may need a button click)" );
136
+ whichTest = TEST_HAS_WAIT ;
137
+ break ;
138
+ case TEST_WAIT_ACQUIRE :
139
+ if (!didUnlock ) {
140
+ emscripten_out ("main thread releasing lock" );
141
+ // Release here to acquire in process
142
+ emscripten_lock_release (& testLock );
143
+ didUnlock = true;
144
+ }
145
+ break ;
146
+ case TEST_WAIT_INFINTE_1 :
147
+ // Spin here until released in process (but don't change test until we know this case ran)
148
+ whichTest = TEST_WAIT_INFINTE_2 ;
149
+ emscripten_lock_busyspin_waitinf_acquire (& testLock );
150
+ emscripten_out ("TEST_WAIT_INFINTE (from main)" );
151
+ break ;
152
+ case TEST_DONE :
153
+ // Finished, exit from the main thread (and return out of this loop)
154
+ emscripten_wasm_worker_post_function_v (EMSCRIPTEN_WASM_WORKER_ID_PARENT , & do_exit );
155
+ return ;
156
+ default :
157
+ break ;
158
+ }
159
+ // Repeat every 16ms (except when TEST_DONE)
160
+ emscripten_wasm_worker_sleep (16 * 1000000ULL );
152
161
}
153
- return true;
154
162
}
155
163
156
164
void AudioWorkletProcessorCreated (EMSCRIPTEN_WEBAUDIO_T audioContext , bool success , void * userData ) {
@@ -169,16 +177,20 @@ void WebAudioWorkletThreadInitialized(EMSCRIPTEN_WEBAUDIO_T audioContext, bool s
169
177
uint8_t wasmAudioWorkletStack [2048 ];
170
178
171
179
int main () {
172
- // Main thread init and acquire (work passes to the processor)
180
+ // Main thread init and acquire (work passes to the audio processor)
173
181
emscripten_lock_init (& testLock );
174
182
int hasLock = emscripten_lock_busyspin_wait_acquire (& testLock , 0 );
175
183
assert (hasLock );
176
184
177
185
startTime = emscripten_get_now ();
178
186
187
+ // Audio processor callback setup
179
188
EMSCRIPTEN_WEBAUDIO_T context = emscripten_create_audio_context (NULL );
180
189
emscripten_start_wasm_audio_worklet_thread_async (context , wasmAudioWorkletStack , sizeof (wasmAudioWorkletStack ), WebAudioWorkletThreadInitialized , NULL );
181
- emscripten_set_timeout_loop (MainLoop , 10 , NULL );
190
+
191
+ // Worker thread setup
192
+ emscripten_wasm_worker_t worker = emscripten_malloc_wasm_worker (1024 );
193
+ emscripten_wasm_worker_post_function_v (worker , WorkerLoop );
182
194
183
195
emscripten_exit_with_live_runtime ();
184
196
}
0 commit comments