From d8e5a4996f17d560fe8383efe72fe0ee774a86ec Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Sat, 20 Sep 2014 16:28:53 +0200 Subject: Initial multipeer code - untested. --- src/config.ini | 2 +- src/mainwindow.cc | 25 +++++++++++++++++-------- src/mainwindow.h | 9 ++++++--- src/outputstreamer.cc | 22 ++++++++++++++++------ src/outputstreamer.h | 14 +++++++++++--- src/simplertp.cc | 24 ++++++++++++++++++------ 6 files changed, 69 insertions(+), 27 deletions(-) diff --git a/src/config.ini b/src/config.ini index 74631ce..9846903 100644 --- a/src/config.ini +++ b/src/config.ini @@ -16,6 +16,6 @@ addr1="127.0.0.1" port1=10000 ssrc1=42 -addr2="127.0.0.2" +addr2="127.0.0.1" port2=10001 ssrc2=43 \ No newline at end of file diff --git a/src/mainwindow.cc b/src/mainwindow.cc index 5e7a041..8a7c44a 100644 --- a/src/mainwindow.cc +++ b/src/mainwindow.cc @@ -32,18 +32,22 @@ #include MainWindow::MainWindow(QString v4ldev, QString adev, - QHostAddress addr, quint16 port) - : v4l(v4ldev), aih(adev), ostreamer(addr, port), istreamer(addr, port) + OutputStreamer &os, + QList &isl) + : v4l(v4ldev), aih(adev), ostreamer(os), islist(isl) { /* // Self view: connect(&v4l, SIGNAL(newImage(Frame)), this, SLOT(newImage(Frame))); */ - connect(&istreamer, SIGNAL(newImage(Frame)), - this, SLOT(newImage(Frame))); - - connect(&istreamer, SIGNAL(newAudio(Frame)), - &aoh, SLOT(newAudio(Frame))); + QList::iterator i = islist.begin(); + while(i != islist.end()) { + connect(*i, SIGNAL(newImage(Frame)), + this, SLOT(newImage(Frame))); + connect(*i, SIGNAL(newAudio(Frame)), + &aoh, SLOT(newAudio(Frame))); + i++; + } /* connect(&aih, SIGNAL(newAudio(framelist_t)), @@ -68,7 +72,12 @@ MainWindow::MainWindow(QString v4ldev, QString adev, void MainWindow::updateStatus() { size_t ob = ostreamer.getTotal() / 60; - size_t ib = istreamer.getTotal() / 60; + size_t ib = 0; + QList::iterator i = islist.begin(); + while(i != islist.end()) { + ib += (*i)->getTotal() / 60; + i++; + } QString iunit = "b/s"; if(ib > 1024) { diff --git a/src/mainwindow.h b/src/mainwindow.h index 78bd50b..c3c6115 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -30,6 +30,7 @@ #include #include #include +#include #include "v4l.h" #include "audioinputhandler.h" @@ -40,7 +41,9 @@ class MainWindow : public QMainWindow { Q_OBJECT public: - MainWindow(QString v4ldev, QString adev, QHostAddress addr, quint16 port); + MainWindow(QString v4ldev, QString adev, + OutputStreamer &ostreamer, + QList &islist); public slots: void newImage(Frame frame); @@ -51,8 +54,8 @@ private: V4L v4l; AudioInputHandler aih; AudioOutputHandler aoh; - OutputStreamer ostreamer; - InputStreamer istreamer; + OutputStreamer &ostreamer; + QList &islist; QTimer status_timer; }; diff --git a/src/outputstreamer.cc b/src/outputstreamer.cc index e652c7e..e5b7436 100644 --- a/src/outputstreamer.cc +++ b/src/outputstreamer.cc @@ -31,7 +31,7 @@ #define CSRC_V 42 #define CSRC_A 43 -OutputStreamer::OutputStreamer(QHostAddress addr, quint16 port) +OutputStreamer::OutputStreamer() : socket(this) { total = 0; @@ -47,9 +47,6 @@ OutputStreamer::OutputStreamer(QHostAddress addr, quint16 port) res = lrtp_create_profile(lrtp, PROFILE_OPUS, CSRC_A, OPTION_END); if(res != 0) printf("O:lrtp_create_profile (a) err: %d\n", res); - - this->addr = addr; - this->port = port; } OutputStreamer::~OutputStreamer() @@ -66,6 +63,14 @@ OutputStreamer::~OutputStreamer() if(status != LRTP_OK) printf("O:lrtp_close err: %d\n", status); } +void OutputStreamer::addPeer(QHostAddress addr, quint16 port) +{ + Peer peer; + peer.addr = addr; + peer.port = port; + peers.push_back(peer); +} + void OutputStreamer::newImage(Frame frame) { int ret = 0; @@ -115,8 +120,13 @@ void OutputStreamer::newAudio(framelist_t frames) void OutputStreamer::sendPackage(const char *data, size_t size) { - total += size; - socket.writeDatagram(data, (quint64)size, addr, port); + QList::iterator i = peers.begin(); + while(i != peers.end()) { + Peer &peer = *i; + socket.writeDatagram(data, (quint64)size, peer.addr, peer.port); + total += size; + i++; + } } size_t OutputStreamer::getTotal() diff --git a/src/outputstreamer.h b/src/outputstreamer.h index f53d35a..de5d010 100644 --- a/src/outputstreamer.h +++ b/src/outputstreamer.h @@ -29,6 +29,7 @@ #include #include +#include #include @@ -37,9 +38,11 @@ class OutputStreamer : public QObject { Q_OBJECT public: - OutputStreamer(QHostAddress addr, quint16 port); + OutputStreamer(); ~OutputStreamer(); + void addPeer(QHostAddress addr, quint16 port); + size_t getTotal(); public slots: @@ -47,12 +50,17 @@ public slots: void newAudio(framelist_t frames); private: + class Peer { + public: + QHostAddress addr; + quint16 port; + }; + void sendPackage(const char *data, size_t size); struct lrtp_t *lrtp; - QHostAddress addr; - quint16 port; + QList peers; QUdpSocket socket; diff --git a/src/simplertp.cc b/src/simplertp.cc index 964c850..7a56fb3 100644 --- a/src/simplertp.cc +++ b/src/simplertp.cc @@ -50,21 +50,33 @@ int main(int argc, char *argv[]) QString key = settings.value("key").toString(); settings.endGroup(); + OutputStreamer os; + QList islist; + settings.beginGroup("peers"); int num_peers = settings.value("num_peers", "0").toInt(); for(int peer = 1; peer < num_peers + 1; peer++) { - QString addr = settings.value("addr" + QString::number(peer)).toString(); + QString saddr = settings.value("addr" + QString::number(peer)).toString(); quint16 port = settings.value("port" + QString::number(peer)).toInt(); unsigned int ssrc = settings.value("ssrc" + QString::number(peer)).toInt(); + QHostAddress addr(saddr); + os.addPeer(addr, port); + InputStreamer *is = new InputStreamer(addr, port); + islist.push_back(is); // Create } settings.endGroup(); - QHostAddress addr("127.0.0.1"); - quint16 port = 10000; - - MainWindow wnd(v4ldev, adev, addr, port); + MainWindow wnd(v4ldev, adev, os, islist); wnd.show(); - return app.exec(); + int ret = app.exec(); + + QList::iterator i = islist.begin(); + while(i != islist.end()) { + delete *i; + i++; + } + + return ret; } -- cgit v1.2.3