Skip to content

Commit

Permalink
Server - breaking change - improve port detection and initialisation
Browse files Browse the repository at this point in the history
Most ports are now auto-allocated in a free port range (51234+). The next free port is chosen for each service to avoid conflict with existing services running on a given machine.

This is with exception of the following ports:

OSC cues port - this is now listening on port 4560
Erlang router - this is now listening on port 4561
Websockets    - this is now listening on port 4562

Ports 4560, 4561 and 4562 are currently unregistered on the Iana Service Name and Transport Protocol Port Number Registry:

https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml

Additionally, in the top-level config site it’s possible to pair the following ports:

* gui-send-to-server (to server_listen_to_gui)
* server-send-to-gui (to gui_listen_to_server)
* scsynth-send (to scsynth)

This is achieved by specifying their port number as the symbol :paired. For all ports, it’s possible to specify a port value of :dynamic for which a port number will be automatically found and chosen.

It will be eventually possible to set these ports by editing a file in ~/.sonic-pi/
  • Loading branch information
samaaron committed Apr 30, 2019
1 parent 9cbab63 commit d245d93
Show file tree
Hide file tree
Showing 4 changed files with 203 additions and 219 deletions.
162 changes: 38 additions & 124 deletions app/gui/qt/mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -195,132 +195,34 @@ MainWindow::MainWindow(QApplication &app, bool i18n, QSplashScreen* splash)
clientSock = new QTcpSocket(this);
}


QProcess* determineSendPortNumber = new QProcess();
std::cout << "Discovering port numbers..." << std::endl;
QProcess* determinePortNumbers = new QProcess();
QStringList send_args;
send_args << port_discovery_path << "gui-send-to-server";

determineSendPortNumber->start(ruby_path, send_args);
determineSendPortNumber->waitForFinished();
gui_send_to_server_port = determineSendPortNumber->readAllStandardOutput().trimmed().toInt();

if (gui_send_to_server_port == 0) {
std::cout << "[GUI] - unable to determine GUI->Server send port. Defaulting to 4557:" << std::endl;
gui_send_to_server_port = 4557;
}
send_args << port_discovery_path;
determinePortNumbers->start(ruby_path, send_args);
determinePortNumbers->waitForFinished();
QTextStream stream(determinePortNumbers->readAllStandardOutput().trimmed());
QString line = stream.readLine();
while (!line.isNull()) {
auto parts = line.split(": ");
std::cout << "[GUI] - Port entry " << parts[0].trimmed().toStdString() << " : " << parts[1].trimmed().toStdString() << QString(" : %1").arg(parts[1].trimmed().toInt()).toStdString() << std::endl;
port_map[parts[0].trimmed()] = parts[1].trimmed().toInt();
line = stream.readLine();
};

gui_send_to_server_port = port_map["gui-send-to-server"];
gui_listen_to_server_port = port_map["gui-listen-to-server"];
server_listen_to_gui_port = port_map["server-listen-to-gui"];
server_osc_cues_port = port_map["server-osc-cues"];
server_send_to_gui_port = port_map["server-send-to-gui"];
scsynth_port = port_map["scsynth"];
scsynth_send_port = port_map["scsynth-send"];
erlang_router_port = port_map["erlang-router"];
osc_midi_out_port = port_map["osc-midi-out"];
osc_midi_in_port = port_map["osc-midi-in"];
websocket_port = port_map["websocket"];

oscSender = new OscSender(gui_send_to_server_port);

QProcess* determineListenPortNumber = new QProcess();
QStringList listen_args;
listen_args << port_discovery_path << "gui-listen-to-server";

determineListenPortNumber->start(ruby_path, listen_args);
determineListenPortNumber->waitForFinished();
gui_listen_to_server_port = determineListenPortNumber->readAllStandardOutput().trimmed().toInt();
if (gui_listen_to_server_port == 0) {
std::cout << "[GUI] - unable to determine GUI<-Server listen port. Defaulting to 4558:" << std::endl;
gui_listen_to_server_port = 4558;
}

QProcess* determineServerListenPortNumber = new QProcess();
QStringList server_listen_args;
server_listen_args << port_discovery_path << "server-listen-to-gui";

determineServerListenPortNumber->start(ruby_path, server_listen_args);
determineServerListenPortNumber->waitForFinished();
server_listen_to_gui_port = determineServerListenPortNumber->readAllStandardOutput().trimmed().toInt();
if (server_listen_to_gui_port == 0) {
std::cout << "[GUI] - unable to determine Server<-GUI listen port. Defaulting to 4557:" << std::endl;
server_listen_to_gui_port = 4557;
}

QProcess* determineServerOSCCuesPortNumber = new QProcess();
QStringList server_osc_cue_args;
server_osc_cue_args << port_discovery_path << "server-osc-cues";

determineServerOSCCuesPortNumber->start(ruby_path, server_osc_cue_args);
determineServerOSCCuesPortNumber->waitForFinished();
server_osc_cues_port = determineServerOSCCuesPortNumber->readAllStandardOutput().trimmed().toInt();
if (server_osc_cues_port == 0) {
std::cout << "[GUI] - unable to determine Server OSC cue listen port. Defaulting to 4559:" << std::endl;
server_osc_cues_port = 4559;
}

QProcess* determineServerSendPortNumber = new QProcess();
QStringList server_send_args;
server_send_args << port_discovery_path << "server-send-to-gui";

determineServerSendPortNumber->start(ruby_path, server_send_args);
determineServerSendPortNumber->waitForFinished();
server_send_to_gui_port = determineServerSendPortNumber->readAllStandardOutput().trimmed().toInt();
if (server_send_to_gui_port == 0) {
std::cout << "[GUI] - unable to determine Server->GUI send port. Defaulting to 4558:" << std::endl;
server_send_to_gui_port = 4558;
}

QProcess* determineScsynthPortNumber = new QProcess();
QStringList scsynth_args;
scsynth_args << port_discovery_path << "scsynth";

determineScsynthPortNumber->start(ruby_path, scsynth_args);
determineScsynthPortNumber->waitForFinished();
scsynth_port = determineScsynthPortNumber->readAllStandardOutput().trimmed().toInt();
if (scsynth_port == 0) {
std::cout << "[GUI] - unable to determine scsynth port. Defaulting to 4556:" << std::endl;
scsynth_port = 4556;
}

QProcess* determineScsynthSendPortNumber = new QProcess();
QStringList scsynth_send_args;
scsynth_send_args << port_discovery_path << "scsynth-send";

determineScsynthSendPortNumber->start(ruby_path, scsynth_send_args);
determineScsynthSendPortNumber->waitForFinished();
scsynth_send_port = determineScsynthSendPortNumber->readAllStandardOutput().trimmed().toInt();
if (scsynth_send_port == 0) {
std::cout << "[GUI] - unable to determine scsynth send port. Defaulting to 4556:" << std::endl;
scsynth_send_port = 4556;
}

QProcess* determineErlangRouterPortNumber = new QProcess();
QStringList erlang_router_args;
erlang_router_args << port_discovery_path << "erlang-router";

determineErlangRouterPortNumber->start(ruby_path, erlang_router_args);
determineErlangRouterPortNumber->waitForFinished();
erlang_router_port = determineErlangRouterPortNumber->readAllStandardOutput().trimmed().toInt();
if (erlang_router_port == 0) {
std::cout << "[GUI] - unable to determine Erlang router port. Defaulting to 4560:" << std::endl;
erlang_router_port = 4560;
}


QProcess* determineOscMidiOutPortNumber = new QProcess();
QStringList osc_midi_out_args;
osc_midi_out_args << port_discovery_path << "osc-midi-out";

determineOscMidiOutPortNumber->start(ruby_path, osc_midi_out_args);
determineOscMidiOutPortNumber->waitForFinished();
osc_midi_out_port = determineOscMidiOutPortNumber->readAllStandardOutput().trimmed().toInt();
if (osc_midi_out_port == 0) {
std::cout << "[GUI] - unable to determine OSC MIDI out port. Defaulting to 4561:" << std::endl;
osc_midi_out_port = 4561;
}


QProcess* determineOscMidiInPortNumber = new QProcess();
QStringList osc_midi_in_args;
osc_midi_in_args << port_discovery_path << "osc-midi-in";

determineOscMidiInPortNumber->start(ruby_path, osc_midi_in_args);
determineOscMidiInPortNumber->waitForFinished();
osc_midi_in_port = determineOscMidiInPortNumber->readAllStandardOutput().trimmed().toInt();
if (osc_midi_in_port == 0) {
std::cout << "[GUI] - unable to determine OSC MIDI in port. Defaulting to 4562:" << std::endl;
osc_midi_in_port = 4562;
}

printAsciiArtLogo();

// Clear out old tasks from previous sessions if they still exist
Expand All @@ -330,6 +232,7 @@ MainWindow::MainWindow(QApplication &app, bool i18n, QSplashScreen* splash)

// Throw all stdout into ~/.sonic-pi/log/gui.log
setupLogPathAndRedirectStdOut();

std::cout << "[GUI] - Detecting port numbers..." << std::endl;
std::cout << "[GUI] - GUI OSC listen port "<< gui_listen_to_server_port << std::endl;
checkPort(gui_listen_to_server_port);
Expand All @@ -349,6 +252,8 @@ MainWindow::MainWindow(QApplication &app, bool i18n, QSplashScreen* splash)
checkPort(osc_midi_out_port);
std::cout << "[GUI] - OSC MIDI in port " << osc_midi_in_port << std::endl;
checkPort(osc_midi_in_port);
std::cout << "[GUI] - Websocket port " << websocket_port << std::endl;
checkPort(websocket_port);
std::cout << "[GUI] - Init script completed" << std::endl;

setupTheme();
Expand Down Expand Up @@ -1094,7 +999,16 @@ void MainWindow::startRubyServer(){
}


args << QString("%1").arg(server_listen_to_gui_port) << QString("%1").arg(server_send_to_gui_port) << QString("%1").arg(scsynth_port) << QString("%1").arg(scsynth_send_port) << QString("%1").arg(server_osc_cues_port) << QString("%1").arg(erlang_router_port) << QString("%1").arg(osc_midi_out_port) << QString("%1").arg(osc_midi_in_port);
args <<
QString("%1").arg(server_listen_to_gui_port) <<
QString("%1").arg(server_send_to_gui_port) <<
QString("%1").arg(scsynth_port) <<
QString("%1").arg(scsynth_send_port) <<
QString("%1").arg(server_osc_cues_port) <<
QString("%1").arg(erlang_router_port) <<
QString("%1").arg(osc_midi_out_port) <<
QString("%1").arg(osc_midi_in_port) <<
QString("%1").arg(websocket_port);;
std::cout << "[GUI] - launching Sonic Pi Server:" << std::endl;
if(homeDirWritable) {
serverProcess->setStandardErrorFile(server_error_log_path);
Expand Down
3 changes: 2 additions & 1 deletion app/gui/qt/mainwindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,8 @@ private slots:
QTcpSocket *clientSock;
QFuture<void> osc_thread, server_thread;
int protocol;
int gui_listen_to_server_port, gui_send_to_server_port, server_listen_to_gui_port, server_send_to_gui_port, scsynth_port, scsynth_send_port, server_osc_cues_port, erlang_router_port, osc_midi_out_port, osc_midi_in_port;
QHash<QString, int> port_map;
int gui_listen_to_server_port, gui_send_to_server_port, server_listen_to_gui_port, server_send_to_gui_port, scsynth_port, scsynth_send_port, server_osc_cues_port, erlang_router_port, osc_midi_out_port, osc_midi_in_port, websocket_port;
bool focusMode;
bool startup_error_reported;
bool is_recording;
Expand Down
Loading

0 comments on commit d245d93

Please sign in to comment.