From 760312a269acb692600ad61e4cb7ac010a372667 Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Wed, 6 Jan 2021 22:42:43 +0000 Subject: [PATCH] waver : emscripten version use single thread --- examples/CMakeLists.txt | 5 +- examples/waver/common.cpp | 164 +++++++++++++++++---------------- examples/waver/common.h | 4 +- examples/waver/index-tmpl.html | 1 + examples/waver/main.cpp | 9 +- 5 files changed, 99 insertions(+), 84 deletions(-) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 277f433..50ebf43 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -6,7 +6,7 @@ if (GGWAVE_SUPPORT_SDL2) # SDL2 if (EMSCRIPTEN) - set(CMAKE_CXX_FLAGS "-s USE_SDL=2 -s USE_PTHREADS=1 -s ASSERTIONS=1 -s DISABLE_EXCEPTION_CATCHING=0") + set(CMAKE_CXX_FLAGS "-s TOTAL_MEMORY=67108864 -s USE_SDL=2 -s ASSERTIONS=1 -s DISABLE_EXCEPTION_CATCHING=0 -s 'EXTRA_EXPORTED_RUNTIME_METHODS=[\"writeArrayToMemory\"]'") unset(SDL2_INCLUDE_DIRS) unset(SDL2_LIBRARIES) @@ -68,10 +68,7 @@ if (GGWAVE_SUPPORT_SDL2) if (EMSCRIPTEN) # emscripten sdl2 examples - set(CMAKE_CXX_FLAGS "-s TOTAL_MEMORY=67108864 -s USE_SDL=2 -s USE_PTHREADS=1 -s ASSERTIONS=1 -s DISABLE_EXCEPTION_CATCHING=0 -s 'EXTRA_EXPORTED_RUNTIME_METHODS=[\"writeArrayToMemory\"]'") add_subdirectory(ggwave-wasm) - - set(CMAKE_CXX_FLAGS "-s TOTAL_MEMORY=67108864 -s USE_SDL=2 -s USE_PTHREADS=1 -s ASSERTIONS=1 -s DISABLE_EXCEPTION_CATCHING=0") add_subdirectory(waver) else() # non-emscripten sdl2 examples diff --git a/examples/waver/common.cpp b/examples/waver/common.cpp index d8dda7b..46b7dde 100644 --- a/examples/waver/common.cpp +++ b/examples/waver/common.cpp @@ -434,7 +434,7 @@ bool isFileBroadcastMessage(const std::string & message) { return result; } -std::thread initMain() { +void initMain() { g_isRunning = true; g_ggWave = GGWave_instance(); @@ -488,86 +488,94 @@ std::thread initMain() { return 0; }); +} + +void updateCore() { + static Input inputCurrent; + + static int lastRxDataLength = 0; + static GGWave::TxRxData lastRxData; + + { + std::lock_guard lock(g_buffer.mutex); + if (g_buffer.inputCore.update) { + inputCurrent = std::move(g_buffer.inputCore); + g_buffer.inputCore.update = false; + } + } + + if (inputCurrent.update) { + g_ggWave->init( + (int) inputCurrent.message.data.size(), + inputCurrent.message.data.data(), + g_ggWave->getTxProtocols()[inputCurrent.message.protocolId], + 100*inputCurrent.message.volume); + + inputCurrent.update = false; + } + + GGWave_mainLoop(); + + lastRxDataLength = g_ggWave->takeRxData(lastRxData); + if (lastRxDataLength == -1) { + g_buffer.stateCore.update = true; + g_buffer.stateCore.flags.newMessage = true; + g_buffer.stateCore.message = { + true, + std::chrono::system_clock::now(), + "", + g_ggWave->getRxProtocolId(), + 0, + Message::Error, + }; + } else if (lastRxDataLength > 0) { + auto message = std::string((char *) lastRxData.data(), lastRxDataLength); + const Message::Type type = isFileBroadcastMessage(message) ? Message::FileBroadcast : Message::Text; + g_buffer.stateCore.update = true; + g_buffer.stateCore.flags.newMessage = true; + g_buffer.stateCore.message = { + true, + std::chrono::system_clock::now(), + std::move(message), + g_ggWave->getRxProtocolId(), + 0, + type, + }; + } + + if (g_ggWave->takeSpectrum(g_buffer.stateCore.spectrum)) { + g_buffer.stateCore.update = true; + g_buffer.stateCore.flags.newSpectrum = true; + } + + if (g_ggWave->takeTxAmplitudeData16(g_buffer.stateCore.txAmplitudeData)) { + g_buffer.stateCore.update = true; + g_buffer.stateCore.flags.newTxAmplitudeData = true; + } + + if (true) { + g_buffer.stateCore.update = true; + g_buffer.stateCore.flags.newStats = true; + g_buffer.stateCore.stats.isReceiving = g_ggWave->isReceiving(); + g_buffer.stateCore.stats.isAnalyzing = g_ggWave->isAnalyzing(); + g_buffer.stateCore.stats.framesToRecord = g_ggWave->getFramesToRecord(); + g_buffer.stateCore.stats.framesLeftToRecord = g_ggWave->getFramesLeftToRecord(); + g_buffer.stateCore.stats.framesToAnalyze = g_ggWave->getFramesToAnalyze(); + g_buffer.stateCore.stats.framesLeftToAnalyze = g_ggWave->getFramesLeftToAnalyze(); + } + + { + std::lock_guard lock(g_buffer.mutex); + g_buffer.stateCore.apply(g_buffer.stateUI); + } +} + +std::thread initMainAndRunCore() { + initMain(); return std::thread([&]() { - Input inputCurrent; - - int lastRxDataLength = 0; - GGWave::TxRxData lastRxData; - while (g_isRunning) { - { - std::lock_guard lock(g_buffer.mutex); - if (g_buffer.inputCore.update) { - inputCurrent = std::move(g_buffer.inputCore); - g_buffer.inputCore.update = false; - } - } - - if (inputCurrent.update) { - g_ggWave->init( - (int) inputCurrent.message.data.size(), - inputCurrent.message.data.data(), - g_ggWave->getTxProtocols()[inputCurrent.message.protocolId], - 100*inputCurrent.message.volume); - - inputCurrent.update = false; - } - - GGWave_mainLoop(); - - lastRxDataLength = g_ggWave->takeRxData(lastRxData); - if (lastRxDataLength == -1) { - g_buffer.stateCore.update = true; - g_buffer.stateCore.flags.newMessage = true; - g_buffer.stateCore.message = { - true, - std::chrono::system_clock::now(), - "", - g_ggWave->getRxProtocolId(), - 0, - Message::Error, - }; - } else if (lastRxDataLength > 0) { - auto message = std::string((char *) lastRxData.data(), lastRxDataLength); - const Message::Type type = isFileBroadcastMessage(message) ? Message::FileBroadcast : Message::Text; - g_buffer.stateCore.update = true; - g_buffer.stateCore.flags.newMessage = true; - g_buffer.stateCore.message = { - true, - std::chrono::system_clock::now(), - std::move(message), - g_ggWave->getRxProtocolId(), - 0, - type, - }; - } - - if (g_ggWave->takeSpectrum(g_buffer.stateCore.spectrum)) { - g_buffer.stateCore.update = true; - g_buffer.stateCore.flags.newSpectrum = true; - } - - if (g_ggWave->takeTxAmplitudeData16(g_buffer.stateCore.txAmplitudeData)) { - g_buffer.stateCore.update = true; - g_buffer.stateCore.flags.newTxAmplitudeData = true; - } - - if (true) { - g_buffer.stateCore.update = true; - g_buffer.stateCore.flags.newStats = true; - g_buffer.stateCore.stats.isReceiving = g_ggWave->isReceiving(); - g_buffer.stateCore.stats.isAnalyzing = g_ggWave->isAnalyzing(); - g_buffer.stateCore.stats.framesToRecord = g_ggWave->getFramesToRecord(); - g_buffer.stateCore.stats.framesLeftToRecord = g_ggWave->getFramesLeftToRecord(); - g_buffer.stateCore.stats.framesToAnalyze = g_ggWave->getFramesToAnalyze(); - g_buffer.stateCore.stats.framesLeftToAnalyze = g_ggWave->getFramesLeftToAnalyze(); - } - - { - std::lock_guard lock(g_buffer.mutex); - g_buffer.stateCore.apply(g_buffer.stateUI); - } + updateCore(); std::this_thread::sleep_for(std::chrono::milliseconds(1)); } diff --git a/examples/waver/common.h b/examples/waver/common.h index 99cba87..51e31f3 100644 --- a/examples/waver/common.h +++ b/examples/waver/common.h @@ -5,7 +5,9 @@ #include #include -std::thread initMain(); +std::thread initMainAndRunCore(); +void initMain(); +void updateCore(); void renderMain(); void deinitMain(std::thread & worker); diff --git a/examples/waver/index-tmpl.html b/examples/waver/index-tmpl.html index 8747522..eb2a9e3 100644 --- a/examples/waver/index-tmpl.html +++ b/examples/waver/index-tmpl.html @@ -89,6 +89,7 @@ } function checkSharedArrayBuffer() { + return true; try { var a = SharedArrayBuffer; } catch (e) { diff --git a/examples/waver/main.cpp b/examples/waver/main.cpp index f98b11b..5dff56b 100644 --- a/examples/waver/main.cpp +++ b/examples/waver/main.cpp @@ -297,7 +297,11 @@ int main(int argc, char** argv) { return false; } - worker = initMain(); +#ifdef __EMSCRIPTEN__ + initMain(); +#else + worker = initMainAndRunCore(); +#endif isInitialized = true; @@ -319,6 +323,9 @@ int main(int argc, char** argv) { renderMain(); updateMain(); +#ifdef __EMSCRIPTEN__ + updateCore(); +#endif ImGui_EndFrame(window);