From 87deab83234505bbc78ca71dac0ceed8df9ecc5d Mon Sep 17 00:00:00 2001
From: silas <s.developer@4-dc.de>
Date: Fri, 15 Jan 2021 11:59:43 +0100
Subject: [PATCH] transfer snapshot

---
 res/gui/fragments/PageStreaming.qml     |  2 ++
 res/gui/main.qml                        |  2 ++
 src/API/NetworkAPI.cpp                  |  7 +++---
 src/API/NetworkAPI.h                    |  1 +
 src/MediaProcessing/VideoTranscoder.cpp |  1 -
 src/Networking/NetworkSinkHandler.cpp   | 10 ++++----
 src/Networking/StreamThread.cpp         | 33 ++++++++++++++++---------
 src/Networking/StreamThread.h           |  4 +--
 8 files changed, 38 insertions(+), 22 deletions(-)

diff --git a/res/gui/fragments/PageStreaming.qml b/res/gui/fragments/PageStreaming.qml
index 68e84e5..877a344 100644
--- a/res/gui/fragments/PageStreaming.qml
+++ b/res/gui/fragments/PageStreaming.qml
@@ -5,6 +5,8 @@ Page {
     width: 772
     height: 460
 
+    property alias togglePlayPauseBtn: playPauseBtn
+
     header: Label {
         font.pixelSize: Qt.application.font.pixelSize * 2
         text: qsTr("Streaming Control Panel")
diff --git a/res/gui/main.qml b/res/gui/main.qml
index fa02f0d..5c5ca02 100644
--- a/res/gui/main.qml
+++ b/res/gui/main.qml
@@ -143,6 +143,8 @@ ApplicationWindow {
             function onStreamStarted() {
                 pageStreaming.enabled = true
                 pageStreamingBtn.enabled = true
+                pageStreaming.togglePlayPauseBtn.icon.name = "media-playback-pause"
+                pageStreaming.togglePlayPauseBtn.icon.source = "qrc:/gui/icons/pause.svg"
                 swipeView.setCurrentIndex(2)
             }
 
diff --git a/src/API/NetworkAPI.cpp b/src/API/NetworkAPI.cpp
index 400eb73..631c840 100644
--- a/src/API/NetworkAPI.cpp
+++ b/src/API/NetworkAPI.cpp
@@ -125,8 +125,8 @@ bool NetworkAPI::startSource(QUrl inputFileUrl, QString address) {
                      << QDir::toNativeSeparators(inputFileUrl.toLocalFile());
             streamThread = new StreamThread(target, QDir::toNativeSeparators(inputFileUrl.toLocalFile()).toStdString());
             streamConnecting();
-            connect(streamThread, &StreamThread::stopped, this, &NetworkAPI::streamThreadFinished, Qt::QueuedConnection);
-            connect(streamThread, &StreamThread::connected, [&]() {
+            streamThreadCon1 = connect(streamThread, &StreamThread::stopped, this, &NetworkAPI::streamThreadFinished, Qt::QueuedConnection);
+            streamThreadCon2 = connect(streamThread, &StreamThread::connected, [&]() {
                 streamStarted();
             });
             streamThread->start();
@@ -212,7 +212,8 @@ qint64 NetworkAPI::getPlaybackPosition() {
 
 void NetworkAPI::streamThreadFinished() {
     streamEnded();
-    QThread::msleep(5);
+    disconnect(streamThreadCon1);
+    disconnect(streamThreadCon2);
     delete streamThread;
     streamThread = nullptr;
 }
diff --git a/src/API/NetworkAPI.h b/src/API/NetworkAPI.h
index 884638e..c265797 100644
--- a/src/API/NetworkAPI.h
+++ b/src/API/NetworkAPI.h
@@ -108,6 +108,7 @@ private:
     NetworkDeviceDirectory *deviceDirectory;
     NetworkInput *sinkInput = nullptr;
     NetworkSinkHandler *sinkHandler;
+    QMetaObject::Connection streamThreadCon1, streamThreadCon2;
 };
 
 #endif //_NETWORKAPI_H
diff --git a/src/MediaProcessing/VideoTranscoder.cpp b/src/MediaProcessing/VideoTranscoder.cpp
index 3b0ac64..370eca4 100644
--- a/src/MediaProcessing/VideoTranscoder.cpp
+++ b/src/MediaProcessing/VideoTranscoder.cpp
@@ -99,7 +99,6 @@ void VideoTranscoder::startTranscoding() {
 
 void VideoTranscoder::stopTranscoding() {
     avPlayer.stop();
-    avTranscoder.stop();
     disconnect(bufferCon1);
     disconnect(bufferCon2);
 }
diff --git a/src/Networking/NetworkSinkHandler.cpp b/src/Networking/NetworkSinkHandler.cpp
index 46e6abe..d645386 100644
--- a/src/Networking/NetworkSinkHandler.cpp
+++ b/src/Networking/NetworkSinkHandler.cpp
@@ -80,17 +80,17 @@ void NetworkSinkHandler::run() {
 
                     disconnect(controlConnection, &QTcpSocket::readyRead, this, &NetworkSinkHandler::handleControl);
 
-                    if (!quitFromNetworkRequest) {
+                    if (quitFromNetworkRequest) {
+                        controlConnection->write(Command::OK);
+                        dataConnection->disconnectFromHost();
+                    } else {
                         controlConnection->write(Command::CLOSEDATA);
-                        if (controlConnection->waitForReadyRead(5000) && controlConnection->readAll() == Command::OK) {
+                        if (controlConnection->waitForReadyRead(5000) && controlConnection->read(1) == Command::OK) {
                             dataConnection->disconnectFromHost();
                         } else {
                             // TODO: Fix crash if stream playback paused
                             dataConnection->close();
                         }
-                    } else {
-                        controlConnection->write(Command::OK);
-                        dataConnection->disconnectFromHost();
                     }
                     delete dataConnection;
                 }
diff --git a/src/Networking/StreamThread.cpp b/src/Networking/StreamThread.cpp
index 7c957aa..9116c50 100644
--- a/src/Networking/StreamThread.cpp
+++ b/src/Networking/StreamThread.cpp
@@ -53,8 +53,10 @@ void StreamThread::run() {
                     running = false;
                 } else {
                     controlConnection->write(Command::CLOSEDATA);
-                    if (controlConnection->waitForReadyRead(2000) && controlConnection->readAll() == Command::OK) {
+                    if (controlConnection->waitForReadyRead(2000) && controlConnection->read(1) == Command::OK) {
                         dataConnection->disconnectFromHost();
+                    } else {
+                        dataConnection->close();
                     }
                 }
                 delete dataConnection;
@@ -71,10 +73,12 @@ void StreamThread::run() {
     controlConnection->disconnectFromHost();
     delete controlConnection;
 
+    running = false;
     stopped();
 }
 
 void StreamThread::writeToOutput() {
+    qDebug() << "[StreamThread] writeToOutput()";
     QByteArray buf = cachedOutput->getEnd1()->readAll();
 //    qDebug() << "writeToOutput():" << buf.size();
     if (!buf.isEmpty() && dataConnection->isOpen()) {
@@ -82,6 +86,14 @@ void StreamThread::writeToOutput() {
         dataConnection->write(buf);
         dataConnection->flush();
     }
+     qDebug() << "[StreamThread] Transcoder" << (transcoder->isPaused() ? "paused" : "not paused") << "checking for incoming control messages";
+    if (transcoder->isPaused() && controlConnection->waitForReadyRead(1)) {
+        if (controlConnection->read(1) == Command::CLOSEDATA) {
+            QtConcurrent::run([&]() {
+                stop();
+            });
+        }
+    }
 //    while (!commandQueue.isEmpty()) {
 //        QByteArray command = commandQueue.takeLast();
 //        controlConnection->write(command);
@@ -146,9 +158,8 @@ void StreamThread::stop() {
         running = false;
         quit();
         while (isRunning()) {
-            QThread::msleep(10);
+            QThread::msleep(1);
         }
-        deleteLater();
     }
 }
 
@@ -170,10 +181,10 @@ PlaybackController *StreamThread::getPlaybackController() {
     return playbackController;
 }
 
-PlaybackController::PlaybackController(QTcpSocket *controlConn, VideoTranscoder *transcoder, StreamThread *parent) :
+PlaybackController::PlaybackController(QTcpSocket *controlConn, VideoTranscoder *transcoder, StreamThread *streamThread) :
         controlConnection(controlConn),
         transcoder(transcoder),
-        parent(parent) {
+        streamThread(streamThread) {
 
 }
 
@@ -185,24 +196,24 @@ void PlaybackController::togglePlayPause() {
     qDebug() << "[PlaybackController] toggling play/pause";
     if (transcoder->isPaused()) {
         transcoder->resume();
-        parent->suspendControlHandling();
+        streamThread->suspendControlHandling();
         controlConnection->write(Command::RESUME);
         if (controlConnection->waitForReadyRead(2000) && controlConnection->read(1) == Command::OK) {
-            parent->resumeControlHandling();
+            streamThread->resumeControlHandling();
             return;
         } else {
-            parent->resumeControlHandling();
+            streamThread->resumeControlHandling();
             return;
         }
     } else {
         transcoder->pause();
-        parent->suspendControlHandling();
+        streamThread->suspendControlHandling();
         controlConnection->write(Command::PAUSE);
         if (controlConnection->waitForReadyRead(2000) && controlConnection->read(1) == Command::OK) {
-            parent->resumeControlHandling();
+            streamThread->resumeControlHandling();
             return;
         } else {
-            parent->resumeControlHandling();
+            streamThread->resumeControlHandling();
             return;
         }
     }
diff --git a/src/Networking/StreamThread.h b/src/Networking/StreamThread.h
index 34eff77..da3a849 100644
--- a/src/Networking/StreamThread.h
+++ b/src/Networking/StreamThread.h
@@ -65,7 +65,7 @@ private:
 class PlaybackController : public QObject {
 Q_OBJECT
 public:
-    PlaybackController(QTcpSocket *controlConn, VideoTranscoder *transcoder, StreamThread *parent);
+    PlaybackController(QTcpSocket *controlConn, VideoTranscoder *transcoder, StreamThread *streamThread);
 
     Q_INVOKABLE qint64 getPlaybackPosition();
 
@@ -88,7 +88,7 @@ signals:
 private:
     VideoTranscoder *transcoder;
     QTcpSocket *controlConnection;
-    StreamThread *parent;
+    StreamThread *streamThread;
 };
 
 
-- 
GitLab