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 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

View file

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

View file

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

View file

@ -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)
@ -265,3 +280,9 @@ static void VideoSampleCb(uint8_t *buf, size_t buf_size, void *user)
auto session = reinterpret_cast<StreamSession *>(user);
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);
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();
}

View file

@ -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;

View file

@ -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;
}

View file

@ -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;