Supercollider / TCP

Supercollider – when receiving messages in TCP – asks for a trailing int containing the length of the message [1]. This has been implemented like this:

QByteArray out = oscMessage( path, data );
qint32 len=out.length();
out.push_front(QOscBase::fromInt32(len));
socket()->write(out);

Sending such a message to puredata, results in an error:

unpackOSC: DataAfterAlignedString: Incorrectly padded string
unpackOSC: Bad message name string: Dropping entire message.

[1] supercollider.svn.sourceforge.net/viewvc/supercollider/trunk/common/build/Help/ServerArchitecture/Server-Architecture.html
Binary Format of Messages / a Message consists of:
using TCP :

int – the length in bytes of the following message.
one Bundle or one Command.

Cast von Klassen

Fehler:‘class QAbstractSocket’ has no member named ‘bind’

if(socket()->socketType()==QAbstractSocket::UdpSocket) {
  (QUdpSocket)(socket())->bind( QHostAddress::Any, port );
}

This way it works:

if(socket()->socketType()==QAbstractSocket::UdpSocket) {
  static_cast<QUdpSocket *>(socket())->bind( QHostAddress::Any, port );
  connect( static_cast<QUdpSocket *>(socket()), SIGNAL( readyRead() ), this, SLOT( readyRead() ) );
}

Zwischenbilanz

  • System Latenz der Netzwerkverarbeitung variert zwischen 0.3-3 ms
  • TCP
    • z.T. von Applikationen nicht unterstützt
    • Verwendung von Urgent (out of band data) / Push flag überwindet Nachteile von TCP.
    • TCP beschränkt kontrollierbar durch QT.
  • Lösungskonzept
    • UDP übertragung mit selbstgeschriebenem Client auf Empfangsseite. Nummerierung der Pakete under Verwendung von OSC-Timestamp. Vorteil: Übertragungsqualität kann von Anwendung erkannt werden.