#pragma once
#include <cmath>
#include <emscripten/threading.h>
#include <emscripten/val.h>
#include <emscripten/wasm_worker.h>

emscripten::val make_blank_promise();

constexpr static float SIGNAL_DBFS_FLOOR = 1e-10f;
constexpr static float SIGNAL_DBFS_FLOOR_SQUARED =
    SIGNAL_DBFS_FLOOR * SIGNAL_DBFS_FLOOR;

inline float signalValueToDbFS(float value) {
  return 20.0f * std::log10(std::fmax(std::fabs(value), SIGNAL_DBFS_FLOOR));
}

// assumes value is already squared
inline float signalSquareValueToDbFS(float value) {
  return 10.0f * std::log10(std::fmax(value, SIGNAL_DBFS_FLOOR_SQUARED));
}
struct emscripten_lock_raii {
  emscripten_lock_t &lock;
  emscripten_lock_raii(emscripten_lock_t &lock) : lock(lock) {
    if (emscripten_is_main_browser_thread()) {
      emscripten_lock_busyspin_waitinf_acquire(&lock);
    } else {
      emscripten_lock_waitinf_acquire(&lock);
    }
  }
  ~emscripten_lock_raii() { emscripten_lock_release(&lock); }
};
