Example #1
0
int main(int argc, char *argv[])
{
        QCoreApplication a(argc, argv);

        //help output
        if(a.arguments().contains("help"))
        {
            MSG("### OSCGrabber HELP ###");
            MSG(" ");
            MSG("The following Arguments are available:");
            MSG("   osc-server-address (address to send osc messages to) [default: 127.0.0.1]");
            MSG("   osc-send-port      (port to send osc messages to) [default: 7000]");
            MSG("   osc-listen-port    (port on wich OSCGrabber is listening for incomming osc messages) [default: 9001]");
            MSG("   udp-send-address   (address to send udp converted messages to) [default: 127.0.0.1]");
            MSG("   udp-send-port      (port to send udp converted messages to) [default: 7799]");
            MSG("   udp-listen-port    (port on wich OSCGrabber is listening for incomming udp messages) [default: 7788]");
            MSG(" ");
            MSG("examaple calls:");
            MSG("   OSCGrabber osc-listen-port 7000 osc-server-address 1.2.3.4");
            MSG(" ");
            MSG("Type 'help' for this message.");
            a.exit();
            return a.exec();
        }

        //read command line arguments
        int oscListenPort = 9001;
        if(a.arguments().contains("osc-listen-port"))
            oscListenPort = a.arguments().at(a.arguments().indexOf(QRegExp("osc-listen-port"))+1).toInt();

        QString oscServerAddress = "127.0.0.1";
        if(a.arguments().contains("osc-server-address"))
            oscServerAddress = a.arguments().at(a.arguments().indexOf(QRegExp("osc-server-address"))+1);

        int oscSendPort = 9000;
        if(a.arguments().contains("osc-send-port"))
            oscSendPort = a.arguments().at(a.arguments().indexOf(QRegExp("osc-send-port"))+1).toInt();

        int udpSendPort = 7799;
        if(a.arguments().contains("udp-send-port"))
            udpSendPort = a.arguments().at(a.arguments().indexOf(QRegExp("udp-send-port"))+1).toInt();

        QString udpSendAddress = "127.0.0.1";
        if(a.arguments().contains("udp-send-address"))
            udpSendAddress = a.arguments().at(a.arguments().indexOf(QRegExp("udp-send-address"))+1);

        int udpListenPort = 7788;
        if(a.arguments().contains("udp-listen-port"))
            udpListenPort = a.arguments().at(a.arguments().indexOf(QRegExp("udp-listen-port"))+1).toInt();


        //start creating the services
        MSG("### [Creating] UDP service at Port "<<udpListenPort);
        MSG("### Sending to "<<udpSendAddress.toStdString());
        QUdpSocket *listenSocket = new QUdpSocket(&a);
        listenSocket->bind(QHostAddress::AnyIPv4, udpListenPort);

        if(!listenSocket->isValid())
        {
            MSG("Couldn't creat udp service at port "<<udpSendPort<<" . Port already occupied?");
            a.exit();
            return 0; //a.exec();
        }

        MSG("### [Launching] OSC Bridge to address "<<oscServerAddress.toStdString()<<" "<<oscListenPort)
        lo::ServerThread * server = new lo::ServerThread(oscListenPort);
        server->start();

        if (!server->is_valid()) { //this check isn't working. why?
            MSG("Couldn't creat osc service listening to port "<<oscListenPort<<" . Port already occupied?");
            a.exit();
            return 0; //a.exec();
        }
        MSG("### --> Listening to Port: "<<oscListenPort);

        lo::string_type address(oscServerAddress.toStdString());
        lo::Address * oscSender = new lo::Address(address, oscSendPort);

//        lo::Address * oscSender = new lo::Address("localhost", oscSendPort);
        MSG("### --> Writing on Port: "<<oscSendPort);


        //####################################################################################
        //####################################################################################
        //  OSC to UDP
        //####################################################################################
        //####################################################################################

        QUdpSocket *senderSocket = new QUdpSocket(&a);

        server->add_method(NULL, NULL, [=](const char *path, const lo::Message& msg)
        {
//            msg.print();
            QString type = QString::fromStdString(msg.types());
            QString data(path);
            data.append("%");
            data.append(type);
            data.append("%");

            for (int i = 0; i < msg.argc(); i++) {
                if(type.at(i) == 'i')
                {
                    data.append(QString::number(msg.argv()[i]->i)+"%");
//                    std::cout<<std::bitset<32>()<<std::endl;
                }
                else if(type.at(i) == 'f')
                    data.append(QString::number(msg.argv()[i]->f)+"%");
                else if(type.at(i) == 's')
                    data.append(QString::fromStdString(&msg.argv()[i]->S)+"%");
            }

            if(-1 == senderSocket->writeDatagram(data.toUtf8(), QHostAddress(udpSendAddress), udpSendPort))
            {
                //qDebug()<<"ERROR: "<<senderSocket->errorString()<<" "<<senderSocket->error();
            }
            else
            {
                //qDebug()<<"From live: "<<data;
                //qDebug()<<"NO ERROR?: "<<senderSocket->errorString()<<" "<<senderSocket->error()<<" valid? "<<senderSocket->isValid();
            }
        });

        //####################################################################################
        //####################################################################################
        //  UDP to OSC
        //####################################################################################
        //####################################################################################

        QObject::connect(listenSocket, &QUdpSocket::readyRead, [=]()
        {
            QByteArray datagram;
            datagram.resize(listenSocket->pendingDatagramSize());
            QHostAddress sender;
            quint16 senderPort;

            listenSocket->readDatagram(datagram.data(), datagram.size(),
                                            &sender, &senderPort);

            //qDebug()<<"Message from: "<<sender<<" "<<senderPort<<" "<<QString::fromUtf8(datagram);

            QStringList splittedData = QString::fromUtf8(datagram).split("%");

            if(splittedData.length() > 1)
            {

                lo::string_type path(splittedData.takeFirst().toStdString());
                QString dataTypes = splittedData.takeFirst();
                lo::Message message;

                for(int i = 0; i<dataTypes.length(); i++)
                {
                    //qDebug()<<"type: "<<dataTypes.at(i);
                    if(dataTypes.at(i) == 'i')
                        message.add(splittedData.at(i).toInt());
                    else if(dataTypes.at(i) == 'f')
                        message.add(splittedData.at(i).toFloat());
                    else if(dataTypes.at(i) == 's')
                    {
                        lo::string_type str(splittedData.at(i).toStdString());
                        message.add(str);
                    }
                }
                //qDebug()<<"Stringlist: "<<splittedData;
                /*qDebug()<<"To live: "<<*/
                oscSender->send(path, message);//<<QString::fromStdString(message.types())<<path._s;

            }
            else
            {
                lo::string_type path(splittedData.takeFirst().toStdString());
                /*qDebug()<<"To live: "<<*/
                oscSender->send(path);
            }

        });

        //clean up services
        QObject::connect(&a, &QCoreApplication::destroyed, [=](){
            server->stop();
            delete server;
        });

        return a.exec();
}