Message Box on Session Quit

This commit is contained in:
Florian Märkl 2019-08-03 14:26:54 +02:00
commit f886995295
No known key found for this signature in database
GPG key ID: 125BC8A5A6A1E857
8 changed files with 87 additions and 14 deletions

View file

@ -75,11 +75,13 @@ class StreamSession : public QObject
void PushAudioFrame(int16_t *buf, size_t samples_count); void PushAudioFrame(int16_t *buf, size_t samples_count);
void PushVideoSample(uint8_t *buf, size_t buf_size); void PushVideoSample(uint8_t *buf, size_t buf_size);
void Event(ChiakiEvent *event);
public: public:
explicit StreamSession(const StreamSessionConnectInfo &connect_info, QObject *parent = nullptr); explicit StreamSession(const StreamSessionConnectInfo &connect_info, QObject *parent = nullptr);
~StreamSession(); ~StreamSession();
void Start();
void Stop(); void Stop();
#if CHIAKI_GUI_ENABLE_QT_GAMEPAD #if CHIAKI_GUI_ENABLE_QT_GAMEPAD
@ -91,6 +93,7 @@ class StreamSession : public QObject
signals: signals:
void CurrentImageUpdated(); void CurrentImageUpdated();
void SessionQuit(ChiakiQuitReason reason);
private slots: private slots:
#if CHIAKI_GUI_ENABLE_QT_GAMEPAD #if CHIAKI_GUI_ENABLE_QT_GAMEPAD
@ -99,4 +102,6 @@ class StreamSession : public QObject
void SendFeedbackState(); void SendFeedbackState();
}; };
Q_DECLARE_METATYPE(ChiakiQuitReason)
#endif // CHIAKI_STREAMSESSION_H #endif // CHIAKI_STREAMSESSION_H

View file

@ -46,6 +46,7 @@ class StreamWindow: public QMainWindow
private slots: private slots:
void FramesAvailable(); void FramesAvailable();
void SessionQuit(ChiakiQuitReason reason);
}; };
#endif // CHIAKI_GUI_STREAMWINDOW_H #endif // CHIAKI_GUI_STREAMWINDOW_H

View file

@ -22,6 +22,8 @@ int RunMain(QApplication &app);
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
qRegisterMetaType<ChiakiQuitReason>();
QApplication app(argc, argv); QApplication app(argc, argv);
QApplication::setApplicationName("Chiaki"); QApplication::setApplicationName("Chiaki");

View file

@ -32,6 +32,7 @@
static void AudioFrameCb(int16_t *buf, size_t samples_count, void *user); 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 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) StreamSession::StreamSession(const StreamSessionConnectInfo &connect_info, QObject *parent)
: 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_audio_frame_cb(&session, AudioFrameCb, this);
chiaki_session_set_video_sample_cb(&session, VideoSampleCb, this); chiaki_session_set_video_sample_cb(&session, VideoSampleCb, this);
chiaki_session_set_event_cb(&session, EventCb, this);
err = chiaki_session_start(&session);
if(err != CHIAKI_ERR_SUCCESS)
{
chiaki_session_fini(&session);
throw ChiakiException("Chiaki Session Start failed");
}
#if CHIAKI_GUI_ENABLE_QT_GAMEPAD #if CHIAKI_GUI_ENABLE_QT_GAMEPAD
connect(QGamepadManager::instance(), &QGamepadManager::connectedGamepadsChanged, this, &StreamSession::UpdateGamepads); connect(QGamepadManager::instance(), &QGamepadManager::connectedGamepadsChanged, this, &StreamSession::UpdateGamepads);
@ -117,6 +111,16 @@ StreamSession::~StreamSession()
chiaki_session_fini(&session); 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() void StreamSession::Stop()
{ {
chiaki_session_stop(&session); chiaki_session_stop(&session);
@ -247,11 +251,22 @@ void StreamSession::PushVideoSample(uint8_t *buf, size_t buf_size)
video_decoder.PutFrame(buf, 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 class StreamSessionPrivate
{ {
public: public:
static void PushAudioFrame(StreamSession *session, int16_t *buf, size_t samples_count) { session->PushAudioFrame(buf, samples_count); } 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 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) 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<StreamSession *>(user); auto session = reinterpret_cast<StreamSession *>(user);
StreamSessionPrivate::PushVideoSample(session, buf, buf_size); StreamSessionPrivate::PushVideoSample(session, buf, buf_size);
}
static void EventCb(ChiakiEvent *event, void *user)
{
auto session = reinterpret_cast<StreamSession *>(user);
StreamSessionPrivate::Event(session, event);
} }

View file

@ -33,10 +33,14 @@ StreamWindow::StreamWindow(const StreamSessionConnectInfo &connect_info, QWidget
session = new StreamSession(connect_info, this); session = new StreamSession(connect_info, this);
connect(session, &StreamSession::SessionQuit, this, &StreamWindow::SessionQuit);
connect(session->GetVideoDecoder(), &VideoDecoder::FramesAvailable, this, &StreamWindow::FramesAvailable); connect(session->GetVideoDecoder(), &VideoDecoder::FramesAvailable, this, &StreamWindow::FramesAvailable);
FramesAvailable(); FramesAvailable();
grabKeyboard(); grabKeyboard();
session->Start();
} }
StreamWindow::~StreamWindow() StreamWindow::~StreamWindow()
@ -58,7 +62,7 @@ void StreamWindow::keyReleaseEvent(QKeyEvent *event)
session->HandleKeyboardEvent(event); session->HandleKeyboardEvent(event);
} }
void StreamWindow::closeEvent(QCloseEvent *event) void StreamWindow::closeEvent(QCloseEvent *)
{ {
session->Stop(); session->Stop();
} }
@ -78,3 +82,11 @@ void StreamWindow::FramesAvailable()
SetImage(prev); 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();
}

View file

@ -63,9 +63,12 @@ typedef enum {
CHIAKI_QUIT_REASON_SESSION_REQUEST_RP_IN_USE, CHIAKI_QUIT_REASON_SESSION_REQUEST_RP_IN_USE,
CHIAKI_QUIT_REASON_SESSION_REQUEST_RP_CRASH, CHIAKI_QUIT_REASON_SESSION_REQUEST_RP_CRASH,
CHIAKI_QUIT_REASON_CTRL_UNKNOWN, CHIAKI_QUIT_REASON_CTRL_UNKNOWN,
CHIAKI_QUIT_REASON_CTRL_CONNECTION_REFUSED CHIAKI_QUIT_REASON_CTRL_CONNECTION_REFUSED,
CHIAKI_QUIT_REASON_STREAM_CONNECTION_UNKNOWN
} ChiakiQuitReason; } ChiakiQuitReason;
CHIAKI_EXPORT const char *chiaki_quit_reason_string(ChiakiQuitReason reason);
typedef struct chiaki_quit_event_t typedef struct chiaki_quit_event_t
{ {
ChiakiQuitReason reason; ChiakiQuitReason reason;
@ -78,8 +81,7 @@ typedef struct chiaki_audio_stream_info_event_t
typedef enum { typedef enum {
CHIAKI_EVENT_QUIT, CHIAKI_EVENT_QUIT
CHIAKI_EVENT_AUDIO_STREAM_INFO
} ChiakiEventType; } ChiakiEventType;
typedef struct chiaki_event_t typedef struct chiaki_event_t
@ -88,7 +90,6 @@ typedef struct chiaki_event_t
union union
{ {
ChiakiQuitEvent quit; ChiakiQuitEvent quit;
ChiakiAudioStreamInfoEvent audio_stream_info;
}; };
} ChiakiEvent; } ChiakiEvent;

View file

@ -326,7 +326,7 @@ static ChiakiErrorCode ctrl_connect(ChiakiCtrl *ctrl)
{ {
int errsv = errno; int errsv = errno;
CHIAKI_LOGE(&session->log, "Ctrl connect failed: %s", strerror(errsv)); 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); close(sock);
return CHIAKI_ERR_NETWORK; return CHIAKI_ERR_NETWORK;
} }

View file

@ -43,6 +43,31 @@
#define SESSION_EXPECT_TIMEOUT_MS 5000 #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); 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); err = chiaki_stream_connection_run(&session->stream_connection);
chiaki_mutex_lock(&session->state_mutex); chiaki_mutex_lock(&session->state_mutex);
if(err != CHIAKI_ERR_SUCCESS && err != CHIAKI_ERR_CANCELED) if(err != CHIAKI_ERR_SUCCESS && err != CHIAKI_ERR_CANCELED)
{
CHIAKI_LOGE(&session->log, "StreamConnection run failed"); CHIAKI_LOGE(&session->log, "StreamConnection run failed");
session->quit_reason = CHIAKI_QUIT_REASON_STREAM_CONNECTION_UNKNOWN;
}
else else
{
CHIAKI_LOGI(&session->log, "StreamConnection completed successfully"); CHIAKI_LOGI(&session->log, "StreamConnection completed successfully");
session->quit_reason = CHIAKI_QUIT_REASON_STOPPED;
}
chiaki_video_receiver_free(session->video_receiver); chiaki_video_receiver_free(session->video_receiver);
session->video_receiver = NULL; session->video_receiver = NULL;