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:
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"))
{