mirror of
https://git.sr.ht/~thestr4ng3r/chiaki
synced 2025-08-14 02:36:51 -07:00
Message Box on Session Quit
This commit is contained in:
parent
8e15f498c2
commit
f886995295
8 changed files with 87 additions and 14 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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");
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
|
@ -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();
|
||||||
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue