mirror of
https://github.com/ggerganov/ggwave.git
synced 2026-03-18 09:06:07 +08:00
waver : emscripten version use single thread
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> lock(g_buffer.mutex);
|
||||
g_buffer.stateCore.apply(g_buffer.stateUI);
|
||||
}
|
||||
updateCore();
|
||||
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
||||
}
|
||||
|
||||
@@ -5,7 +5,9 @@
|
||||
#include <thread>
|
||||
#include <vector>
|
||||
|
||||
std::thread initMain();
|
||||
std::thread initMainAndRunCore();
|
||||
void initMain();
|
||||
void updateCore();
|
||||
void renderMain();
|
||||
void deinitMain(std::thread & worker);
|
||||
|
||||
|
||||
@@ -89,6 +89,7 @@
|
||||
}
|
||||
|
||||
function checkSharedArrayBuffer() {
|
||||
return true;
|
||||
try {
|
||||
var a = SharedArrayBuffer;
|
||||
} catch (e) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user