From f886995295a496c8451ac0b30175b615f002259e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=A4rkl?= Date: Sat, 3 Aug 2019 14:26:54 +0200 Subject: [PATCH] Message Box on Session Quit --- gui/include/streamsession.h | 5 +++++ gui/include/streamwindow.h | 1 + gui/src/main.cpp | 2 ++ gui/src/streamsession.cpp | 37 ++++++++++++++++++++++++++++-------- gui/src/streamwindow.cpp | 14 +++++++++++++- lib/include/chiaki/session.h | 9 +++++---- lib/src/ctrl.c | 2 +- lib/src/session.c | 31 ++++++++++++++++++++++++++++++ 8 files changed, 87 insertions(+), 14 deletions(-) diff --git a/gui/include/streamsession.h b/gui/include/streamsession.h index 5701739..3f0c238 100644 --- a/gui/include/streamsession.h +++ b/gui/include/streamsession.h @@ -75,11 +75,13 @@ class StreamSession : public QObject void PushAudioFrame(int16_t *buf, size_t samples_count); void PushVideoSample(uint8_t *buf, size_t buf_size); + void Event(ChiakiEvent *event); public: explicit StreamSession(const StreamSessionConnectInfo &connect_info, QObject *parent = nullptr); ~StreamSession(); + void Start(); void Stop(); #if CHIAKI_GUI_ENABLE_QT_GAMEPAD @@ -91,6 +93,7 @@ class StreamSession : public QObject signals: void CurrentImageUpdated(); + void SessionQuit(ChiakiQuitReason reason); private slots: #if CHIAKI_GUI_ENABLE_QT_GAMEPAD @@ -99,4 +102,6 @@ class StreamSession : public QObject void SendFeedbackState(); }; +Q_DECLARE_METATYPE(ChiakiQuitReason) + #endif // CHIAKI_STREAMSESSION_H diff --git a/gui/include/streamwindow.h b/gui/include/streamwindow.h index a3d5ac7..fc8996d 100644 --- a/gui/include/streamwindow.h +++ b/gui/include/streamwindow.h @@ -46,6 +46,7 @@ class StreamWindow: public QMainWindow private slots: void FramesAvailable(); + void SessionQuit(ChiakiQuitReason reason); }; #endif // CHIAKI_GUI_STREAMWINDOW_H diff --git a/gui/src/main.cpp b/gui/src/main.cpp index 6afa9db..f539dca 100644 --- a/gui/src/main.cpp +++ b/gui/src/main.cpp @@ -22,6 +22,8 @@ int RunMain(QApplication &app); int main(int argc, char *argv[]) { + qRegisterMetaType(); + QApplication app(argc, argv); QApplication::setApplicationName("Chiaki"); diff --git a/gui/src/streamsession.cpp b/gui/src/streamsession.cpp index 9150c09..a14b0be 100644 --- a/gui/src/streamsession.cpp +++ b/gui/src/streamsession.cpp @@ -32,6 +32,7 @@ static void AudioFrameCb(int16_t *buf, size_t samples_count, void *user); static void VideoSampleCb(uint8_t *buf, size_t buf_size, void *user); +static void EventCb(ChiakiEvent *event, void *user); StreamSession::StreamSession(const StreamSessionConnectInfo &connect_info, QObject *parent) : QObject(parent) @@ -93,14 +94,7 @@ StreamSession::StreamSession(const StreamSessionConnectInfo &connect_info, QObje chiaki_session_set_audio_frame_cb(&session, AudioFrameCb, this); chiaki_session_set_video_sample_cb(&session, VideoSampleCb, this); - - err = chiaki_session_start(&session); - if(err != CHIAKI_ERR_SUCCESS) - { - chiaki_session_fini(&session); - throw ChiakiException("Chiaki Session Start failed"); - } - + chiaki_session_set_event_cb(&session, EventCb, this); #if CHIAKI_GUI_ENABLE_QT_GAMEPAD connect(QGamepadManager::instance(), &QGamepadManager::connectedGamepadsChanged, this, &StreamSession::UpdateGamepads); @@ -117,6 +111,16 @@ StreamSession::~StreamSession() chiaki_session_fini(&session); } +void StreamSession::Start() +{ + ChiakiErrorCode err = chiaki_session_start(&session); + if(err != CHIAKI_ERR_SUCCESS) + { + chiaki_session_fini(&session); + throw ChiakiException("Chiaki Session Start failed"); + } +} + void StreamSession::Stop() { chiaki_session_stop(&session); @@ -247,11 +251,22 @@ void StreamSession::PushVideoSample(uint8_t *buf, size_t buf_size) video_decoder.PutFrame(buf, buf_size); } +void StreamSession::Event(ChiakiEvent *event) +{ + switch(event->type) + { + case CHIAKI_EVENT_QUIT: + emit SessionQuit(event->quit.reason); + break; + } +} + class StreamSessionPrivate { public: static void PushAudioFrame(StreamSession *session, int16_t *buf, size_t samples_count) { session->PushAudioFrame(buf, samples_count); } static void PushVideoSample(StreamSession *session, uint8_t *buf, size_t buf_size) { session->PushVideoSample(buf, buf_size); } + static void Event(StreamSession *session, ChiakiEvent *event) { session->Event(event); } }; static void AudioFrameCb(int16_t *buf, size_t samples_count, void *user) @@ -264,4 +279,10 @@ static void VideoSampleCb(uint8_t *buf, size_t buf_size, void *user) { auto session = reinterpret_cast(user); StreamSessionPrivate::PushVideoSample(session, buf, buf_size); +} + +static void EventCb(ChiakiEvent *event, void *user) +{ + auto session = reinterpret_cast(user); + StreamSessionPrivate::Event(session, event); } \ No newline at end of file diff --git a/gui/src/streamwindow.cpp b/gui/src/streamwindow.cpp index 7c40080..2aee360 100644 --- a/gui/src/streamwindow.cpp +++ b/gui/src/streamwindow.cpp @@ -33,10 +33,14 @@ StreamWindow::StreamWindow(const StreamSessionConnectInfo &connect_info, QWidget session = new StreamSession(connect_info, this); + connect(session, &StreamSession::SessionQuit, this, &StreamWindow::SessionQuit); + connect(session->GetVideoDecoder(), &VideoDecoder::FramesAvailable, this, &StreamWindow::FramesAvailable); FramesAvailable(); grabKeyboard(); + + session->Start(); } StreamWindow::~StreamWindow() @@ -58,7 +62,7 @@ void StreamWindow::keyReleaseEvent(QKeyEvent *event) session->HandleKeyboardEvent(event); } -void StreamWindow::closeEvent(QCloseEvent *event) +void StreamWindow::closeEvent(QCloseEvent *) { session->Stop(); } @@ -78,3 +82,11 @@ void StreamWindow::FramesAvailable() SetImage(prev); } } + +void StreamWindow::SessionQuit(ChiakiQuitReason reason) +{ + if(reason == CHIAKI_QUIT_REASON_STOPPED) + return; + QMessageBox::critical(this, tr("Session has quit"), tr("Chiaki Session has quit:") + "\n" + chiaki_quit_reason_string(reason)); + close(); +} diff --git a/lib/include/chiaki/session.h b/lib/include/chiaki/session.h index 3318be2..dae1df9 100644 --- a/lib/include/chiaki/session.h +++ b/lib/include/chiaki/session.h @@ -63,9 +63,12 @@ typedef enum { CHIAKI_QUIT_REASON_SESSION_REQUEST_RP_IN_USE, CHIAKI_QUIT_REASON_SESSION_REQUEST_RP_CRASH, CHIAKI_QUIT_REASON_CTRL_UNKNOWN, - CHIAKI_QUIT_REASON_CTRL_CONNECTION_REFUSED + CHIAKI_QUIT_REASON_CTRL_CONNECTION_REFUSED, + CHIAKI_QUIT_REASON_STREAM_CONNECTION_UNKNOWN } ChiakiQuitReason; +CHIAKI_EXPORT const char *chiaki_quit_reason_string(ChiakiQuitReason reason); + typedef struct chiaki_quit_event_t { ChiakiQuitReason reason; @@ -78,8 +81,7 @@ typedef struct chiaki_audio_stream_info_event_t typedef enum { - CHIAKI_EVENT_QUIT, - CHIAKI_EVENT_AUDIO_STREAM_INFO + CHIAKI_EVENT_QUIT } ChiakiEventType; typedef struct chiaki_event_t @@ -88,7 +90,6 @@ typedef struct chiaki_event_t union { ChiakiQuitEvent quit; - ChiakiAudioStreamInfoEvent audio_stream_info; }; } ChiakiEvent; diff --git a/lib/src/ctrl.c b/lib/src/ctrl.c index 53e2cbf..8d6bf74 100644 --- a/lib/src/ctrl.c +++ b/lib/src/ctrl.c @@ -326,7 +326,7 @@ static ChiakiErrorCode ctrl_connect(ChiakiCtrl *ctrl) { int errsv = errno; CHIAKI_LOGE(&session->log, "Ctrl connect failed: %s", strerror(errsv)); - ctrl_failed(ctrl, errsv == ECONNREFUSED ? CHIAKI_QUIT_REASON_SESSION_REQUEST_CONNECTION_REFUSED : CHIAKI_QUIT_REASON_CTRL_UNKNOWN); + ctrl_failed(ctrl, errsv == ECONNREFUSED ? CHIAKI_QUIT_REASON_CTRL_CONNECTION_REFUSED : CHIAKI_QUIT_REASON_CTRL_UNKNOWN); close(sock); return CHIAKI_ERR_NETWORK; } diff --git a/lib/src/session.c b/lib/src/session.c index e450acc..42329ad 100644 --- a/lib/src/session.c +++ b/lib/src/session.c @@ -43,6 +43,31 @@ #define SESSION_EXPECT_TIMEOUT_MS 5000 +CHIAKI_EXPORT const char *chiaki_quit_reason_string(ChiakiQuitReason reason) +{ + switch(reason) + { + case CHIAKI_QUIT_REASON_STOPPED: + return "Stopped"; + case CHIAKI_QUIT_REASON_SESSION_REQUEST_UNKNOWN: + return "Unknown Session Request Error"; + case CHIAKI_QUIT_REASON_SESSION_REQUEST_CONNECTION_REFUSED: + return "Connection Refused in Session Request"; + case CHIAKI_QUIT_REASON_SESSION_REQUEST_RP_IN_USE: + return "Remote Play on Console is already in use"; + case CHIAKI_QUIT_REASON_SESSION_REQUEST_RP_CRASH: + return "Remote Play on Console has crashed"; + case CHIAKI_QUIT_REASON_CTRL_UNKNOWN: + return "Unknown Ctrl Error"; + case CHIAKI_QUIT_REASON_CTRL_CONNECTION_REFUSED: + return "Connection Refused in Ctrl"; + case CHIAKI_QUIT_REASON_STREAM_CONNECTION_UNKNOWN: + return "Unknown Error in Stream Connection"; + case CHIAKI_QUIT_REASON_NONE: + default: + return "Unknown"; + } +} static void *session_thread_func(void *arg); @@ -291,9 +316,15 @@ static void *session_thread_func(void *arg) err = chiaki_stream_connection_run(&session->stream_connection); chiaki_mutex_lock(&session->state_mutex); if(err != CHIAKI_ERR_SUCCESS && err != CHIAKI_ERR_CANCELED) + { CHIAKI_LOGE(&session->log, "StreamConnection run failed"); + session->quit_reason = CHIAKI_QUIT_REASON_STREAM_CONNECTION_UNKNOWN; + } else + { CHIAKI_LOGI(&session->log, "StreamConnection completed successfully"); + session->quit_reason = CHIAKI_QUIT_REASON_STOPPED; + } chiaki_video_receiver_free(session->video_receiver); session->video_receiver = NULL;