20 #include <netinet/in.h> 21 #include <netinet/tcp.h> 22 #include <sys/types.h> 23 #include <sys/socket.h> 25 #include <bluetooth/bluetooth.h> 26 #include <bluetooth/rfcomm.h> 29 #include "jsonrpc_methods.cc" 48 if (s ==
"bypassed") {
60 RpcError(
int code_, Glib::ustring message_): code(code_), message(message_) {}
62 virtual const char*
what()
const throw() {
return message.c_str(); }
72 virtual const Glib::ustring& getString()
const;
81 virtual double getFloat()
const;
90 virtual double getFloat()
const;
91 virtual int getInt()
const;
105 for (iterator i = begin(); i !=
end(); ++i) {
112 throw RpcError(-32602,
"Invalid param -- wrong argument count");
114 return std::vector<JsonValue*>::operator[](i);
125 int n = strtol(str, &endptr, 10);
126 if (*endptr ==
'\0') {
129 istringstream b(str);
143 throw RpcError(-32602,
"Invalid param -- float expected");
147 throw RpcError(-32602,
"Invalid param -- int expected");
151 throw RpcError(-32602,
"Invalid param -- string expected");
155 throw RpcError(-32602,
"Invalid param -- object expected");
158 double JsonFloat::getFloat()
const {
162 double JsonInt::getFloat()
const {
166 int JsonInt::getInt()
const {
170 const Glib::ustring& JsonString::getString()
const {
189 static void openTabBox_(
const char* label);
190 static void openVerticalBox_(
const char* label);
191 static void openVerticalBox1_(
const char* label);
192 static void openVerticalBox2_(
const char* label);
193 static void openHorizontalBox_(
const char* label);
194 static void openHorizontalhideBox_(
const char* label);
195 static void openHorizontalTableBox_(
const char* label);
196 static void openFrameBox_(
const char* label);
197 static void openFlipLabelBox_(
const char* label);
198 static void openpaintampBox_(
const char* label);
199 static void insertSpacer_();
200 static void set_next_flags_(
int flags);
201 static void create_big_rackknob_(
const char *
id,
const char *label);
202 static void create_mid_rackknob_(
const char *
id,
const char *label);
203 static void create_small_rackknob_(
const char *
id,
const char *label);
204 static void create_small_rackknobr_(
const char *
id,
const char *label);
205 static void create_master_slider_(
const char *
id,
const char *label);
206 static void create_feedback_slider_(
const char *
id,
const char *label);
207 static void create_selector_no_caption_(
const char *
id);
208 static void create_selector_(
const char *
id,
const char *label);
209 static void create_simple_meter_(
const char *
id);
210 static void create_simple_c_meter_(
const char *
id,
const char *idl,
const char *label);
211 static void create_spin_value_(
const char *
id,
const char *label);
212 static void create_switch_no_caption_(
const char *sw_type,
const char *
id);
213 static void create_feedback_switch_(
const char *sw_type,
const char *
id);
214 static void create_fload_switch_(
const char *sw_type,
const char *
id,
const char * idf);
215 static void create_switch_(
const char *sw_type,
const char *
id,
const char *label);
216 static void create_wheel_(
const char *
id,
const char *label);
217 static void create_port_display_(
const char *
id,
const char *label);
218 static void create_p_display_(
const char *
id,
const char *idl,
const char *idh);
219 static void create_simple_spin_value_(
const char *
id);
220 static void create_eq_rackslider_no_caption_(
const char *
id);
221 static void closeBox_();
222 static void load_glade_(
const char *data);
223 static void load_glade_file_(
const char *fname);
234 const static int InterfaceVersionMajor = 1;
235 const static int InterfaceVersionMinor = 0;
239 connection(connection_),
242 midi_config_mode(false),
249 if (midi_config_mode) {
250 serv.jack.get_engine().controller_map.set_config_mode(
false, -1);
278 for (
unsigned int i = 0; i <
sizeof(token_range) /
sizeof(token_range[0]); ++i) {
280 *
start = token_range[i].start;
281 *end = token_range[i].end;
288 void CmdConnection::listen(
const Glib::ustring& tp) {
290 if (!find_token(tp, &start, &end)) {
291 cerr <<
"unknown listen token: " << tp << endl;
294 for (
int i = start; i <=
end; i++) {
299 void CmdConnection::unlisten(
const Glib::ustring& tp) {
301 if (!find_token(tp, &start, &end)) {
302 cerr <<
"unknown listen token: " << tp << endl;
305 for (
int i = start; i <=
end; i++) {
386 static inline bool unit_match(
const Glib::ustring&
id,
const Glib::ustring& prefix,
const char** gl) {
387 if (
id.compare(0, prefix.size(), prefix) == 0) {
398 if (strncmp(
id.c_str(), p, n) == 0 &&
id[n] ==
'.') {
407 #define START_FUNCTION_SWITCH(v) switch (v) { 408 #define FUNCTION(n) break; case RPCM_##n: 409 #define PROCEDURE(n) break; case RPNM_##n: 410 #define END_FUNCTION_SWITCH(s) break; default: s; } 418 for (JsonArray::iterator i = params.begin(); i != params.end(); ++i) {
419 const Glib::ustring& attr = (*i)->getString();
420 if (!param.
hasId(attr)) {
422 if (attr ==
"sys.active_mono_plugins") {
423 list<gx_engine::Plugin*> l;
424 serv.jack.get_engine().pluginlist.ordered_mono_list(l,
PGN_MODE_NORMAL);
426 for (list<gx_engine::Plugin*>::iterator i = l.begin(); i != l.end(); ++i) {
427 write_plugin_state(jw, *i);
430 }
else if (attr ==
"sys.active_stereo_plugins") {
431 list<gx_engine::Plugin*> l;
432 serv.jack.get_engine().pluginlist.ordered_stereo_list(l,
PGN_MODE_NORMAL);
434 for (list<gx_engine::Plugin*>::iterator i = l.begin(); i != l.end(); ++i) {
435 write_plugin_state(jw, *i);
438 }
else if (attr ==
"sys.visible_mono_plugins") {
439 list<gx_engine::Plugin*> l;
441 serv.jack.get_engine().pluginlist.ordered_list(l,
false, bits, bits);
443 for (list<gx_engine::Plugin*>::iterator i = l.begin(); i != l.end(); ++i) {
444 write_plugin_state(jw, *i);
447 }
else if (attr ==
"sys.visible_stereo_plugins") {
448 list<gx_engine::Plugin*> l;
450 serv.jack.get_engine().pluginlist.ordered_list(l,
true, bits, bits);
452 for (list<gx_engine::Plugin*>::iterator i = l.begin(); i != l.end(); ++i) {
453 write_plugin_state(jw, *i);
471 serv.jack.get_engine().pluginlist.writeJSON(jw);
475 PluginDef *pd = serv.jack.get_engine().pluginlist.lookup_plugin(params[0]->getString())->get_pdef();
481 pd->
load_ui(bld, params[1]->getInt());
489 for (std::vector<std::string>::iterator i = ul.begin(); i != ul.end(); ++i) {
498 if (params.size() == 0) {
501 write_parameter_state(jw, *i->second);
504 for (JsonArray::iterator i = params.begin(); i != params.end(); ++i) {
505 const Glib::ustring& attr = (*i)->getString();
506 if (param.
hasId(attr)) {
508 write_parameter_state(jw, param[attr]);
517 const Glib::ustring&
id = params[0]->getString();
519 if (param[
id.substr(0,
id.find_last_of(
".")+1)+
"on_off"].getInt().get_value())
520 f = param[id].getFloat().get_value();
529 throw RpcError(-32602,
"Invalid params -- unknown bank");
538 (*i)->writeJSON_remote(jw);
546 throw RpcError(-32602,
"Invalid params -- unknown bank");
568 Glib::ustring newname = params[1]->getString();
578 *serv.settings.
banks.
get_file(params[0]->getString()), params[1]->getString(), params[2]->getString()));
594 s << ifstream(fname.c_str()).rdbuf();
608 serv.jack.get_engine().controller_map.writeJSON(jw);
612 bool mode = serv.jack.get_engine().controller_map.get_config_mode();
615 jw.
write(mode ? serv.jack.get_engine().controller_map.get_current_control() : -1);
620 jw.
write(serv.jack.get_engine().controller_map.size());
630 jw.
write(InterfaceVersionMajor);
631 jw.
write(InterfaceVersionMinor);
632 jw.
write(GX_VERSION);
638 jw.
write_kv(
"frequency", serv.jack.get_engine().tuner.get_freq());
639 jw.
write_kv(
"note", serv.jack.get_engine().tuner.get_note());
649 unsigned int n = params[0]->getInt();
651 for (
unsigned int i = 0; i < n; i++) {
653 jw.
write(maxlevel[i]);
663 jw.
write(serv.jack.get_engine().tuner.get_freq());
672 unsigned int sz = serv.jack.get_engine().oscilloscope.get_size();
673 float *p = serv.jack.get_engine().oscilloscope.get_buffer();
676 for (
unsigned int i = 0; i < sz; i++) {
683 FUNCTION(get_oscilloscope_mul_buffer) {
684 jw.
write(serv.jack.get_engine().oscilloscope.get_mul_buffer());
687 FUNCTION(get_tuner_switcher_active) {
696 jw.
write(serv.jack.get_engine().midiaudiobuffer.jack_load_status());
700 std::vector<gx_system::FileName> dirs;
703 for (std::vector<gx_system::FileName>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
705 jw.
write(i->filename);
706 jw.
write(i->displayname);
713 unsigned int audio_size;
714 int audio_chan, audio_type, audio_form, audio_rate;
717 &audio_type, &audio_form, &audio_rate, &buffer);
722 jw.
write(audio_size);
723 jw.
write(audio_chan);
724 jw.
write(audio_type);
725 jw.
write(audio_form);
726 jw.
write(audio_rate);
728 for (
unsigned int i = 0; i < audio_size*audio_chan; i++) {
737 std::vector<std::string> old_not_found;
741 for (std::vector<std::string>::iterator i = old_not_found.begin(); i != old_not_found.end(); ++i) {
748 FUNCTION(ladspaloader_update_plugins) {
755 serv.jack.get_engine().pluginlist.find_plugin(params[0]->getString())->get_pdef(),
758 for (gx_preset::UnitPresetList::iterator i = presetnames.begin(); i != presetnames.end(); ++i) {
768 if (params.size() != 1) {
769 throw RpcError(-32602,
"Invalid params -- 1 parameter expected");
771 gx_engine::Plugin *p = serv.jack.get_engine().pluginlist.find_plugin(params[0]->getString());
773 throw RpcError(-32602,
"Invalid params -- plugin not found");
781 if (unit_match(i->first, unitprefix, gl)) {
783 write_parameter_state(jw, *i->second);
792 for (JsonArray::iterator i = params.begin(); i != params.end(); ++i) {
793 const Glib::ustring& attr = (*i)->getString();
795 if (!param.
hasId(attr)) {
799 write_parameter_state(jw, param[attr]);
805 const Glib::ustring& prefix = params[0]->getString();
809 if (i->first.compare(0, prefix.size(), prefix) == 0) {
820 const Glib::ustring& preset) {
823 Glib::ustring newbank = bank;
831 throw RpcError(-32001,
"bank not found");
835 throw RpcError(-32001,
"bank is immutable");
837 settings.
save(*pf, preset);
844 Glib::ustring unit = params[0]->getString();
847 throw RpcError(-32602, Glib::ustring::compose(
"Invalid param -- unit %1 unknown", unit));
849 bool stereo = params[2]->getInt();
859 Glib::ustring unit = params[0]->getString();
862 throw RpcError(-32602, Glib::ustring::compose(
"Invalid param -- unit %1 unknown", unit));
864 bool stereo = params[1]->getInt();
880 std::vector<Glib::ustring> neworder;
881 for (JsonArray::iterator i = params.begin(); i != params.end(); ++i) {
882 neworder.push_back((*i)->getString());
888 std::vector<Glib::ustring> neworder;
889 for (JsonArray::iterator i = params.begin()+1; i != params.end(); ++i) {
890 neworder.push_back((*i)->getString());
900 serv.settings.
banks.
get_file(params[0]->getString())->
set_flag(params[1]->getInt(), params[2]->getInt());
905 *serv.settings.
banks.
get_file(params[0]->getString()), params[1]->getString(),
906 *serv.settings.
banks.
get_file(params[2]->getString()), params[3]->getString());
911 *serv.settings.
banks.
get_file(params[0]->getString()), params[1]->getString(),
912 *serv.settings.
banks.
get_file(params[2]->getString()), params[3]->getString(),
913 params[4]->getString());
918 *serv.settings.
banks.
get_file(params[0]->getString()), params[1]->getString(),
919 *serv.settings.
banks.
get_file(params[2]->getString()), params[3]->getString(),
920 params[4]->getString());
928 serv.settings.
save(*serv.settings.
banks.
get_file(params[0]->getString()), params[1]->getString());
934 send_notify_begin(jw,
"set");
936 serv.jack.get_engine().pluginlist.find_plugin(params[0]->getString())->get_pdef(),
937 params[1]->getInt(), params[2]->getString());
945 send_notify_begin(jw,
"set");
947 serv.jack.get_engine().pluginlist.find_plugin(params[0]->getString())->get_pdef(),
948 params[1]->getInt(), params[2]->getString());
955 serv.jack.get_engine().pluginlist.find_plugin(params[0]->getString())->get_pdef(),
956 params[1]->getString());
961 serv.jack.get_engine().pluginlist.find_plugin(params[0]->getString())->get_pdef(),
962 params[1]->getString());
966 midi_config_mode = params[0]->getInt();
967 serv.jack.get_engine().controller_map.set_config_mode(midi_config_mode, params[1]->getInt());
971 serv.jack.get_engine().controller_map.request_midi_value_update();
975 serv.jack.get_engine().controller_map.deleteParameter(
976 serv.settings.
get_param()[params[0]->getString()]);
980 serv.jack.get_engine().controller_map.set_current_control(params[0]->getInt());
984 serv.jack.get_engine().controller_map.modifyCurrent(
985 serv.settings.
get_param()[params[0]->getString()], params[1]->getFloat(),
986 params[2]->getFloat(), params[3]->getInt(), params[4]->getInt());
990 serv.jack.get_engine().controller_map.set_midi_channel(params[0]->getInt());
994 if (params.size() & 1) {
995 throw RpcError(-32602,
"Invalid param -- array length must be even");
998 for (
unsigned int i = 0; i < params.size(); i += 2) {
999 const Glib::ustring& attr = params[i]->getString();
1000 if (param.
hasId(attr)) {
1013 }
else if (p.
isInt()) {
1028 }
else if (dynamic_cast<gx_engine::JConvParameter*>(&p) != 0) {
1033 }
else if (dynamic_cast<gx_engine::SeqParameter*>(&p) != 0) {
1039 throw RpcError(-32602,
"Invalid param -- unknown variable");
1046 send_notify_begin(jw,
"set");
1047 for (
unsigned int i = 0; i < params.size(); i += 2) {
1048 jw.
write(params[i]->getString());
1050 if (dynamic_cast<JsonFloat*>(v)) {
1052 }
else if (dynamic_cast<JsonInt*>(v)) {
1054 }
else if (dynamic_cast<JsonString*>(v)) {
1056 }
else if (dynamic_cast<JsonObject*>(v)) {
1067 serv.settings.
load_preset(pf, params[1]->getString());
1075 PROCEDURE(create_default_scratch_preset) {
1080 serv.jack.
send_midi_cc(params[0]->getInt(),params[1]->getInt(),params[2]->getInt(),params[3]->getInt());
1085 serv.jack.get_engine().check_module_lists();
1089 serv.jack.get_engine().tuner.used_for_display(params[0]->getInt());
1090 serv.jack.get_engine().check_module_lists();
1094 serv.tuner_switcher.
activate(params[0]->getInt());
1102 serv.tuner_switcher.
toggle(params[0]->getInt());
1107 std::string path = params[0]->getString();
1109 send_notify_begin(jw,
"impresp_list");
1111 for (std::vector<gx_system::FileName>::iterator i = l.
get_listing().begin(); i != l.
get_listing().end(); ++i) {
1113 jw.
write(i->filename);
1114 jw.
write(i->displayname);
1117 send_notify_end(jw);
1132 connection->close();
1133 serv.quit_mainloop();
1137 for (JsonArray::iterator i = params.begin(); i != params.end(); ++i) {
1138 CmdConnection::listen((*i)->getString());
1143 for (JsonArray::iterator i = params.begin(); i != params.end(); ++i) {
1144 CmdConnection::unlisten((*i)->getString());
1150 throw RpcError(-32001,
"no current preset");
1156 save_preset(serv.settings, params[0]->getString(), params[1]->getString());
1160 serv.jack.get_engine().tuner.used_for_display(params[0]->getInt());
1164 serv.jack.get_engine().oscilloscope.clear_buffer();
1167 PROCEDURE(set_oscilloscope_mul_buffer) {
1168 serv.jack.get_engine().oscilloscope.set_mul_buffer(
1174 const Glib::ustring&
id = params[0]->getString();
1175 const Glib::ustring& tb = params[1]->getString();
1176 if (!param.
hasId(
id)) {
1178 id, tb, (
bool*)0,
false,
false)->
getBool();
1195 Glib::ustring method;
1204 throw RpcError(-32600,
"Invalid Request");
1217 throw RpcError(-32000,
"by-name parameters not implemented");
1219 throw RpcError(-32600,
"Invalid Request");
1224 throw RpcError(-32600,
"Invalid Request");
1229 throw RpcError(-32600,
"Invalid Request");
1235 throw RpcError(-32601, Glib::ustring::compose(
"Method not found -- '%1'", method));
1239 notify(jw, p, params);
1249 call(jw, p, params);
1263 write_error(jw, code, message);
1267 static bool sendbytes(
int fd,
const std::string& s,
unsigned int *off) {
1268 unsigned int len = s.size() - *off;
1269 int n = write(fd, s.c_str() + *off, len);
1283 int fd = connection->get_socket()->get_fd();
1284 while (outgoing.size() > 0) {
1285 if (!sendbytes(fd, outgoing.front(), ¤t_offset)) {
1288 if (current_offset == 0) {
1289 outgoing.pop_front();
1296 Glib::RefPtr<Gio::Socket> sock = connection->get_socket();
1301 n = sock->receive(buf,
sizeof(buf));
1302 }
catch(Glib::Error& e) {
1303 if (e.code() == Gio::Error::WOULD_BLOCK) {
1306 serv.remove_connection(
this);
1310 serv.remove_connection(
this);
1327 if (outgoing.size() == 0) {
1328 assert(current_offset == 0);
1329 ssize_t len = s.size();
1330 ssize_t n = write(connection->get_socket()->get_fd(), s.c_str(), len);
1334 current_offset = max<ssize_t>(0, n);
1336 outgoing.push_back(s);
1337 Glib::signal_io().connect(
1339 connection->get_socket()->get_fd(), Glib::IO_OUT);
1350 resp = request(jp, jw, !resp) || resp;
1357 resp = request(jp, jw,
false);
1366 "JSON-RPC", Glib::ustring::compose(
"error: %1, request: '%2'",
1369 error_response(jw, -32700,
"Parse Error");
1433 void UiBuilderVirt::openTabBox_(
const char* label) {
1435 jw->
write(
"openTabBox");
1440 void UiBuilderVirt::openVerticalBox_(
const char* label) {
1442 jw->
write(
"openVerticalBox");
1447 void UiBuilderVirt::openVerticalBox1_(
const char* label) {
1449 jw->
write(
"openVerticalBox1");
1454 void UiBuilderVirt::openVerticalBox2_(
const char* label) {
1456 jw->
write(
"openVerticalBox2");
1461 void UiBuilderVirt::openHorizontalhideBox_(
const char* label) {
1463 jw->
write(
"openHorizontalhideBox");
1468 void UiBuilderVirt::openHorizontalTableBox_(
const char* label) {
1470 jw->
write(
"openHorizontalTableBox");
1475 void UiBuilderVirt::openFrameBox_(
const char* label) {
1477 jw->
write(
"openFrameBox");
1482 void UiBuilderVirt::openFlipLabelBox_(
const char* label) {
1484 jw->
write(
"openFlipLabelBox");
1489 void UiBuilderVirt::openpaintampBox_(
const char* label) {
1491 jw->
write(
"openpaintampBox");
1496 void UiBuilderVirt::openHorizontalBox_(
const char* label) {
1498 jw->
write(
"openHorizontalBox");
1503 void UiBuilderVirt::insertSpacer_() {
1505 jw->
write(
"insertSpacer");
1509 void UiBuilderVirt::set_next_flags_(
int flags) {
1511 jw->
write(
"set_next_flags");
1516 void UiBuilderVirt::create_big_rackknob_(
const char *
id,
const char *label) {
1518 jw->
write(
"create_big_rackknob");
1524 void UiBuilderVirt::create_mid_rackknob_(
const char *
id,
const char *label) {
1526 jw->
write(
"create_mid_rackknob");
1532 void UiBuilderVirt::create_small_rackknob_(
const char *
id,
const char *label) {
1534 jw->
write(
"create_small_rackknob");
1540 void UiBuilderVirt::create_small_rackknobr_(
const char *
id,
const char *label) {
1542 jw->
write(
"create_small_rackknobr");
1548 void UiBuilderVirt::create_feedback_slider_(
const char *
id,
const char *label) {
1550 jw->
write(
"create_feedback_slider");
1556 void UiBuilderVirt::create_master_slider_(
const char *
id,
const char *label) {
1558 jw->
write(
"create_master_slider");
1564 void UiBuilderVirt::create_selector_no_caption_(
const char *
id) {
1566 jw->
write(
"create_selector_no_caption");
1571 void UiBuilderVirt::create_selector_(
const char *
id,
const char *label) {
1573 jw->
write(
"create_selector");
1579 void UiBuilderVirt::create_simple_meter_(
const char *
id) {
1581 jw->
write(
"create_simple_meter");
1585 void UiBuilderVirt::create_simple_c_meter_(
const char *
id,
const char *idl,
const char *label) {
1587 jw->
write(
"create_simple_c_meter");
1594 void UiBuilderVirt::create_spin_value_(
const char *
id,
const char *label) {
1596 jw->
write(
"create_spin_value");
1602 void UiBuilderVirt::create_switch_no_caption_(
const char *sw_type,
const char *
id) {
1604 jw->
write(
"create_switch_no_caption");
1610 void UiBuilderVirt::create_feedback_switch_(
const char *sw_type,
const char *
id) {
1612 jw->
write(
"create_feedback_switch");
1618 void UiBuilderVirt::create_fload_switch_(
const char *sw_type,
const char *
id,
const char * idf) {
1620 jw->
write(
"create_fload_switch");
1627 void UiBuilderVirt::create_switch_(
const char *sw_type,
const char *
id,
const char *label) {
1629 jw->
write(
"create_switch");
1636 void UiBuilderVirt::create_wheel_(
const char *
id,
const char *label) {
1638 jw->
write(
"create_wheel");
1644 void UiBuilderVirt::create_port_display_(
const char *
id,
const char *label) {
1646 jw->
write(
"create_port_display");
1652 void UiBuilderVirt::create_p_display_(
const char *
id,
const char *idl,
const char *idh) {
1654 jw->
write(
"create_p_display");
1661 void UiBuilderVirt::create_simple_spin_value_(
const char *
id) {
1663 jw->
write(
"create_simple_spin_value");
1668 void UiBuilderVirt::create_eq_rackslider_no_caption_(
const char *
id) {
1670 jw->
write(
"create_eq_rackslider_no_caption");
1675 void UiBuilderVirt::closeBox_() {
1677 jw->
write(
"closeBox");
1681 void UiBuilderVirt::load_glade_(
const char *data) {
1683 jw->
write(
"load_glade");
1688 void UiBuilderVirt::load_glade_file_(
const char *fname) {
1691 std::istreambuf_iterator<char>(std::ifstream(path.c_str()).rdbuf()),
1692 std::istreambuf_iterator<char>());
1694 jw->
write(
"load_glade");
1705 TunerSwitcher& tunerswitcher_, sigc::slot<void> quit_mainloop_,
1706 const Glib::ustring& host,
int *port)
1707 : Gio::SocketService(),
1708 settings(settings_),
1710 tuner_switcher(tunerswitcher_),
1711 quit_mainloop(quit_mainloop_),
1720 *port = add_any_inet_port();
1722 add_inet_port(*port);
1724 if (host.compare(0, 3,
"BT:") == 0) {
1725 create_bluetooth_sockets(host.substr(3));
1728 sigc::mem_fun(*
this, &GxService::preset_changed));
1729 jack.get_engine().signal_state_change().connect(
1730 sigc::mem_fun(*
this, &GxService::on_engine_state_change));
1731 jack.get_engine().tuner.signal_freq_changed().connect(
1732 sigc::mem_fun(
this, &GxService::on_tuner_freq_changed));
1734 sigc::mem_fun(
this, &GxService::display));
1736 sigc::mem_fun(
this, &GxService::set_display_state));
1738 sigc::mem_fun(
this, &GxService::on_selection_done));
1740 sigc::mem_fun(
this, &GxService::on_presetlist_changed));
1742 sigc::mem_fun(
this, &GxService::on_log_message));
1744 jack.get_engine().controller_map.signal_changed().connect(
1745 sigc::mem_fun(
this, &GxService::on_midi_changed));
1746 jack.get_engine().controller_map.signal_midi_value_changed().connect(
1747 sigc::mem_fun(
this, &GxService::on_midi_value_changed));
1748 jack.get_engine().oscilloscope.size_change.connect(
1749 sigc::mem_fun(
this, &GxService::on_osc_size_changed));
1750 jack.get_engine().oscilloscope.activation.connect(
1751 sigc::mem_fun(
this, &GxService::on_osc_activation));
1752 jack.get_engine().midiaudiobuffer.signal_jack_load_change().connect(
1753 sigc::mem_fun(
this, &GxService::on_jack_load_changed));
1755 sigc::mem_fun(
this, &GxService::on_rack_unit_changed));
1758 sigc::mem_fun(
this, &GxService::on_param_insert_remove));
1760 connect_value_changed_signal(i->second);
1768 for (std::list<CmdConnection*>::iterator i = connection_list.begin(); i != connection_list.end(); ++i) {
1774 static Glib::RefPtr<Gio::Socket> create_one_bluetooth_socket(
1775 const Glib::ustring& device,
int channel) {
1776 sockaddr_rc loc_addr = { 0 };
1777 int s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
1778 loc_addr.rc_family = AF_BLUETOOTH;
1780 bdaddr_t bdaddr = {{0, 0, 0, 0, 0, 0}};
1781 loc_addr.rc_bdaddr = bdaddr;
1782 loc_addr.rc_channel = (uint8_t)channel;
1783 bind(s, (
struct sockaddr *)&loc_addr,
sizeof(loc_addr));
1785 return Gio::Socket::create_from_fd(s);
1788 void GxService::create_bluetooth_sockets(
const Glib::ustring& host) {
1790 if (host.size() > 3) {
1791 channels = host[3] -
'0';
1794 }
else if (channels > 9) {
1798 for (
int i = 1; i <= channels; i++) {
1799 add_socket(create_one_bluetooth_socket(host, i));
1803 Glib::ustring::compose(
1804 _(
"listening on bluetooth socket (%1 channel)"),
1807 #else // !HAVE_BLUEZ 1808 void GxService::create_bluetooth_sockets(
const Glib::ustring& host) {
1811 _(
"Bluetooth not available; rebuild Guitarix with Bluetooth support"));
1813 #endif // HAVE_BLUEZ 1815 void GxService::ladspaloader_write_changes(
gx_system::JsonWriter& jw, std::vector<ChangedPlugin>& changed_plugins) {
1816 serialize_parameter_change(jw);
1819 for (std::vector<ChangedPlugin>::iterator i = changed_plugins.begin(); i != changed_plugins.end(); ++i) {
1821 jw.
write(i->status);
1825 jack.get_engine().pluginlist.lookup_plugin(i->id)->writeJSON(jw);
1835 vec.push_back(ChangedPlugin(pl->
get_pdef()->
id, v));
1840 preg_map =
new std::map<std::string,bool>;
1841 std::vector<ChangedPlugin> changed_plugins;
1842 sigc::connection conn = jack.get_engine().signal_plugin_changed().connect(
1843 sigc::bind(sigc::ptr_fun(add_changed_plugin), sigc::ref(changed_plugins)));
1847 jack.get_engine().ladspaloader_update_plugins();
1852 ladspaloader_write_changes(*jw, changed_plugins);
1858 ladspaloader_write_changes(jws, changed_plugins);
1866 static bool rack_unit_change_blocked =
false;
1867 if (rack_unit_change_blocked) {
1871 rack_unit_change_blocked =
true;
1873 rack_unit_change_blocked =
false;
1883 for (std::vector<std::string>::iterator i = ul.begin(); i != ul.end(); ++i) {
1890 void GxService::on_rack_unit_changed(
bool stereo) {
1899 sigc::mem_fun(
this, &GxService::on_param_value_changed), p)));
1900 }
else if (p->
isBool()) {
1904 sigc::mem_fun(
this, &GxService::on_param_value_changed), p)));
1909 sigc::mem_fun(
this, &GxService::on_param_value_changed), p)));
1914 sigc::mem_fun(
this, &GxService::on_param_value_changed), p)));
1915 }
else if (dynamic_cast<gx_engine::JConvParameter*>(p) != 0) {
1919 sigc::mem_fun(
this, &GxService::on_param_value_changed), p)));
1920 }
else if (dynamic_cast<gx_engine::SeqParameter*>(p) != 0) {
1924 sigc::mem_fun(
this, &GxService::on_param_value_changed), p)));
1930 (*preg_map)[p->
id()] = inserted;
1933 connect_value_changed_signal(p);
1952 }
else if (p->
isBool()) {
1958 }
else if (dynamic_cast<gx_engine::JConvParameter*>(p) != 0) {
1960 }
else if (dynamic_cast<gx_engine::SeqParameter*>(p) != 0) {
1970 void GxService::on_jack_load_changed() {
1984 void GxService::on_osc_size_changed(
unsigned int sz) {
1994 int GxService::on_osc_activation(
bool start) {
2005 void GxService::on_midi_changed() {
2011 jack.get_engine().controller_map.writeJSON(jw);
2015 void GxService::on_midi_value_changed(
int ctl,
int value) {
2028 void GxService::on_log_message(
const string& msg,
GxLogger::MsgType tp,
bool plugged) {
2037 default: tpname =
"unknown";
break;
2046 void GxService::on_selection_done(
bool v) {
2056 void GxService::on_presetlist_changed() {
2075 void GxService::preset_changed() {
2091 void GxService::on_tuner_freq_changed() {
2098 jw.
write(jack.get_engine().tuner.get_freq());
2100 jw.
write(jack.get_engine().tuner.get_note());
2104 void GxService::display(
const Glib::ustring& bank,
const Glib::ustring& preset) {
2126 default: assert(
false);
break;
2132 for (std::list<CmdConnection*>::iterator i = connection_list.begin(); i != connection_list.end(); ++i) {
2134 connection_list.erase(i);
2143 void GxService::save_state() {
2147 static const int min_idle = 10;
2148 static const int max_delay = 30;
2149 time_t now = time(NULL);
2150 if (oldest_unsaved == 0) {
2151 oldest_unsaved = last_change = now;
2152 save_conn = Glib::signal_timeout().connect(sigc::bind_return(sigc::mem_fun(
this, &GxService::save_state),
false), 1000*min_idle);
2155 if (now - oldest_unsaved >= max_delay || now - last_change >= min_idle) {
2159 save_conn.disconnect();
2162 if (oldest_unsaved == 0) {
2163 oldest_unsaved = now;
2165 save_conn.disconnect();
2166 save_conn = Glib::signal_timeout().connect(sigc::bind_return(sigc::mem_fun(
this, &GxService::save_state),
false), 1000*min_idle);
2170 bool GxService::on_incoming(
const Glib::RefPtr<Gio::SocketConnection>& connection,
2171 const Glib::RefPtr<Glib::Object>& source_object) {
2173 connection_list.push_back(cc);
2174 Glib::RefPtr<Gio::Socket> sock = connection->get_socket();
2175 sock->set_blocking(
false);
2177 if (setsockopt(sock->get_fd(), IPPROTO_TCP, TCP_NODELAY, &
flag,
sizeof(int)))
2178 gx_print_error(
"GxMachineRemote",
"setsockopt(IPPROTO_TCP, TCP_NODELAY) failed");
2179 Glib::signal_io().connect(
2181 sock->get_fd(), Glib::IO_IN);
2187 for (std::map<std::string,bool>::iterator i = preg_map->begin(); i != preg_map->end(); ++i) {
2194 for (std::map<std::string,bool>::iterator i = preg_map->begin(); i != preg_map->end(); ++i) {
2203 for (std::list<CmdConnection*>::iterator p = connection_list.begin(); p != connection_list.end(); ++p) {
2214 for (std::list<CmdConnection*>::iterator p = connection_list.begin(); p != connection_list.end(); ++p) {
2225 maxlevel[i] =
max(maxlevel[i], v);
2226 for (std::list<CmdConnection*>::iterator p = connection_list.begin(); p != connection_list.end(); ++p) {
2227 (*p)->update_maxlevel(i, v);
CmdConnection::msg_type end
void write_kv(const char *key, float v)
void gx_print_info(const char *, const std::string &)
CmdConnection::msg_type start
void begin_array(bool nl=false)
void save(PresetFile &pf, const Glib::ustring &name)
UiBuilderVirt(gx_system::JsonWriter *jw, const gx_system::CmdlineOptions *options, PluginDef *pd)
bool rename_preset(PresetFile &pf, const Glib::ustring &oldname, const Glib::ustring &newname)
void make_bank_unique(Glib::ustring &name, std::string *file=0)
bool remove_rack_unit(const std::string &unit, bool stereo)
void readJSON(gx_system::JsonParser &jp)
void writeJSON(gx_system::JsonWriter &jw)
bool is_activated(msg_type n)
map< string, Parameter * >::const_iterator iterator
sigc::signal< void, SwitcherState > & signal_set_state()
void create_default_scratch_preset()
std::vector< std::string > & get_rack_unit_order(bool stereo)
void insert(PresetFile *f)
void(* create_fload_switch)(const char *sw_type, const char *id, const char *idf)
void(* load_glade)(const char *data)
std::string get_builder_filepath(const std::string &basename) const
const std::string & id_on_off() const
virtual bool hasRange() const
void end_array(bool nl=false)
void activate(bool tuner_active)
void send(gx_system::JsonStringWriter &jw)
void(* openFlipLabelBox)(const char *label)
std::vector< PluginPresetEntry > UnitPresetList
static const unsigned int channelcount
bool remove_bank(const Glib::ustring &bank)
PresetFile * get_file(const Glib::ustring &bank) const
static const struct CmdConnection::methodnames * in_word_set(const char *str, size_t len)
void list_subdirs(PathList pl, std::vector< FileName > &dirs)
void(* openTabBox)(const char *label)
void(* create_feedback_switch)(const char *sw_type, const char *id)
void reorder(const std::vector< Glib::ustring > &neworder)
bool set(const Glib::ustring &val) const
virtual void writeJSON(gx_system::JsonWriter &jw) const =0
FileParameter & getFile()
void writeJSON(gx_system::JsonWriter &jw)
void(* create_switch_no_caption)(const char *sw_type, const char *id)
void set_flag(int flag, bool v)
sigc::signal< void, bool > & signal_selection_done()
jack_nframes_t get_jack_bs()
void append(PresetFile &pf, const Glib::ustring &src, PresetFile &pftgt, const Glib::ustring &name)
std::vector< Position >::iterator iterator
bool rename_bank(const Glib::ustring &oldname, Glib::ustring &newname)
bool read_audio(const std::string &filename, unsigned int *audio_size, int *audio_chan, int *audio_type, int *audio_form, int *audio_rate, float **buffer)
virtual float getUpperAsFloat() const
bool get_box_visible() const
void load(gx_system::CmdlineOptions &options, std::vector< std::string > &old_not_found)
void(* create_p_display)(const char *id, const char *idl, const char *idh)
ctrl_type getControlType() const
bool get_opt_autosave() const
void write_key(const char *p, bool nl=false)
void set_jack_insert(bool v)
void update_maxlevel(CmdConnection *cmd=0)
void ladspaloader_update_plugins(gx_system::JsonWriter *jw, CmdConnection *cmd)
void(* load_glade_file)(const char *fname)
bool on_data_out(Glib::IOCondition cond)
virtual double getFloat() const
void writeJSON_remote(JsonWriter &jw)
void gx_print_fatal(const char *, const std::string &)
sigc::signal< void, float > & signal_changed()
sigc::signal< void > & signal_selection_changed()
virtual float getStepAsFloat() const
void gx_print_error(const char *, const std::string &)
static GxLogger & get_logger()
gx_system::PresetFile * bank_insert_new(const Glib::ustring &name)
virtual float getLowerAsFloat() const
void(* create_wheel)(const char *id, const char *label)
void plugin_preset_list_load(const PluginDef *pdef, UnitPresetList &presetnames)
void(* create_selector)(const char *id, const char *label)
const char * engine_state_to_string(gx_engine::GxEngineState s)
void(* openHorizontalBox)(const char *label)
const std::string & id_box_visible() const
virtual gx_system::JsonSubParser getSubParser() const
gx_system::CmdlineOptions & get_options() const
void send_midi_cc(int cc_num, int pgm_num, int bgn, int num)
GxService(gx_preset::GxSettings &settings_, gx_jack::GxJack &jack_, TunerSwitcher &tunerswitcher, sigc::slot< void > quit_mainloop_, const Glib::ustring &host, int *port)
bool hasId(const string &id) const
void send_rack_changed(bool stereo, CmdConnection *cmd)
void readJSON(gx_system::JsonParser &jp)
void plugin_preset_list_save(const PluginDef *pdef, const Glib::ustring &name)
const char * get_typename() const
void(* create_port_display)(const char *id, const char *label)
int get_effect_post_pre() const
RpcError(int code_, Glib::ustring message_)
sigc::signal< void, bool > & signal_changed()
friend class CmdConnection
StringParameter & getString()
void save(gx_system::CmdlineOptions &options)
void insert_rack_unit(const std::string &unit, const std::string &before, bool stereo)
bool convert_preset(PresetFile &pf)
void(* openFrameBox)(const char *label)
void begin_object(bool nl=false)
void plugin_preset_list_sync_set(const PluginDef *pdef, bool factory, const Glib::ustring &name)
void(* create_small_rackknobr)(const char *id, const char *label)
void insert_after(PresetFile &pf, const Glib::ustring &src, PresetFile &pftgt, const Glib::ustring &pos, const Glib::ustring &name)
sigc::signal< void > & signal_presetlist_changed()
void writeJSON_one(gx_system::JsonWriter &jw, Parameter *p)
void(* create_simple_spin_value)(const char *id)
void(* create_simple_meter)(const char *id)
void write_null(bool nl=false)
virtual int getInt() const
JsonValue * operator[](unsigned int i)
void load_preset(PresetFile *pf, const Glib::ustring &name)
msg_signal & signal_message()
void(* create_mid_rackknob)(const char *id, const char *label)
sigc::signal< void, Parameter *, bool > signal_insert_remove()
void(* openVerticalBox2)(const char *label)
virtual void writeJSON(gx_system::JsonWriter &jw) const
void copy_object(JsonWriter &jw)
virtual const char * what() const
FloatParameter * reg_par(const string &id, const string &name, float *var, float std, float lower, float upper, float step)
gx_engine::GxEngineState string_to_engine_state(const std::string &s)
const PathList & get_IR_pathlist() const
sigc::signal< void, bool > & signal_rack_unit_order_changed()
void(* create_small_rackknob)(const char *id, const char *label)
bool on_data_in(Glib::IOCondition cond)
void send_notify_begin(const char *method)
streampos get_streampos()
#define END_FUNCTION_SWITCH(s)
void(* openpaintampBox)(const char *label)
std::vector< FileName > & get_listing()
FloatParameter & getFloat()
void(* openHorizontalhideBox)(const char *label)
static float get(unsigned int channel)
virtual const char * what() const
const Glib::ustring & get_current_name()
void(* create_feedback_slider)(const char *id, const char *label)
void(* create_spin_value)(const char *id, const char *label)
void readJSON(gx_system::JsonParser &jp)
string current_value() const
void append(gx_system::JsonParser &jp)
void(* create_big_rackknob)(const char *id, const char *label)
void(* openHorizontalTableBox)(const char *label)
void(* set_next_flags)(int flags)
virtual float idx_from_id(string v_id)
void load_online_presets()
void set_box_visible(bool v) const
void plugin_preset_list_remove(const PluginDef *pdef, const Glib::ustring &name)
sigc::signal< void, const Glib::ustring & > & signal_changed()
void set_on_off(bool v) const
virtual int idx_from_id(string v_id)
const Glib::ustring & get_value() const
static const char * value_label(const value_pair &vp)
sigc::signal< void, const Glib::ustring &, const Glib::ustring & > & signal_display()
bool set(float val) const
#define START_FUNCTION_SWITCH(v)
void(* create_simple_c_meter)(const char *id, const char *idl, const char *label)
token next(token expect=no_token)
BoolParameter & getBool()
void write(float v, bool nl=false)
void(* create_eq_rackslider_no_caption)(const char *id)
CmdConnection(GxService &serv, const Glib::RefPtr< Gio::SocketConnection > &connection_)
const string & id() const
void insert_before(PresetFile &pf, const Glib::ustring &src, PresetFile &pftgt, const Glib::ustring &pos, const Glib::ustring &name)
void(* create_switch)(const char *sw_type, const char *id, const char *label)
gx_engine::ParamMap & get_param() const
void toggle(bool tuner_active)
bool create_file(const Glib::ustring &name, const std::string &path, int tp, int flags)
const std::string & get_filename() const
void(* openVerticalBox1)(const char *label)
gx_system::PresetFile * bank_insert_content(const Glib::ustring &uri, const std::string content)
bool set(const Glib::RefPtr< Gio::File > &val)
sigc::signal< void, int > & signal_changed()
void(* create_master_slider)(const char *id, const char *label)
jack_nframes_t get_time_is()
void end_object(bool nl=false)
const Glib::ustring & get_current_bank()
void save_to_state(bool preserve_preset=false)
void(* create_selector_no_caption)(const char *id)
void(* openVerticalBox)(const char *label)
virtual const Glib::ustring & getString() const
void plugin_preset_list_set(const PluginDef *pdef, bool factory, const Glib::ustring &name)
void reorder_preset(PresetFile &pf, const std::vector< Glib::ustring > &neworder)
virtual void writeJSON(gx_system::JsonWriter &jw) const
virtual const value_pair * getValueNames() const
void erase_preset(const Glib::ustring &name)