@@ -131,14 +131,10 @@ struct VIPLock { | |||||
// logger | // logger | ||||
//////////////////// | //////////////////// | ||||
enum LogLevel { | |||||
INFO, | |||||
WARN, | |||||
ERROR, | |||||
}; | |||||
extern FILE *gLogFile; | extern FILE *gLogFile; | ||||
void log(LogLevel level, const char *format, ...); | |||||
void info(const char *format, ...); | |||||
void warn(const char *format, ...); | |||||
void fatal(const char *format, ...); | |||||
} // namespace rack | } // namespace rack |
@@ -83,7 +83,7 @@ void RackWidget::saveAsDialog() { | |||||
void RackWidget::savePatch(std::string path) { | void RackWidget::savePatch(std::string path) { | ||||
log(INFO, "Saving patch %s", path.c_str()); | |||||
info("Saving patch %s", path.c_str()); | |||||
FILE *file = fopen(path.c_str(), "w"); | FILE *file = fopen(path.c_str(), "w"); | ||||
if (!file) | if (!file) | ||||
return; | return; | ||||
@@ -98,7 +98,7 @@ void RackWidget::savePatch(std::string path) { | |||||
} | } | ||||
void RackWidget::loadPatch(std::string path) { | void RackWidget::loadPatch(std::string path) { | ||||
log(INFO, "Loading patch %s", path.c_str()); | |||||
info("Loading patch %s", path.c_str()); | |||||
FILE *file = fopen(path.c_str(), "r"); | FILE *file = fopen(path.c_str(), "r"); | ||||
if (!file) { | if (!file) { | ||||
// Exit silently | // Exit silently | ||||
@@ -17,7 +17,7 @@ void audioInit() { | |||||
PaError err = Pa_Initialize(); | PaError err = Pa_Initialize(); | ||||
if (err) { | if (err) { | ||||
log(WARN, "Failed to initialize PortAudio: %s", Pa_GetErrorText(err)); | |||||
warn("Failed to initialize PortAudio: %s", Pa_GetErrorText(err)); | |||||
return; | return; | ||||
} | } | ||||
initialized = true; | initialized = true; | ||||
@@ -244,7 +244,7 @@ void AudioInterface::openDevice(int deviceId, float sampleRate, int blockSize) { | |||||
PaError err; | PaError err; | ||||
const PaDeviceInfo *deviceInfo = Pa_GetDeviceInfo(deviceId); | const PaDeviceInfo *deviceInfo = Pa_GetDeviceInfo(deviceId); | ||||
if (!deviceInfo) { | if (!deviceInfo) { | ||||
log(WARN, "Failed to query audio device"); | |||||
warn("Failed to query audio device"); | |||||
return; | return; | ||||
} | } | ||||
@@ -271,13 +271,13 @@ void AudioInterface::openDevice(int deviceId, float sampleRate, int blockSize) { | |||||
numOutputs == 0 ? NULL : &outputParameters, | numOutputs == 0 ? NULL : &outputParameters, | ||||
sampleRate, blockSize, paNoFlag, paCallback, this); | sampleRate, blockSize, paNoFlag, paCallback, this); | ||||
if (err) { | if (err) { | ||||
log(WARN, "Failed to open audio stream: %s", Pa_GetErrorText(err)); | |||||
warn("Failed to open audio stream: %s", Pa_GetErrorText(err)); | |||||
return; | return; | ||||
} | } | ||||
err = Pa_StartStream(stream); | err = Pa_StartStream(stream); | ||||
if (err) { | if (err) { | ||||
log(WARN, "Failed to start audio stream: %s", Pa_GetErrorText(err)); | |||||
warn("Failed to start audio stream: %s", Pa_GetErrorText(err)); | |||||
return; | return; | ||||
} | } | ||||
// This should go after Pa_StartStream because sometimes it will call the callback once synchronously, and that time it should return early | // This should go after Pa_StartStream because sometimes it will call the callback once synchronously, and that time it should return early | ||||
@@ -299,12 +299,12 @@ void AudioInterface::closeDevice() { | |||||
err = Pa_AbortStream(stream); | err = Pa_AbortStream(stream); | ||||
// err = Pa_StopStream(stream); | // err = Pa_StopStream(stream); | ||||
if (err) { | if (err) { | ||||
log(WARN, "Failed to stop audio stream: %s", Pa_GetErrorText(err)); | |||||
warn("Failed to stop audio stream: %s", Pa_GetErrorText(err)); | |||||
} | } | ||||
err = Pa_CloseStream(stream); | err = Pa_CloseStream(stream); | ||||
if (err) { | if (err) { | ||||
log(WARN, "Failed to close audio stream: %s", Pa_GetErrorText(err)); | |||||
warn("Failed to close audio stream: %s", Pa_GetErrorText(err)); | |||||
} | } | ||||
} | } | ||||
@@ -60,7 +60,7 @@ std::vector<std::string> MidiIO::getDevices() { | |||||
try { | try { | ||||
m = new RtMidiIn(); | m = new RtMidiIn(); | ||||
} catch (RtMidiError &error) { | } catch (RtMidiError &error) { | ||||
log(WARN, "Failed to create RtMidiIn: %s", error.getMessage().c_str()); | |||||
warn("Failed to create RtMidiIn: %s", error.getMessage().c_str()); | |||||
return names; | return names; | ||||
} | } | ||||
@@ -96,14 +96,14 @@ void MidiIO::openDevice(std::string deviceName) { | |||||
} | } | ||||
if (!mw->isPortOpen()) { | if (!mw->isPortOpen()) { | ||||
log(WARN, "Failed to create RtMidiIn: No such device %s", deviceName.c_str()); | |||||
warn("Failed to create RtMidiIn: No such device %s", deviceName.c_str()); | |||||
this->deviceName = ""; | this->deviceName = ""; | ||||
this->id = -1; | this->id = -1; | ||||
return; | return; | ||||
} | } | ||||
} | } | ||||
catch (RtMidiError &error) { | catch (RtMidiError &error) { | ||||
log(WARN, "Failed to create RtMidiIn: %s", error.getMessage().c_str()); | |||||
warn("Failed to create RtMidiIn: %s", error.getMessage().c_str()); | |||||
this->deviceName = ""; | this->deviceName = ""; | ||||
this->id = -1; | this->id = -1; | ||||
return; | return; | ||||
@@ -144,7 +144,7 @@ double MidiIO::getMessage(std::vector<unsigned char> *msg) { | |||||
MidiInWrapper *mw = midiInMap[deviceName]; | MidiInWrapper *mw = midiInMap[deviceName]; | ||||
if (!mw) { | if (!mw) { | ||||
log(WARN, "Device not opened!: %s", deviceName.c_str()); | |||||
warn("Device not opened!: %s", deviceName.c_str()); | |||||
return 0; | return 0; | ||||
} | } | ||||
@@ -176,7 +176,7 @@ void MidiIO::close() { | |||||
MidiInWrapper *mw = midiInMap[deviceName]; | MidiInWrapper *mw = midiInMap[deviceName]; | ||||
if (!mw || id < 0) { | if (!mw || id < 0) { | ||||
//log(WARN, "Trying to close already closed device!"); | |||||
//warn("Trying to close already closed device!"); | |||||
return; | return; | ||||
} | } | ||||
@@ -279,7 +279,7 @@ void dropCallback(GLFWwindow *window, int count, const char **paths) { | |||||
} | } | ||||
void errorCallback(int error, const char *description) { | void errorCallback(int error, const char *description) { | ||||
log(WARN, "GLFW error %d: %s", error, description); | |||||
warn("GLFW error %d: %s", error, description); | |||||
} | } | ||||
void renderGui() { | void renderGui() { | ||||
@@ -446,7 +446,7 @@ void guiRun() { | |||||
std::this_thread::sleep_for(std::chrono::duration<double>(minTime - frameTime)); | std::this_thread::sleep_for(std::chrono::duration<double>(minTime - frameTime)); | ||||
} | } | ||||
endTime = glfwGetTime(); | endTime = glfwGetTime(); | ||||
// log(INFO, "%lf fps", 1.0 / (endTime - startTime)); | |||||
// info("%lf fps", 1.0 / (endTime - startTime)); | |||||
} | } | ||||
} | } | ||||
@@ -519,10 +519,10 @@ bool guiIsMaximized() { | |||||
Font::Font(const std::string &filename) { | Font::Font(const std::string &filename) { | ||||
handle = nvgCreateFont(gVg, filename.c_str(), filename.c_str()); | handle = nvgCreateFont(gVg, filename.c_str(), filename.c_str()); | ||||
if (handle >= 0) { | if (handle >= 0) { | ||||
log(INFO, "Loaded font %s", filename.c_str()); | |||||
info("Loaded font %s", filename.c_str()); | |||||
} | } | ||||
else { | else { | ||||
log(WARN, "Failed to load font %s", filename.c_str()); | |||||
warn("Failed to load font %s", filename.c_str()); | |||||
} | } | ||||
} | } | ||||
@@ -545,10 +545,10 @@ std::shared_ptr<Font> Font::load(const std::string &filename) { | |||||
Image::Image(const std::string &filename) { | Image::Image(const std::string &filename) { | ||||
handle = nvgCreateImage(gVg, filename.c_str(), NVG_IMAGE_REPEATX | NVG_IMAGE_REPEATY); | handle = nvgCreateImage(gVg, filename.c_str(), NVG_IMAGE_REPEATX | NVG_IMAGE_REPEATY); | ||||
if (handle > 0) { | if (handle > 0) { | ||||
log(INFO, "Loaded image %s", filename.c_str()); | |||||
info("Loaded image %s", filename.c_str()); | |||||
} | } | ||||
else { | else { | ||||
log(WARN, "Failed to load image %s", filename.c_str()); | |||||
warn("Failed to load image %s", filename.c_str()); | |||||
} | } | ||||
} | } | ||||
@@ -572,10 +572,10 @@ std::shared_ptr<Image> Image::load(const std::string &filename) { | |||||
SVG::SVG(const std::string &filename) { | SVG::SVG(const std::string &filename) { | ||||
handle = nsvgParseFromFile(filename.c_str(), "px", SVG_DPI); | handle = nsvgParseFromFile(filename.c_str(), "px", SVG_DPI); | ||||
if (handle) { | if (handle) { | ||||
log(INFO, "Loaded SVG %s", filename.c_str()); | |||||
info("Loaded SVG %s", filename.c_str()); | |||||
} | } | ||||
else { | else { | ||||
log(WARN, "Failed to load SVG %s", filename.c_str()); | |||||
warn("Failed to load SVG %s", filename.c_str()); | |||||
} | } | ||||
} | } | ||||
@@ -18,17 +18,17 @@ int main(int argc, char* argv[]) { | |||||
#endif | #endif | ||||
if (!gApplicationVersion.empty()) { | if (!gApplicationVersion.empty()) { | ||||
log(INFO, "Rack v%s", gApplicationVersion.c_str()); | |||||
info("Rack v%s", gApplicationVersion.c_str()); | |||||
} | } | ||||
{ | { | ||||
char *cwd = getcwd(NULL, 0); | char *cwd = getcwd(NULL, 0); | ||||
log(INFO, "Current working directory: %s", cwd); | |||||
info("Current working directory: %s", cwd); | |||||
free(cwd); | free(cwd); | ||||
std::string globalDir = assetGlobal(""); | std::string globalDir = assetGlobal(""); | ||||
std::string localDir = assetLocal(""); | std::string localDir = assetLocal(""); | ||||
log(INFO, "Global directory: %s", globalDir.c_str()); | |||||
log(INFO, "Local directory: %s", localDir.c_str()); | |||||
info("Global directory: %s", globalDir.c_str()); | |||||
info("Local directory: %s", localDir.c_str()); | |||||
} | } | ||||
pluginInit(); | pluginInit(); | ||||
@@ -112,13 +112,13 @@ static int loadPlugin(std::string path) { | |||||
HINSTANCE handle = LoadLibrary(libraryFilename.c_str()); | HINSTANCE handle = LoadLibrary(libraryFilename.c_str()); | ||||
if (!handle) { | if (!handle) { | ||||
int error = GetLastError(); | int error = GetLastError(); | ||||
log(WARN, "Failed to load library %s: %d", libraryFilename.c_str(), error); | |||||
warn("Failed to load library %s: %d", libraryFilename.c_str(), error); | |||||
return -1; | return -1; | ||||
} | } | ||||
#elif ARCH_LIN || ARCH_MAC | #elif ARCH_LIN || ARCH_MAC | ||||
void *handle = dlopen(libraryFilename.c_str(), RTLD_NOW); | void *handle = dlopen(libraryFilename.c_str(), RTLD_NOW); | ||||
if (!handle) { | if (!handle) { | ||||
log(WARN, "Failed to load library %s: %s", libraryFilename.c_str(), dlerror()); | |||||
warn("Failed to load library %s: %s", libraryFilename.c_str(), dlerror()); | |||||
return -1; | return -1; | ||||
} | } | ||||
#endif | #endif | ||||
@@ -132,7 +132,7 @@ static int loadPlugin(std::string path) { | |||||
initCallback = (InitCallback) dlsym(handle, "init"); | initCallback = (InitCallback) dlsym(handle, "init"); | ||||
#endif | #endif | ||||
if (!initCallback) { | if (!initCallback) { | ||||
log(WARN, "Failed to read init() symbol in %s", libraryFilename.c_str()); | |||||
warn("Failed to read init() symbol in %s", libraryFilename.c_str()); | |||||
return -2; | return -2; | ||||
} | } | ||||
@@ -144,7 +144,7 @@ static int loadPlugin(std::string path) { | |||||
// Add plugin to list | // Add plugin to list | ||||
gPlugins.push_back(plugin); | gPlugins.push_back(plugin); | ||||
log(INFO, "Loaded plugin %s", libraryFilename.c_str()); | |||||
info("Loaded plugin %s", libraryFilename.c_str()); | |||||
return 0; | return 0; | ||||
} | } | ||||
@@ -277,14 +277,14 @@ void pluginInit() { | |||||
// Load plugins from global directory | // Load plugins from global directory | ||||
std::string globalPlugins = assetGlobal("plugins"); | std::string globalPlugins = assetGlobal("plugins"); | ||||
log(INFO, "Loading plugins from %s", globalPlugins.c_str()); | |||||
info("Loading plugins from %s", globalPlugins.c_str()); | |||||
loadPlugins(globalPlugins); | loadPlugins(globalPlugins); | ||||
// Load plugins from local directory | // Load plugins from local directory | ||||
std::string localPlugins = assetLocal("plugins"); | std::string localPlugins = assetLocal("plugins"); | ||||
if (globalPlugins != localPlugins) { | if (globalPlugins != localPlugins) { | ||||
mkdir(localPlugins.c_str(), 0755); | mkdir(localPlugins.c_str(), 0755); | ||||
log(INFO, "Loading plugins from %s", localPlugins.c_str()); | |||||
info("Loading plugins from %s", localPlugins.c_str()); | |||||
loadPlugins(localPlugins); | loadPlugins(localPlugins); | ||||
} | } | ||||
} | } | ||||
@@ -353,7 +353,7 @@ void pluginRefresh() { | |||||
json_t *errorJ = json_object_get(resJ, "error"); | json_t *errorJ = json_object_get(resJ, "error"); | ||||
if (errorJ) { | if (errorJ) { | ||||
const char *errorStr = json_string_value(errorJ); | const char *errorStr = json_string_value(errorJ); | ||||
log(WARN, "Plugin refresh error: %s", errorStr); | |||||
warn("Plugin refresh error: %s", errorStr); | |||||
} | } | ||||
else { | else { | ||||
json_t *purchasesJ = json_object_get(resJ, "purchases"); | json_t *purchasesJ = json_object_get(resJ, "purchases"); | ||||
@@ -127,7 +127,7 @@ static void settingsFromJson(json_t *rootJ) { | |||||
void settingsSave(std::string filename) { | void settingsSave(std::string filename) { | ||||
log(INFO, "Saving settings %s", filename.c_str()); | |||||
info("Saving settings %s", filename.c_str()); | |||||
FILE *file = fopen(filename.c_str(), "w"); | FILE *file = fopen(filename.c_str(), "w"); | ||||
if (!file) | if (!file) | ||||
return; | return; | ||||
@@ -142,7 +142,7 @@ void settingsSave(std::string filename) { | |||||
} | } | ||||
void settingsLoad(std::string filename) { | void settingsLoad(std::string filename) { | ||||
log(INFO, "Loading settings %s", filename.c_str()); | |||||
info("Loading settings %s", filename.c_str()); | |||||
FILE *file = fopen(filename.c_str(), "r"); | FILE *file = fopen(filename.c_str(), "r"); | ||||
if (!file) | if (!file) | ||||
return; | return; | ||||
@@ -154,7 +154,7 @@ void settingsLoad(std::string filename) { | |||||
json_decref(rootJ); | json_decref(rootJ); | ||||
} | } | ||||
else { | else { | ||||
log(WARN, "JSON parsing error at %s %d:%d %s", error.source, error.line, error.column, error.text); | |||||
warn("JSON parsing error at %s %d:%d %s", error.source, error.line, error.column, error.text); | |||||
} | } | ||||
fclose(file); | fclose(file); | ||||
@@ -161,22 +161,28 @@ void openBrowser(std::string url) { | |||||
FILE *gLogFile = stderr; | FILE *gLogFile = stderr; | ||||
void log(LogLevel level, const char *format, ...) { | |||||
void info(const char *format, ...) { | |||||
va_list args; | va_list args; | ||||
va_start(args, format); | va_start(args, format); | ||||
switch (level) { | |||||
case INFO: | |||||
fprintf(gLogFile, "[info] "); | |||||
break; | |||||
case WARN: | |||||
fprintf(gLogFile, "[warning] "); | |||||
break; | |||||
case ERROR: | |||||
fprintf(gLogFile, "[error] "); | |||||
break; | |||||
default: | |||||
break; | |||||
} | |||||
fprintf(gLogFile, "[info] "); | |||||
vfprintf(gLogFile, format, args); | |||||
fprintf(gLogFile, "\n"); | |||||
va_end(args); | |||||
} | |||||
void warn(const char *format, ...) { | |||||
va_list args; | |||||
va_start(args, format); | |||||
fprintf(gLogFile, "[warn] "); | |||||
vfprintf(gLogFile, format, args); | |||||
fprintf(gLogFile, "\n"); | |||||
va_end(args); | |||||
} | |||||
void fatal(const char *format, ...) { | |||||
va_list args; | |||||
va_start(args, format); | |||||
fprintf(gLogFile, "[fatal] "); | |||||
vfprintf(gLogFile, format, args); | vfprintf(gLogFile, format, args); | ||||
fprintf(gLogFile, "\n"); | fprintf(gLogFile, "\n"); | ||||
va_end(args); | va_end(args); | ||||
@@ -83,7 +83,7 @@ json_t *requestJson(RequestMethod method, std::string url, json_t *dataJ) { | |||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &resText); | curl_easy_setopt(curl, CURLOPT_WRITEDATA, &resText); | ||||
// Perform request | // Perform request | ||||
log(INFO, "Requesting %s", url.c_str()); | |||||
info("Requesting %s", url.c_str()); | |||||
// curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); | // curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); | ||||
CURLcode res = curl_easy_perform(curl); | CURLcode res = curl_easy_perform(curl); | ||||
@@ -131,7 +131,7 @@ bool requestDownload(std::string url, std::string filename, float *progress) { | |||||
curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, xferInfoCallback); | curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, xferInfoCallback); | ||||
curl_easy_setopt(curl, CURLOPT_XFERINFODATA, progress); | curl_easy_setopt(curl, CURLOPT_XFERINFODATA, progress); | ||||
log(INFO, "Downloading %s", url.c_str()); | |||||
info("Downloading %s", url.c_str()); | |||||
CURLcode res = curl_easy_perform(curl); | CURLcode res = curl_easy_perform(curl); | ||||
curl_easy_cleanup(curl); | curl_easy_cleanup(curl); | ||||
@@ -64,7 +64,7 @@ void FramebufferWidget::draw(NVGcontext *vg) { | |||||
if (fbSize.isZero()) | if (fbSize.isZero()) | ||||
return; | return; | ||||
// log(INFO, "rendering framebuffer %f %f", fbSize.x, fbSize.y); | |||||
// info("rendering framebuffer %f %f", fbSize.x, fbSize.y); | |||||
// Delete old one first to free up GPU memory | // Delete old one first to free up GPU memory | ||||
internal->setFramebuffer(NULL); | internal->setFramebuffer(NULL); | ||||
// Create a framebuffer from the main nanovg context. We will draw to this in the secondary nanovg context. | // Create a framebuffer from the main nanovg context. We will draw to this in the secondary nanovg context. | ||||
@@ -8,7 +8,7 @@ void SpriteWidget::draw(NVGcontext *vg) { | |||||
nvgImageSize(vg, spriteImage->handle, &width, &height); | nvgImageSize(vg, spriteImage->handle, &width, &height); | ||||
int stride = width / spriteSize.x; | int stride = width / spriteSize.x; | ||||
if (stride == 0) { | if (stride == 0) { | ||||
log(WARN, "Size of SpriteWidget is %d, %d but spriteSize is %f, %f", width, height, spriteSize.x, spriteSize.y); | |||||
warn("Size of SpriteWidget is %d, %d but spriteSize is %f, %f", width, height, spriteSize.x, spriteSize.y); | |||||
return; | return; | ||||
} | } | ||||
Vec offset = Vec((index % stride) * spriteSize.x, (index / stride) * spriteSize.y); | Vec offset = Vec((index % stride) * spriteSize.x, (index / stride) * spriteSize.y); | ||||