zynaddsubfx

ZynAddSubFX open source synthesizer
Log | Files | Refs | Submodules | LICENSE

commit a18a406965e788bb60e1b6908f22819358bbda7b
parent 4f1db1ebfa6a31cf37633ee470c9af407eb8896d
Author: Johannes Lorenz <j.git@lorenz-ho.me>
Date:   Sat, 25 Mar 2023 00:19:30 +0100

/save_osc: Allow replying savefile

Diffstat:
Msrc/Misc/MiddleWare.cpp | 28+++++++++++++++++++++++-----
Msrc/Tests/SaveOSC.cpp | 35++++++++++++++++++++++++++++++-----
2 files changed, 53 insertions(+), 10 deletions(-)

diff --git a/src/Misc/MiddleWare.cpp b/src/Misc/MiddleWare.cpp @@ -735,7 +735,8 @@ public: // In user language, this is called "saving a master", but we // are saving parameters owned by Master and by MiddleWare // Return 0 if OK, <0 if not - int saveParams(const char *filename, bool osc_format = false) + int saveParams(const char *filename, std::string& savefile, + bool osc_format = false) { int res; if(osc_format) @@ -757,7 +758,6 @@ public: master->copyMasterCbTo(&master2); master2.frozenState = true; - std::string savefile; std::set<std::string> alreadyWritten; rtosc_version m_version = { @@ -1470,12 +1470,30 @@ void save_cb(const char *msg, RtData &d) // the read-only operation writes to the buffer again. Copy to string: const string file = rtosc_argument(msg, 0).s; uint64_t request_time = 0; + bool saveToString = false; if(rtosc_narguments(msg) > 1) request_time = rtosc_argument(msg, 1).t; + if(rtosc_narguments(msg) > 2) + saveToString = rtosc_argument(msg, 2).T; - int res = impl.saveParams(file.c_str(), osc_format); + std::string savefile; + int res = impl.saveParams(file.c_str(), savefile, osc_format); d.broadcast(d.loc, (res == 0) ? "stT" : "stF", file.c_str(), request_time); + + if(saveToString) + { + std::size_t max_each = 768; + std::size_t msgcount = 0; + std::size_t msgmax = (savefile.length()-1) / max_each; + for(std::size_t pos = 0; pos < savefile.length(); pos += max_each) + { + std::size_t len = std::min(max_each, savefile.length() - pos); + d.reply(d.loc, "stiis", + file.c_str(), request_time, msgcount++, msgmax, + savefile.substr(pos, len).c_str()); + } + } } #if defined(__GNUC__) && !defined(__clang__) && !defined(__INTEL_COMPILER) @@ -1647,8 +1665,8 @@ static rtosc::Ports middwareSnoopPortsWithoutNonRtParams = { const char *file = rtosc_argument(msg, 0).s; impl.loadKbm(file, d); rEnd}, - {"save_xmz:s:st", 0, 0, save_cb<false>}, - {"save_osc:s:st", 0, 0, save_cb<true>}, + {"save_xmz:s:st:stT:stF", 0, 0, save_cb<false>}, + {"save_osc:s:st:stT:stF", 0, 0, save_cb<true>}, {"save_xiz:is", 0, 0, rBegin; const int part_id = rtosc_argument(msg,0).i; diff --git a/src/Tests/SaveOSC.cpp b/src/Tests/SaveOSC.cpp @@ -71,6 +71,8 @@ class SaveOSCTest std::string file; uint64_t stamp; bool status; + std::string savefile_content; + int msgnext = 0, msgmax = -1; } recent; std::mutex cb_mutex; using mutex_guard = std::lock_guard<std::mutex>; @@ -83,7 +85,7 @@ class SaveOSCTest rtosc_arg_val_t start_time; rtosc_arg_val_current_time(&start_time); - mw->transmitMsg(osc_path, "st", arg1, start_time.val.t); + mw->transmitMsg(osc_path, "stT", arg1, start_time.val.t); int attempt; for(attempt = 0; attempt < tries; ++attempt) @@ -121,10 +123,33 @@ class SaveOSCTest #ifdef SAVE_OSC_DEBUG fprintf(stderr, "Received message \"%s\".\n", msg); #endif - recent.operation = msg; - recent.file = rtosc_argument(msg, 0).s; - recent.stamp = rtosc_argument(msg, 1).t; - recent.status = rtosc_argument(msg, 2).T; + int args = rtosc_narguments(msg); + + if(args == 3) + { + assert( !strcmp(rtosc_argument_string(msg), "stT") + || !strcmp(rtosc_argument_string(msg), "stF")); + recent.operation = msg; + recent.file = rtosc_argument(msg, 0).s; + recent.stamp = rtosc_argument(msg, 1).t; + recent.status = rtosc_argument(msg, 2).T; + recent.savefile_content.clear(); + recent.msgnext = 0; + recent.msgmax = -1; + } + else + { + assert(!strcmp(rtosc_argument_string(msg), "stiis")); + assert(rtosc_argument(msg, 0).s == recent.file); + assert(rtosc_argument(msg, 1).t == recent.stamp); + if(recent.msgmax == -1) + recent.msgmax = rtosc_argument(msg, 3).i; + else + assert(recent.msgmax == rtosc_argument(msg, 3).i); + assert(recent.msgnext == rtosc_argument(msg, 2).i); + recent.savefile_content += rtosc_argument(msg, 4).s; + ++recent.msgnext; + } } else if(!strcmp(msg, "/damage")) {