diff options
Diffstat (limited to 'client')
-rw-r--r-- | client/decoder.cc | 26 | ||||
-rw-r--r-- | client/decoder.h | 14 | ||||
-rw-r--r-- | client/mainwindow.cc | 16 | ||||
-rw-r--r-- | client/mainwindow.h | 3 | ||||
-rw-r--r-- | client/networksender.cc | 37 | ||||
-rw-r--r-- | client/networksender.h | 6 |
6 files changed, 94 insertions, 8 deletions
diff --git a/client/decoder.cc b/client/decoder.cc index 0ed2032..c5b2876 100644 --- a/client/decoder.cc +++ b/client/decoder.cc @@ -85,8 +85,19 @@ void Decoder::run() sender->start(); newconnection = false; } - senders.front()->pushFrame(frame, false, false); + senders.back()->pushFrame(frame, false, false); } else { + // Remove idle senders + QLinkedList<NetworkSender*>::iterator i; + for (i = senders.begin(); i != senders.end(); i++) { + NetworkSender *ns = *i; + if(ns->queueSize() == 0) { + i = senders.erase(i); + ns->stop(); + delete ns; + } + } + free(frame); newconnection = true; } @@ -129,3 +140,16 @@ bool Decoder::eventFilter(QObject *o, QEvent *e) // standard event processing return false; } + +Status Decoder::status() +{ + Status s; + + QLinkedList<NetworkSender*>::iterator i; + for(i = senders.begin(); i != senders.end(); i++) { + NetworkSender *ns = *i; + s.queue_sizes.push_back(ns->queueSize()); + } + + return s; +} diff --git a/client/decoder.h b/client/decoder.h index 26d86d7..717f10a 100644 --- a/client/decoder.h +++ b/client/decoder.h @@ -31,11 +31,19 @@ #include <QSemaphore> #include <QMutex> -#include <QList> +#include <QLinkedList> +//#include <QList> #include "dv.h" #include "networksender.h" +class Status { +public: + QList<unsigned int> queue_sizes; + unsigned int server_diskspace; + unsigned int server_ping; +}; + class Decoder : public QThread { Q_OBJECT @@ -52,6 +60,8 @@ public: char *pframeAcquire(); void pframeRelease(); + Status status(); + protected: bool eventFilter(QObject *o, QEvent *e); @@ -64,7 +74,7 @@ private: QMutex mutex; - QList<NetworkSender *> senders; + QLinkedList<NetworkSender *> senders; }; #endif/*__MIAV_DECODER_H__*/ diff --git a/client/mainwindow.cc b/client/mainwindow.cc index da2785b..0e7270d 100644 --- a/client/mainwindow.cc +++ b/client/mainwindow.cc @@ -134,6 +134,7 @@ MainWindow::MainWindow(Decoder *d) statusbar = new QStatusBar(this); outerlayout->addWidget(statusbar, 1,0, 1,1); statusbar->showMessage("Ready!"); + startTimer(100); show(); // setWindowState(Qt::WindowFullScreen); @@ -151,6 +152,21 @@ MainWindow::~MainWindow() MIaV::info->log("MIaV is shut down."); } +void MainWindow::timerEvent(QTimerEvent *event) +{ + Status s = decoder->status(); + QString statusmsg; + + for(int cnt = 0; cnt < s.queue_sizes.size(); cnt++) { + QString next; + next.sprintf("(%d)", s.queue_sizes[cnt]); + statusmsg.prepend(next); + } + + statusbar->showMessage(statusmsg); +} + + void MainWindow::about_clicked() { AboutWindow about; diff --git a/client/mainwindow.h b/client/mainwindow.h index b94f5c5..f02d60f 100644 --- a/client/mainwindow.h +++ b/client/mainwindow.h @@ -47,6 +47,9 @@ public: QWidget *getVideoWidget() { return video; } +protected: + void timerEvent(QTimerEvent *event); + public slots: void cpr_clicked(); void clear_clicked(); diff --git a/client/networksender.cc b/client/networksender.cc index 675bdb9..2f1d8b0 100644 --- a/client/networksender.cc +++ b/client/networksender.cc @@ -28,17 +28,28 @@ #include "info.h" +#include <util.h> + NetworkSender::NetworkSender(QString cpr) { ip = "192.168.0.10"; port = 6666; // Connect + // sleep(1); + + fprintf(stderr, "Connect [%p]\n", this); } NetworkSender::~NetworkSender() { // Disconnect + sleep_1_frame(); + sleep_1_frame(); + sleep_1_frame(); + sleep_1_frame(); + + fprintf(stderr, "Disconnect [%p]\n", this); } void NetworkSender::pushFrame(char* framedata, bool freeze, bool snapshot) @@ -54,10 +65,21 @@ void NetworkSender::pushFrame(char* framedata, bool freeze, bool snapshot) semaphore.release(); } +unsigned int NetworkSender::queueSize() +{ + unsigned int sz; + + mutex.lock(); + sz = framelist.size(); + mutex.unlock(); + + return sz; +} + void NetworkSender::run() { while(running) { - semaphore.acquire(); + if(queueSize()) semaphore.acquire(); Frame *frame = NULL; mutex.lock(); @@ -66,8 +88,19 @@ void NetworkSender::run() if(frame) { // TODO: Send it over the network - + sleep_1_frame(); + sleep_1_frame(); + sleep_1_frame(); + sleep_1_frame(); delete frame; } } + terminatesemaphore.release(); // Signal the stop method that the thread has stopped running. +} + +void NetworkSender::stop() +{ + running = false; + semaphore.release(); // Kick the thread active + terminatesemaphore.acquire(); // Wait for the thread to stop } diff --git a/client/networksender.h b/client/networksender.h index 43bb797..a25dfaf 100644 --- a/client/networksender.h +++ b/client/networksender.h @@ -41,11 +41,11 @@ public: NetworkSender(QString cpr); ~NetworkSender(); - void newConnection(QString cpr); void pushFrame(char* frame, bool freeze, bool snapshot); - void endConnection(); + unsigned int queueSize(); void run(); + void stop(); private: QString ip; @@ -54,9 +54,9 @@ private: volatile bool running; QMutex mutex; + QSemaphore terminatesemaphore; QSemaphore semaphore; QLinkedList<Frame*> framelist; - }; #endif/*__MIAV_NETWORKSENDER_H__*/ |